【问题标题】:ODOO How to create many2one record from Android Studio using aXMLRPC library?ODOO 如何使用 XMLRPC 库从 Android Studio 创建 many2one 记录?
【发布时间】:2018-07-24 10:16:30
【问题描述】:

我正在尝试在 fleet.vehicle 模型中创建新记录。由于记录的Type是Many2One,所以会抛出以下异常。

de.timroes.axmlrpc.XMLRPCServerException: Traceback (most recent call last):

但是我能够使用相同的代码 sn-p 在 res.user 模型中创建记录,因为 Type 是 res.user 型号。
我的代码片段是:

public Integer create(String model, HashMap values) {
        Integer newObjectId = null;
        try {

            XMLRPCClient client = new XMLRPCClient(mUrl);

            Object[] parameters = {mDatabase, mUserId, mPassword, model, "create" ,new Object[]{values}};
            newObjectId = (Integer) client.call("execute_kw", parameters);

        } catch (XMLRPCException e) {
            Log.d(CONNECTOR_NAME, e.toString());
        }
        return newObjectId;
    }  

日志是:

de.timroes.axmlrpc.XMLRPCServerException: Traceback (most recent call last):
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/wsgi_server.py", line 124, in wsgi_xmlrpc
    result = odoo.http.dispatch_rpc(service, method, params)
  File "/home/wms/RMS/9040/new_odoo11/odoo/http.py", line 115, in dispatch_rpc
    result = dispatch(method, params)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 39, in dispatch
    res = fn(db, uid, *params)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 153, in execute_kw
    return execute(db, uid, obj, method, *args, **kw or {})
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 97, in wrapper
    return f(dbname, *args, **kwargs)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 160, in execute
    res = execute_cr(cr, uid, obj, method, *args, **kw)
  File "/home/wms/RMS/9040/new_odoo11/odoo/service/model.py", line 149, in execute_cr
    return odoo.api.call_kw(recs, method, args, kw)
  File "/home/wms/RMS/9040/new_odoo11/odoo/api.py", line 687, in call_kw
    return call_kw_model(method, model, args, kwargs)
  File "/home/wms/RMS/9040/new_odoo11/odoo/api.py", line 672, in call_kw_model
    result = method(recs, *args, **kwargs)
  File "/home/wms/RMS/9040/new_odoo11/addons/fleet/models/fleet_vehicle.py", line 197, in create
    vehicle = super(FleetVehicle, self.with_context(mail_create_nolog=True)).create(data)
  File "/home/wms/RMS/9040/ac-ars/ac_rms/models/planner_calender.py", line 422, in create
    res_id = super(MailThread, self).create(values)
  File "/home/wms/RMS/9040/new_odoo11/addons/mail/models/mail_thread.py", line 231, in create
    thread = super(MailThread, self).create(values)
  File "/home/wms/RMS/9040/new_odoo11/odoo/models.py", line 3278, in create
    record = self.browse(self._create(old_vals))
  File "/home/wms/RMS/9040/new_odoo11/odoo/models.py", line 3371, in _create
    cr.execute(query, tuple(u[2] for u in updates if len(u) > 2))
  File "/home/wms/RMS/9040/new_odoo11/odoo/sql_db.py", line 155, in wrapper
    return f(self, *args, **kwargs)
  File "/home/wms/RMS/9040/new_odoo11/odoo/sql_db.py", line 232, in execute
    res = self._obj.execute(query, params)
psycopg2.DataError: invalid input syntax for integer: "Audi A3"
LINE 1: ...et_vehicle_id_seq'), 5, true, 'kilometers', NULL, 'Audi A3',...
 [1]

我还附上了我正在尝试创建的图像。任何帮助深表感谢。 我的问题是如何在 odoo 中从 Android/Java 创建一个 Many2One 类型的新记录?

【问题讨论】:

    标签: java android odoo


    【解决方案1】:

    我正在回答我自己的问题。这个问题的答案非常简单,我发现使用 XMLRPC 库进行探索、调试和尝试。我就是这样解决的。
    我试图更新的字段只接​​受已经在 odoo 中预设的数据。例如:我必须首先使用 search_read 功能搜索该字段的可用预设数据。喜欢。。

    OdooConnect oc = OdooConnect.connect(SERVER_URL, PORT_NO, DB_NAME, USER_ID, PASSWORD);
    List<HashMap<String, Object>> data = oc.search_read("fleet.vehicle", new Object[]{
                    new Object[]{condition}}, "id");
    

    我在这里所做的是搜索与我要创建的字段相关的所有预设数据,并获取与我要在某些条件下更新的字符串匹配的字符串的 id。 这里的条件是

    new Object[]{new Object[]{new Object[]{"name", "=", "Audi A3"}}}
    

    因此,当它与该条件匹配时,它会返回我需要传递给 many2one 字段的对象的 id。 在上面的代码中,"id" 用于请求匹配条件的字符串的 id。 现在我们将在创建新记录时将 id 传递给 many2one 字段。将 id 传递给下面的 create 方法。

    final Integer idC = oc.create("web.service", new HashMap() {{
                    put("name", "Final Test");
                    put("value", 29); //
                    put("partner_id", id); //many2One field. here we are using pre defined value i,e setting a value of other relation model to partner_id
            }});
    

    希望它对正在寻找答案的人有所帮助。 :)

    【讨论】:

      【解决方案2】:

      从追溯sycopg2.DataError: invalid input syntax for integer: "Audi A3" 说你传递了一个非整数值。只需将Audi A3 替换为 id。然后再试一次。

      希望对你有所帮助。

      【讨论】:

      • 我真的不知道如何获取 ID 并将其替换为“Audi A3”。我尝试用数字手动替换“Audi A3”而不进行任何搜索。它给出了另一个错误。 de.timroes.axmlrpc.XMLRPCException: Error getting result from server."
      • 感谢您的宝贵时间@KbiR。我已经搜索了很多示例 java/android 示例。但没有人解释如何创建 Many2One 字段。如果你能给我一个简单的例子,那将非常有帮助。对不起,我是 Odoo 的新手。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多