Обновление записей, которые могут быть получены с помощью нескольких объединений в x ++ - PullRequest
0 голосов
/ 27 мая 2019

Итак, у меня есть полный x ++ скрипт, который предназначен для обновления записей на основе извлеченного результирующего набора , созданного с помощью запроса select с несколькими объединениями и с использованием кросс-компании

Как мне сказали, этоНе стоит обновлять записи, когда есть кросс-компания.Можете ли вы дать совет эксперта о том, как сделать это наилучшим способом, учитывая мой текущий сценарий.

вот сценарий

static void UpdateSample(Args _args)
{

   InventTable  a;
   InventTableModule b;
   EcoResProduct c;
   EcoResProductCategory d;
   EcoResCategory e;
   EcoResCategoryHierarchy f;
   int i = 0;

    while select crossCompany  a
    exists join b where a.ItemId  == b.ItemId  
    exists  join c where a.Product  == c.RecId
    exists join d where c.RecId  == d.Product
    exists join e where d.Category  == e.RecId
    exists join f where d.CategoryHierarchy  == f.RecId
    && a.dataAreaId == 'DAT' && b.ModuleType  == 2
    && b.LineDisc  == ''
    && f.name == 'EXAMPLE'
    &&(e.name == 'sample1' || e.name == 'sample2' || e.name == 'sample3')

       {
        if (a)
             {
              i = i + 1;
              ttsBegin;
              b.LineDisc= 'something';
              b.update();
              ttscommit;
             }
        }
     info(strfmt("total record/s updated : %1",i));
}

Когда я запускаю выше, у меня появляется эта ошибка

"Невозможно редактировать запись в параметрах модуля Inventory (InventTableModule). Запись никогда не была выбрана."

Как решение, основанное на этой ссылке Как обновить / вставить / удалить CrossCompany , я попытался повторить то же самое, это модифицированный скрипт

static void UpdateSample(Args _args)
{
   InventTable  a;
   InventTableModule b;
   EcoResProduct c;
   EcoResProductCategory d;
   EcoResCategory e;
   EcoResCategoryHierarchy f;
   int i = 0;

    while select crossCompany  a
    exists join b where a.ItemId  == b.ItemId  
    exists  join c where a.Product  == c.RecId
    exists join d where c.RecId  == d.Product
    exists join e where d.Category  == e.RecId
    exists join f where d.CategoryHierarchy  == f.RecId
    && a.dataAreaId == 'DAT' && b.ModuleType  == 2
    && b.LineDisc  == ''
    && f.name == 'EXAMPLE'
    &&(e.name == 'sample1' || e.name == 'sample2' || e.name == 'sample3')

       {
       if (a)
             {
              i = i + 1;
              b.LineDisc= 'something'; 
              b.selectForUpdate(true);
              ttsBegin;
              b.update();
              ttsCommit;
             }
        }
     info(strfmt("total record/s updated : %1",i));
}

Но у меня в этой строке SYNTAX ERROR

 b.selectForUpdate(true);

Я новичок в x ++, надеюсь, я смогу получить совет специалиста о наилучшей практике в этом.

Заранее спасибо.

1 Ответ

2 голосов
/ 28 мая 2019

Во-первых, не пытайтесь делать обновления между компаниями, это обязательно приведет к сбою. Сделайте, чтобы обновление работало в текущей компании, затем примените сценарий к другим соответствующим компаниям.

Исправлено несколько вещей:

  • Попытка обновить найденную запись с существующим объединением не будет работать, следовательно, ваша ошибка.
  • Проверка на найденную запись является избыточной, цикл не будет введен, если ничего не найдено
  • Использовать крупную транзакцию

Также поместите обновление во внутреннюю функцию, это облегчит обновление более чем в одной компании. См. этот ответ о том, как это сделать во всех компаниях.

static void UpdateSample(Args _args)
{
    void doIt()
    {
        InventTable  a;
        InventTableModule b;
        EcoResProduct c;
        EcoResProductCategory d;
        EcoResCategory e;
        EcoResCategoryHierarchy f;
        int i;
        ttsBegin;
        while select a
            join forUpdate b where a.ItemId  == b.ItemId  
            exists join c where a.Product  == c.RecId
            exists join d where c.RecId  == d.Product
            exists join e where d.Category  == e.RecId
            exists join f where d.CategoryHierarchy  == f.RecId
            && b.ModuleType  == 2
            && b.LineDisc  == ''
            && f.name == 'EXAMPLE'
            &&(e.name == 'sample1' || e.name == 'sample2' || e.name == 'sample3')
        {
            ++i;
            b.LineDisc= 'something'; 
            b.update();
        }
        ttsCommit;
        info(strfmt("total record/s updated : %1", i));
    }
    changecompany ('XXX')
        doIt();
}
...