No se pueden agregar detalles del producto mientras se crea una nueva cotización

Estoy desarrollando una aplicación android para crear una nueva Quote en vTiger (ver 5.4) servidor de CRM.

Fui capaz de generar la nueva cotización pero el product_id y la cantidad que envié para la adición en detalles de la cotización no fueron agregados en él. Los otros detalles se muestran en la nueva cotización excepto la lista de productos, sus cantidades y precios.

También he estudiado el vTiger webservices tutorial, pero no fue útil en este caso.

He encontrado una respuesta aceptada de pregunta similar , pero es en php no en Android/JAVA .

Así es como estoy enviando los detalles necesarios para crear una nueva cotización en vTiger server.:-

  try { objectJson.put("subject", subject); objectJson.put("account_id", accountId); objectJson.put("bill_street", address); objectJson.put("assigned_user_id", "19x1"); objectJson.put("conversion_rate", "1.000"); objectJson.put("currency_id", "21x1"); objectJson.put("hdnTaxType", "group"); objectJson.put("productid", productId); objectJson.put("quantity", quantity); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } String data = null; try { data = URLEncoder.encode("sessionName", "UTF-8") + "=" + URLEncoder.encode(sessionId, "UTF-8"); data += "&" + URLEncoder.encode("element", "UTF-8") + "=" + URLEncoder.encode(objectJson.toString(), "ISO-8859-1"); data += "&" + URLEncoder.encode("elementType", "UTF-8") + "=" + URLEncoder.encode(moduleName, "UTF-8"); //moduleName='Quotes' } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } String text = ""; BufferedReader reader=null; // Send data try { // Defined URL where to send data URL url = new URL("http://vtiger_url/webservice.php?operation=create"); // Send POST data request URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write( data ); wr.flush(); } catch(Exception ex) { } 

El código anterior me ayuda a generar la cotización sin detalles del producto.

Después de estudiar la respuesta php mencionada anteriormente, cambié la URL que estaba usando en mi código a esto: http://vtiger_url/webservice.php?total=23000&operation=create . Esto me ayudó a añadir la cantidad total a la cotización recién creada, pero no fue exitoso para agregar resto de los detalles utilizando este método.

4 Solutions collect form web for “No se pueden agregar detalles del producto mientras se crea una nueva cotización”

La respuesta que ha encontrado parece ser adecuado, incluso si se trata de una solución php. El problema que descirbed:

He intentado esto también pero desafortunadamente no puedo tener acceso a la tabla de Inventoryproductrel.

Tal vez ya indica una falta de autenticación adecuada o falta de privilegios. Así que mi sugerencia es

  1. Descubra por qué no puede acceder a la tabla Inventoryproductrel . Trate de acceder a esa tabla utilizando sus privilegios de autenticación (sessionID), examine la respuesta para cualquier sugerencia e intente resolver la table isn't accessible problema table isn't accessible .
  2. Por último, siga las sugerencias de esta respuesta .

Sólo otra pista. Si puede acceder con éxito a esa tabla a través de su navegador web, que me olfatear la solicitud y echar un vistazo a los parámetros de http y sus valores. Con base en estos hallazgos, puede modificar su solicitud. Siempre considere, el navegador web sólo puede hacer lo mismo que la aplicación android.

Estas líneas se agregaron en el código existente:

 JSONArray pdoInformation = new JSONArray(); try{ // Added these lines in try block to send product details for(int i=0; i<productIds.size(); i++) { JSONObject obj = new JSONObject(); obj.put("productid", productIds.get(i) ); obj.put("qty", quantities.get(i)); obj.put("listprice", listprices.get(i)); pdoInformation.put(obj); } objectJson.put("pdoInformation", pdoInformation); } 

Aquí los detalles del producto fueron necesarios para ser enviados en un JSONArray con el nombre de "pdoInformation" .

for loop se utiliza para enviar múltiples detalles del producto.

Aquí productIds , quantities y listprices son tres detalles obligatorios del producto almacenados como ArrayList .

¿Por qué no utiliza el servicio web para crear productos también? Eso debe ser apoyado según la documentación. Una vez que cree los productos y obtenga sus identificadores, puede crear un objeto de presupuesto que incluya estos identificadores. Los objetos y sus campos no están muy bien documentados para las demás API, por lo que podría utilizar las API de consulta / descripción para obtener la mayor información posible sobre qué datos se deben proporcionar para crear los diferentes objetos. De la descripción del módulo de cotizaciones , tendría que incluir item_details que contendrá la información de producto y cantidad. El nombre y formato exactos del campo pueden obtenerse mediante el API descripto tal como se describe en la documentación del servicio web

Para obtener una descripción de los objetos vTiger

 String modeleName = "Quotes"; //Use Products if you want a description of the Products module String data = null; try { data = URLEncoder.encode("sessionName", "UTF-8") + "=" + URLEncoder.encode(sessionId, "UTF-8"); data += "&" + URLEncoder.encode("elementType", "UTF-8") + "=" + URLEncoder.encode(moduleName, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String text = ""; BufferedReader reader=null; System.out.println(data); // Send data try { // Defined URL where to send data URL url = new URL("http://vtiger_url/webservice.php?operation=describeobject"); // Send GET data request URLConnection conn = url.openConnection(); conn.setDoOutput(true); OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write( data ); wr.flush(); } catch(Exception ex) { } 

Tenga en cuenta que es prácticamente lo mismo que lo que está haciendo, sólo el url & parámetros son diferentes, y el tipo de solicitud es GET en lugar de POST Para crear un producto, usted seguiría el mismo procedimiento que hizo para la cotización, sólo el Url y los parámetros serían diferentes

@help en la medida en que entiendo su pregunta es la forma de enviar JsonObject con datos a especificado Server es eso correcto? Si es el correcto, entonces le sugiero que utilice la biblioteca Volley para la creación de redes y aquí hay muchos ejemplos que pueden ser útiles para usted. http://arnab.ch/blog/2013/08/asynchronous-http-requests-in-android-using-volley/ y http://www.androidhive.info/2014/05/android-working-with-volley -library-1 /

Sólo hazlo. Proporciona la manera más fácil de realizar operaciones de red y también la cancelación de la solicitud también es posible con esta biblioteca.

Código de muestra:

 final String URL = "SERVER_URL"; // Post params to be sent to the server HashMap<String, String> params = new HashMap<String, String>(); params.put("token", "AbCdEfGh123456"); JsonObjectRequest req = new JsonObjectRequest(URL, new JSONObject(params), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { VolleyLog.v("Response:%n %s", response.toString(4)); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.e("Error: ", error.getMessage()); } }); // add the request object to the queue to be executed ApplicationController.getInstance().addToRequestQueue(req); 

Utilizando este código puede enviar sus datos a su servidor y en el lado del servidor puede utilizar el código php para recibir este jsondata y analizarlo.

Gracias.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.