zoukankan      html  css  js  c++  java
  • 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文件下载

  • 相关阅读:
    一些必不可少的Sublime Text 2插件
    sublime text 使用小技巧
    Azure Queue 和 Service Bus Queue的比较
    怎么使用Windows Azure Queue Storage 服务
    配置 SharePoint 2010 使用本机默认 SQL Server 实例 Pan
    将两个字符串中相同的地方str2无重复的输出
    javascript笔记
    C#中怎样使控件随着窗体一起变化大小(拷来学习)
    在pictureBox中画方格矩阵地图,方法比较笨,有好方法望指导
    通过一个小推理写出的程序,结果出乎意料……有哪位知道为什么吗 已解决
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/777098.html
Copyright © 2011-2022 走看看