因此,我有一个完整的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 ++的新手,希望我能获得有关最佳实践的专家意见。
谢谢。
答案 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();
}