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.
- Servicio llamado de Android a C # no funciona
- ¿Cómo publico datos usando la biblioteca okhttp con el tipo de contenido x-www-form-urlencoded?
- Cargar archivos y otros datos de Android a través de la solicitud HTTP POST
- Cómo enviar datos al sitio web mediante la aplicación android
- Android DefaultHTTPConnection con Keep-Alive no reutiliza la conexión TCP
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.
- Los primeros intentos de HTTP POST y GET son siempre lentos - ¿Está relacionado con el SO o con la red?
- HttpURLConnection Post: El flujo de salida no tiene efecto?
- Enviar datos a la página cargada en WebView
- Compartir enlace y texto con Android Facebook SDK 3.0
- Envío de solicitud de publicación HTTP con Android
- Enviar cookies con http post android
- Enviar array php con POST android
- Los caracteres especiales desaparecen en la solicitud POST desde un teléfono Android
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
- 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 latable isn't accessible
problematable isn't accessible
. - 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.
- SQLiteDiskIOException: error de E / S de disco (código 3850)
- Integre Unity3D con Vuforia en la aplicación Cordova