Odoo Mobile Framework 中带有 odoo 功能的 OColumn 不起作用
OColumn with odoo functional in Odoo Mobile Framework not working
我有这个 OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn();在我的销售订单模型 class 中,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();
没有创建列。
更新:
partner_name 具有 odoo 功能的列
编辑:只需将 'if (type.isAssignableFrom(Odoo.Functional.class)'
在 'if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class))' 之前获得正确的值。
定义 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")
编辑:
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.
如果该列是在创建数据库后添加的,则不会添加到对应的table。这是因为数据库没有升级。要解决此问题,您可以:
清理应用程序数据以更新您的数据库列
删除用户帐户(这将删除数据库)或重新安装应用程序以重新创建数据库。
或者您可以在 odoo/datas/OConstants
中更改 DATABASE_VERSION
然后覆盖销售订单模型中的 onModelUpgrade
方法并手动升级 table(更改销售订单table 并使用 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()
编辑:并未显示所有合作伙伴名称
尝试将 partner_id
字符串转换为 JSON 数组时出现 org.json.JSONException
错误。
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) + "";
我有这个 OColumn partner_name = new OColumn("Partner", OVarchar.class).setLocalColumn();在我的销售订单模型 class 中,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();
没有创建列。
更新: partner_name 具有 odoo 功能的列
编辑:只需将 'if (type.isAssignableFrom(Odoo.Functional.class)' 在 'if (type.getDeclaringClass().isAssignableFrom(Odoo.api.class))' 之前获得正确的值。
定义 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")
编辑:
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.
如果该列是在创建数据库后添加的,则不会添加到对应的table。这是因为数据库没有升级。要解决此问题,您可以:
清理应用程序数据以更新您的数据库列
删除用户帐户(这将删除数据库)或重新安装应用程序以重新创建数据库。
或者您可以在
odoo/datas/OConstants
中更改DATABASE_VERSION
然后覆盖销售订单模型中的onModelUpgrade
方法并手动升级 table(更改销售订单table 并使用 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()
编辑:并未显示所有合作伙伴名称
尝试将 partner_id
字符串转换为 JSON 数组时出现 org.json.JSONException
错误。
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) + "";