不 return 正确计数的 x++ 脚本

x++ script that do not return correct count

我有一个 x++ 脚本,旨在计算来自 select 查询的记录,并在稍后更新。

这是原题供参考:

最初,我有一个 SQL 查询对应项,结果是 50 行/记录,当我将它转换为 X++ 时,它没有计算或提取相同数量的记录,

这是 x++ 脚本

static void Job(Args _args)
{

    Table1 table1;
    Table2 table2;
    Table3 table3;
    Table4 table4;
    Table5 table5;
    int i = 0;
    while select forUpdate table1  
       join table2 where table1.field1 == table2.field1 
       join table3 where table1.field2 == table3.field2
       join table4 where table3.field3 == table4.field3
       join table5 where table3.category == table5.recid
       && table1.location  == 'asia' && table2.modtye == 2
       && table3.discount == 'sample' 
       && table4.name ==  'hello' 
       &&(table5.name == 'one' || table5.name == 'two' || table5.name == 'three')                
    {    
            if (table1)    
            {
                 i = i + 1;    
            }    
    }    
    info(strfmt("Total : %1",i));    
}

请帮忙,我哪里错了它认为是这部分

if (table1)

我也试过整理代码以了解问题出在哪里,

 while select forUpdate table1  
           join table2 where table1.field1 == table2.field1 
           && table1.location  == 'asia' && table2.modtye == 2

这部分没有 return 结果......当我包括

 && table1.location  == 'asia' && table2.modtye == 2

所以我认为,问题是存在的,但是代码有什么问题?


我的代码实际上来自本教程 link

https://community.dynamics.com/ax/b/dynamicsaxtipoftheday/archive/2014/09/05/quickly-update-data-through-x-scripts

我建议一个简单的解释,也许 SQL returns 行来自几个公司或分区?
AX 默认为当前分区和公司 returns 行 curext()

如果您使用 select 的 crosscompany 选项,它将扫描跨公司:

while select crosscompany table1 ...

是否找到table1不需要测试,没有找到不进入循环

此外,如果您的唯一目的是计算记录的数量,那么手动计算很浪费,单个 select 就可以了:

select firstOnly /*crosscompany*/ count(RecId) from table1  
   exists join table2 where table1.field1 == table2.field1 
   exists join table3 where table1.field2 == table3.field2
   exists join table4 where table3.field3 == table4.field3
   exists join table5 where table3.category == table5.recid
     && table1.location  == 'asia' && table2.modtye == 2
     && table3.discount == 'sample' 
     && table4.name ==  'hello' 
     &&(table5.name == 'one' || table5.name == 'two' || table5.name == 'three');
info(strfmt("Total : %1", table1.RecId));