• 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文件下载

  • 相关阅读:
    javascript,函数声明和函数表达式
    javascript,小数值舍入操作方法:ceil()、floor()、round()
    javascript,子字符串操作方法:Slice()、Substr()、Substring()的区别
    javascript,第一个基于node.js的Http服务
    javascript,创建对象的3种方法
    MFC学习笔记2——MFC和Win32
    Qt下 QString转char*
    [转载] Qt程序在Windows下的mingw发布
    VC 获取当前时间
    MFC 对话框设计问题(控件的使用)
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/777098.html
Copyright © 2020-2023  润新知