Exhibit BOM number code

/****
The following X++ code was used to exhibit BOM number
Remark by Jimmy August 27th 2010
*/

Class name QVS_ExhibitBOM

/****
The following X++ code was used to exhibit BOM number
Remark by Jimmy August 27th 2010
*/
class QVS_ExhibitBOM
{
    int             i;
    Real           NetConsum;
}

 

 

 The method of ParmExhibitBOM

 

void ParmExhibitBOM(ItemId     _ItemId = "") //Exhibit standard BOM method
{
     query                           q;
     queryRun                        queryRun;
     QueryBuildDataSource            qbdsIT,qbdsVersion,qbdsBOM;
     InventTable                     _InventTable;
     BOM                             _BOM;
     BomVersion                      _BomVersion;
;
     q  = new query();

     qbdsIT  = q.addDataSource(tablenum(InventTable));

     if(_ItemId)
        qbdsIT.addRange(fieldnum(InventTable,Itemid)).value(_ItemId);
     qbdsIT.addRange(fieldnum(InventTable,Itemtype)).value(queryValue(ItemType::BOM));

     qbdsVersion = qbdsIT.addDataSource(tablenum(BomVersion));
     qbdsVersion.addLink(fieldnum(InventTable,ItemId),fieldnum(BomVersion,ItemId));
     qbdsVersion.addRange(fieldnum(BomVersion,Active)).value(queryValue(Noyes::Yes));
     qbdsVersion.addRange(fieldnum(BomVersion,Approved)).value(queryValue(Noyes::Yes));

     qbdsBOM = qbdsVersion.addDataSource(Tablenum(BOM));
     qbdsBOM.addLink(fieldnum(BomVersion,BomId),fieldnum(BOM,BomId));

     queryRun = new QueryRun(q);
     while (queryRun.next())
     {
         _BOM          = queryRun.get(tablenum(BOM));
         _InventTable  = queryRun.get(tablenum(InventTable));
         _BomVersion   = queryRun.get(tablenum(BomVersion));

         i             = 1;
         if(_BOM.BOMQtySerie)
            NetConsum = _BOM.BOMQty / _BOM.BOMQtySerie;
         else if(_BOM.BOMQty)
            NetConsum = _BOM.BOMQty;
         else
            NetConsum = 1;

         if(Inventtable::find(_BOM.ItemID).ItemType == ItemType::BOM)//Exhibit next BOM number
         {
            this.insertConsumeListNext(_InventTable,_BOM,_BOM.BomId,_BomVersion.BOMId,i,NetConsum);
            i++;
            this.RankGetItem(_BOM.ItemId,_InventTable,i,NetConsum);
         }
         else
             this.insertConsumeListNext(_InventTable,_BOM,_BOM.BomId,_BomVersion.BOMId,i,NetConsum);//get Item number of Item type is Item
    }
}

 

The method of RankGetItem

 

void RankGetItem(ItemId             _ItemId,//finished BOM number
                 InventTable        InventTable,
                 int                level,
                 Price              _NetConsum)
{
     BOM                _bom;
     BomVersion         _bomversion;
     Inventtable        _Inventtable;
     Int                TmpLevel = 1;
;
    NetConsum  = _NetConsum;
    while select _bomversion index hint BomIdx
            where _bomversion.ItemId == _ItemId
            &&    _bomversion.Active == Noyes::Yes && _bomversion.Approved == Noyes::Yes
       join _bom index hint NumIdx
            order by BOMId where _bom.BOMId == _bomversion.BOMId
       join  _Inventtable
            where _Inventtable.ItemId ==  _bom.ItemId //&& _Inventtable.ItemType != ItemType::Service
    {
        if(_bom.BOMQtySerie)
            _NetConsum = NetConsum * (_bom.BOMQty / _bom.BOMQtySerie);
        else if(_bom.BOMQty)
            _NetConsum = NetConsum * _bom.BOMQty;
        else
            _NetConsum = NetConsum;

        if(_Inventtable.ItemType == ItemType::BOM)
        {
            this.insertConsumeListNext(InventTable,_bom,_bom.ItemId,_bomversion.BOMId,level,_NetConsum);
            TmpLevel = level + 1;
            this.RankGetItem(_bom.ItemId,InventTable,TmpLevel,_NetConsum);
        }
        else
            this.insertConsumeListNext(InventTable,_bom,_bom.ItemId,_bomversion.BOMId,level,_NetConsum);

    }
}

 

