更新可以通过 x++ 中的多个连接检索的记录

Update records that can be retrieved by multiple joins in x++

所以我有一个完整的 x++ 脚本,旨在根据检索到的结果集更新记录 使用 select 查询和多个连接并使用 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;
              ttsBegin;
              b.LineDisc= 'something';
              b.update();
              ttscommit;
             }
        }
     info(strfmt("total record/s updated : %1",i));
}

当我在上面 运行 时,遇到这个错误

"无法编辑库存模块参数 (InventTableModule) 中的记录。 该记录从未 selected."

作为解决方案,基于此link ,我尝试了相同的方法,这是修改后的脚本

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++ 的新手,希望我能得到有关最佳实践的专家建议。

提前致谢。

首先,不要尝试跨公司更新,那肯定会失败。 使更新在当前公司有效,然后将脚本应用到其他相关公司。

修复了一些问题:

  • 尝试更新通过 exists join 找到的记录将不起作用,因此您的错误。
  • 对找到的记录进行测试是多余的,如果找到none则不会进入循环
  • 使用大笔交易

也将更新放在一个内部函数中,这样可以很容易地在多个公司中进行更新。请参阅 this answer 了解如何在所有公司中执行此操作。

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