Определите поле 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")
EDIT:
Обратите внимание, что база данных создается при первом запуске приложения или при очистке данных в настройках приложения. Вам необходимо очищать данные приложения каждый раз при обновлении столбца базы данных.
Если столбец был добавлен после создания базы данных, он не будет добавлен в соответствующую таблицу. Это потому, что база данных не обновлена. Чтобы исправить эту проблему, вы можете:
Очистить данные приложения для обновления столбца базы данных
Удалить учетную запись пользователя (это приведет к удалению базы данных) или переустановить приложение для воссоздания базы данных.
Или вы можете изменить DATABASE_VERSION
в odoo/datas/OConstants
, затем переопределить метод onModelUpgrade
в модели заказа на продажу и обновить таблицу вручную (изменить таблицу заказов на продажу и добавьте столбец с именем партнера, используя SQL query: 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)
CODE:
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) + "";