Farseer

导航

BOM重复检测

随着产品数量的增加,用户在输入创建一个产品时总是担心这个产品在系统中是否已经存在?
说起来检测系统中是否已经存在某个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

public void write()
{
    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方法

void UpdateBOMTableDs()
{
    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文件下载

posted on 2007-06-08 22:41  佛西亚  阅读(934)  评论(2编辑  收藏  举报