首页 > 解决方案 > 在 Odoo 移动框架中具有 odoo 功能的 OColumn 不起作用

问题描述

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

这是我尝试过的:

基本片段

  @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();

没有创建列。

更新: 具有 odoo 功能的partner_name列

编辑:只需将 'if (type.isAssignableFrom(Odoo.Functional.class)' 放在 'if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class))' 之前以获得正确的值。

标签: androidodooodoo-mobile

解决方案


定义如下partner_name字段:

@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使用:

row.getString("partner_name")

编辑:

请注意,当您第一次运行应用程序或从应用程序设置中清除数据时,会创建数据库。每次更新数据库列时都需要清理应用程序数据。

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

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

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

  • 或者您可以更改销售订单模型DATABASE_VERSION中的odoo/datas/OConstantsthen overrideonModelUpgrade方法并手动升级表(更改销售订单表并使用 SQL 查询添加合作伙伴名称列:)ALTER TABLE sale_order ADD partner_name VARCHAR(100)
    创建和同步新的销售订单时,应自动计算和存储合作伙伴名称。

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

    例子:

      @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");
      }  
    

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

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()

编辑:并非所有合作伙伴名称都显示

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

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

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

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

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) + "";

推荐阅读