OColumn с функцией odoo в Odoo Mobile Framework не работает - PullRequest
0 голосов
/ 10 июля 2020

У меня есть этот OColumn partner_name = new OColumn ("Partner", OVarchar.class) .setLocalColumn (); в моем классе модели заказа на продажу с функциональным методом odoo, который зависит от столбца partner_id. Я хотел бы выполнить поиск по partner_name в моем списке, используя этот столбец partner_name, но я немного не понимаю, как этого добиться. Пожалуйста, нужна помощь.

Это то, что я пробовал:

BaseFragment

  @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

Изменить: просто поместите 'if (type.isAssignableFrom (Odoo.Functional.class) 'перед' if (type.getDeclaringClass (). IsAssignableFrom (Odoo.api.class)) ', чтобы иметь правильные значения.

1 Ответ

1 голос
/ 14 июля 2020

Определите поле 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) + "";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...