更新可以通过 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();
}
所以我有一个完整的 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();
}