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

时间:2019-05-27 10:02:17

标签: axapta x++ dynamics-ax-2012 dynamics-ax-2012-r2

因此,我有一个完整的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)中的记录。 从未选择该记录。”

作为解决方案,基于此链接How to Update/Insert/Delete 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 ++的新手,希望我能获得有关最佳实践的专家意见。

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,不要尝试跨公司进行更新,否则必然会失败。 在当前公司中进行更新,然后将该脚本应用于其他相关公司。

修复了一些问题:

  • 尝试更新通过存在连接找到的记录将不起作用,因此会出现错误。
  • 根据记录进行测试是多余的,如果没有找到,则不会进入循环
  • 使用大笔交易

还将更新放入内部函数中,这将使在多个公司中轻松进行更新。有关如何在所有公司中开展业务,请参见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();
}