Odoo Mobile Framework 中带有 odoo 功能的 OColumn 不起作用 [英] OColumn with odoo functional in Odoo Mobile Framework not working

查看:71
本文介绍了Odoo Mobile Framework 中带有 odoo 功能的 OColumn 不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个 OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn();在我的销售订单模型类中使用依赖于 partner_id 列的 odoo 函数方法.我想使用该列partner_name 在我的列表中搜索partner_name,但我对如何实现这一点感到有些困惑.请需要一些帮助.

I have this OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn(); in my sale order model class with odoo functional method that depends on partner_id column. I would like to search the partner_name in my list using that column partner_name, but I'm a little confused on how to achieve this. Please needed some help.

这是我试过的:

基础片段

  @Override
  public void onViewBind(View view, Cursor cursor, ODataRow row) {
      getPartnerIds(row);
      OControls.setText(view, R.id.partner_name,  row.getString("partner_name")); // displays false
      ....
    }
}

  private void getPartnerIds(ODataRow row){
      OValues oValues = new OValues();
      oValues.put("partner_id", row.get("partner_id"));
      saleOrder.storeManyToOne(oValues);
}

更新:

我注意到即使我创造了

 @Odoo.Functional(method = "storeManyToOne", store = true, depends = {"partner_id"})
 OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn();

未创建任何列.

更新:partner_name 带有 odoo 功能的列

Updated: partner_name column with odoo functional

只需放置'if (type.isAssignableFrom(Odoo.Functional.class)'在 'if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class))' 之前有正确的值.

Just place the 'if (type.isAssignableFrom(Odoo.Functional.class)' before the 'if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class))' to have the correct values.

推荐答案

定义 partner_name 字段,如下所示:

Define the partner_name field like below:

@Odoo.Functional(method="storePartnerName", store=true, depends={"partner_id"})
OColumn partner_name = new OColumn("Partner name", OVarchar.class)
                       .setLocalColumn();

public String storePartnerName(OValues values) {
    try {
        if (!values.getString("partner_id").equals("false")) {
            JSONArray partner_id = new JSONArray(values.getString("partner_id"));
            return partner_id.getString(1);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "false";
}

您可以简单地使用以下方法获取 partner_name:

You can simply get the partner_name using:

row.getString("partner_name")

请注意,数据库是在您第一次运行应用程序或从应用程序清除数据时创建的环境.每次更新数据库列时都需要清理应用程序数据.

Note that database is created when you first time run your application, or when you clean your data from app setting. You need to clean application data everytime when you update your database column.

如果该列是在数据库创建后添加的,则不会添加到相应的表中.这是因为数据库没有升级.要解决此问题,您可以:

If the column was added after the database creation, it will not be added to the corresponding table. This is because the database is not upgraded. To fix this issue you can:

  • 清理应用程序数据以更新您的数据库列

  • Clean application data to update your database column

删除用户帐户(这将删除数据库)或重新安装应用程序以重新创建数据库.

Remove user account (This will delete database) or reinstall the application to recreate the database.

或者你可以改变odoo/datas/OConstants中的DATABASE_VERSION,然后覆盖销售订单模型中的onModelUpgrade方法并升级表格手动(更改销售订单表并使用 SQL 查询添加合作伙伴名称列:ALTER TABLE sale_order ADD partner_name VARCHAR(100)).
创建并同步新的销售订单时,应自动计算并存储合作伙伴名称.

Or you can change DATABASE_VERSION in odoo/datas/OConstants then override onModelUpgrade method in sale order model and upgrade the table manually (alter sale order table and add the partner name column using SQL query: ALTER TABLE sale_order ADD partner_name VARCHAR(100)).
When a new sale order is created and synchronized, the partner name should be computed and stored automaticaly.

我注意到同步后没有为现有记录设置合作伙伴名称,因此我添加了另一个 SQL 查询来计算和设置旧记录的合作伙伴名称值.

I noticed that the partner name was not set for existing records after synchrinization so I added another SQL query to compute and set the value of partner name for old records.

示例:

  @Override
  public void onModelUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          db.execSQL("ALTER TABLE sale_order ADD partner_name VARCHAR(100)");
          db.execSQL("UPDATE sale_order SET partner_name = (SELECT name from res_partner WHERE _id=partner_id) WHERE partner_name IS NULL AND partner_id IS NOT NULL");
  }  

编辑(配置):
使用新配置,您将收到以下错误(这将阻止使用注释创建字段):

Edit (config):
using the new configuration you will get the following error (which will prevent creating fields using annotations):

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Class.isAssignableFrom(java.lang.Class)' on a null object reference
W/System.err:     at com.odoo.core.orm.OModel.compatibleField(OModel.java:349)

代码:

if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class)) {

尝试删除 .getDeclaringClass()

未显示所有合作伙伴名称

当它尝试将 partner_id 字符串转换为 JSON 数组时,会发生 org.json.JSONException 错误.

There is a org.json.JSONException error that happens when it try to convert partner_id string to a JSON array.

W/System.err: org.json.JSONException: Unterminated array at character 12 of [114.0, UH PARTNER]

当它尝试转换包含空格的名称时会发生错误.为避免这种情况,您可以将 partner_id 字符串转换为对象列表.

The error happens when it try to convert names containing spaces. To avoid that you can cast partner_id string to a list of objects.

partnerName方法中,替换如下代码:

In partnerName method, replace the following code:

JSONArray partner_id = new JSONArray(values.getString("partner_id"));
return partner_id.getString(1);

与:

List<Object> partner_id = (ArrayList<Object>) values.get("partner_id");
return partner_id.get(1) + "";

这篇关于Odoo Mobile Framework 中带有 odoo 功能的 OColumn 不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