The method of insertConsumeListNext

void insertConsumeListNext(InventTable              _InventTable    ,//finished production
                           BOM                      _BOM            ,
                           ItemId                   _ItemId = ','   ,
                           BomId                    _BomId  = ""    ,
                           int                      _level          ,
                           Price                    _NetConsum)//BomBersion
{
    QVS_ExhibitBOMList        _ExhibitBOMList;
;
    _ExhibitBOMList.clear();

    _ExhibitBOMList.BomId           = _InventTable.ItemId;
    _ExhibitBOMList.SubBomId        = _BOM.BOMId;
    _ExhibitBOMList.ItemID          = _BOM.ItemId;
    _ExhibitBOMList.BOMVersion      = _BOMId;

    _ExhibitBOMList.BomQty          = _BOM.BOMQty;
    _ExhibitBOMList.BOMQtySerie     = _BOM.BOMQtySerie;
    if(_BOM.BOMQtySerie)
        _ExhibitBOMList.BOMUsege    = _BOM.BOMQty / _BOM.BOMQtySerie;
    else
        _ExhibitBOMList.BOMUsege    = _BOM.BOMQty;

    _ExhibitBOMList.ItemType        = _BOM.itemType();

    _ExhibitBOMList.LevelRecId      = _BOM.RecId;
    _ExhibitBOMList.NetConsumption  = _NetConsum;
    _ExhibitBOMList.Level           = _level;
    _ExhibitBOMList.flag            = StrFmt("%1 Level",_level);

    _ExhibitBOMList.insert();

}

 

Job demo(version)

Jimmy 2010-09-14

static void Jimmy_ExhibitBOMItemList(Args _args)
{
    InventTable InventTable,g_IT;
    BOMVersion  BOMVersion;
    Bom         SelectBom;
    Int         g_Level,_TmpLevel;
    Test        Test;
    BOM         BOM;
    ItemId      g_ItemId;
    int         MM;
    Dialog      dlg = new Dialog("Please enter the Productin Number!");
    DialogField dlgItemId = dlg.addField(typeid(ItemId));

void insertTable(BOM            _Bom,
                 InventTable    _InventTable)

{
;
    test.g_ItemId   = g_ItemId;
    test.BomId      = _Bom.BOMId;
    test.ItemId     = _Bom.ItemId;
    test.Id         = g_Level;
    test.ItemType   = _InventTable.ItemType;
    test.Insert();
    MM++;
}

void LevelBomGen(Int _level, Bom _Bom)
{
    BOM         _TmpBom;
    int         TmpLevel;
    InventTable IT;
;
    if (_level ==20)
        return;
    IT = InventTable::find(_Bom.ItemId);
    if (IT.ItemType == ItemType::BOM)
    {
        insertTable(_Bom,IT);
        g_Level++;
        while select _TmpBom where _TmpBom.BOMId == _Bom.ItemId
        {
            TmpLevel = g_Level;
            LevelBomGen(g_Level,_TmpBom);
            g_Level = TmpLevel;
        }
    }
    else
        insertTable(_Bom,IT);
}
;
    dlg.doInit();
    dlgItemId.value("20-3805");
    if(!dlg.run())
        return ;

    g_ItemId = dlgItemId.value();
    delete_from test;

    while select InventTable
            where InventTable.ItemId == g_ItemId //"20-3805"
        join BOMVersion
            where BOMVersion.ItemId == InventTable.ItemId
        join BOM
            where BOM.BOMId == BOMVersion.BOMId
    {
        g_Level = 1;
        g_IT = InventTable::find(BOM.ItemId);
        if(g_IT.ItemType == ItemType::BOM)
        {
            insertTable(BOM,g_IT);
            g_Level++;
            while select * from SelectBom where SelectBom.BOMId == BOM.ItemId
            {
                _TmpLevel = g_Level;
                LevelBomGen(g_Level,SelectBom);
                g_Level = _TmpLevel;
            }
        }
        else
            insertTable(BOM,g_IT);
    }
    info(strfmt("Total %1 records!s",MM));
}

 

posted @ 2010-08-27 20:42  Fandy Xie  Views(332)  Comments(0Edit  收藏  举报