随着产品数量的增加,用户在输入创建一个产品时总是担心这个产品在系统中是否已经存在?
说起来检测系统中是否已经存在某个BOM,应该很简单。AX用BOM这个表存放BOM清单,某个BOM由什么产品组成的都在这个表中存着,只要看一下这个表是否存在记录就可以了。
BOM表中的三个重要字段是BOMId,ItemId,BOMQty.一个BOM由多个产品组成,比如有两个BOM
BOMId ItemId BOMQty
1 A 3
1 B 4
1 C 2
2 A 3
2 B 4
用户的要求很简单,当在BOM的输入界面输入
ItemId BOMQty
A 3
就要显示出所有包含料品A,且数量为3的BOM,这时就需要显示
BOMId ItemId BOMQty
1 A 3
1 B 4
1 C 2
2 A 3
2 B 4
当用户继续输入
ItemId BOMQty
C 2
就需要显示包含料品A,数量为3并且包含料品B,数量为2的BOM,这时需要显示
BOMId ItemId BOMQty
1 A 3
1 B 4
1 C 2
这样的看起来听容易实现的,不过俺实在没找到好的实现方法,用了Map和Set搞了半天,最后用取交集才搞定,应该有更好的实现方式。
说一下我的实现思路:
在用户输入BOM行记录时,比如输入
BOMId ItemId BOMQty
1 A 3
在表的DataSource的Create方法中从表BOM中获取ItemId为A且BOMQty为3的BOMId
{
BOMVersion localBOMVersion;
BOM localBOM;
Set set = new Set(Types::String);
SetIterator si;
super();
BOMTable.clear();
while select BOMId from localBOM
where localBOM.ItemId == tmpBOMInput.ItemId &&
localBOM.BOMQty == tmpBOMInput.Qty
{
if(!set.in(localBOM.BOMId))
set.add(localBOM.BOMId);
}
map.insert(tmpBOMInput.RecId,set);
element.UpdateBOMTableDs();
}
将记录存放在Map中,调用UpdateBOMTable方法
{
MapIterator mi;
BOMVersion localBOMVersion;
Set totalSet;
Set set;
SetIterator si;
Boolean firstIn = true;
;
delete_from BOMTable;
mi = new MapIterator(map);
while(mi.more())
{
if(firstIn)
totalSet = mi.value();
else
{
si = new SetIterator(totalSet);
while(si.more())
{
set = mi.value();
if(!set.in(si.value()))
totalSet.remove(si.value());
si.next();
}
}
mi.next();
}
if(totalSet)
{
si = new SetIterator(totalSet);
while(si.more())
{
while select ItemId,Name from localBOMVersion
where localBOMVersion.BOMId == si.value()
{
BOMTable.BOMId = si.value();
BOMTable.ItemId = localBOMVersion.ItemId;
BOMTable.Name = localBOMVersion.Name;
BOMTable.doInsert();
}
si.next();
}
}
BOMTable_ds.executeQuery();
}
实现取交集的。
XPO文件下载