Обновите записи, которые могут быть получены несколькими соединениями в x ++

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

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

вот сценарий

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

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

«Невозможно изменить запись в параметрах модуля инвентаризации (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));
}

Но у меня в этой строке появляется СИНТАКСИЧЕСКАЯ ОШИБКА

 b.selectForUpdate(true);

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

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


person rickyProgrammer    schedule 27.05.2019    source источник
comment
Ваш try / catch ничего полезного не делает, удалите его.   -  person Jan B. Kjeldsen    schedule 27.05.2019
comment
Ваш код не компилируется, inv не был определен и не найден в цикле.   -  person Jan B. Kjeldsen    schedule 27.05.2019
comment
Используйте исходный код, который компилируется для стандартного приложения.   -  person Jan B. Kjeldsen    schedule 27.05.2019
comment
Взгляните на Cross- Модификация данных компании с использованием X ++   -  person FH-Inway    schedule 27.05.2019
comment
Возможный дубликат Как обновить / вставить / удалить кросс-компанию   -  person FH-Inway    schedule 27.05.2019
comment
Извините, да, я уже редактировал согласованность переменных, удалил try catch .. @ JanB.Kjeldsen   -  person rickyProgrammer    schedule 28.05.2019
comment
привет @ FH-Inway согласно второй ссылке, вы имеете в виду удаление FORUPDATE вверху и замену его Table.selectForUpdate (true) во внутренней части тела? для набора результатов с кросс-компании обновляться?   -  person rickyProgrammer    schedule 28.05.2019
comment
это не та же мысль, поскольку я использовал таблицу с несколькими соединениями   -  person rickyProgrammer    schedule 28.05.2019
comment
привет @ JanB.Kjeldsen есть отзывы?   -  person rickyProgrammer    schedule 28.05.2019
comment
Вы не предоставили сценарий для реальных таблиц. Взгляните на stackoverflow.com/a/11899654/4509.   -  person Jan B. Kjeldsen    schedule 28.05.2019
comment
о, вы хотите, чтобы я использовал настоящие имена таблиц?   -  person rickyProgrammer    schedule 28.05.2019
comment
@ JanB.Kjeldsen, поэтому я отредактировал скрипт, используя реальный скрипт, над которым я работаю прямо сейчас ... надеюсь получить положительный отзыв по этому поводу   -  person rickyProgrammer    schedule 28.05.2019
comment
Вам действительно нужно использовать клавишу табуляции!   -  person Jan B. Kjeldsen    schedule 28.05.2019


Ответы (1)


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

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

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

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

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();
}
person Jan B. Kjeldsen    schedule 28.05.2019
comment
так что фильтрация, чтобы указать, какой dataareaid / location удаляется .. - person rickyProgrammer; 28.05.2019
comment
Никогда не делайте этого, используйте changecompany (или подайте заявку в текущей компании). - person Jan B. Kjeldsen; 28.05.2019
comment
так что строка changeCompany, спецификация dataareaid / location должны быть там в ('xxx'), верно? вместо указания во внутреннем запросе - person rickyProgrammer; 28.05.2019
comment
Хорошее предположение ... и я предполагаю, что вы действительно хотите обновлять только в одной компании. Вы должны узнать, как сменить компанию с помощью пользовательского интерфейса. - person Jan B. Kjeldsen; 28.05.2019
comment
Да, просто чтобы дать предысторию, ожидаемые ошибки в значении в линдиске этих мастеров элементов в КОНКРЕТНОМ МЕСТОПОЛОЖЕНИИ были только из-за неправильной настройки перед выпуском элементов. поэтому необходимо НАЙТИ сначала эти элементы, и их можно найти только с помощью объединений в запросе выбора. - person rickyProgrammer; 28.05.2019
comment
Я планирую сделать это в SQL, но считаю, что лучше использовать скрипты x ++. - person rickyProgrammer; 28.05.2019
comment
другой метод, о котором я подумал, - это одно за другим обновление в x ++ путем ссылки на recid в Inventtablemodule .. после того, как я извлеку их из запроса sql - person rickyProgrammer; 28.05.2019
comment
Это чушь, исправь свой запрос. - person Jan B. Kjeldsen; 28.05.2019
comment
Для других ищущих - см. Этот ответ для простого примера stackoverflow.com/a/35354290/1179573 - person Alex Kwitny; 30.05.2019