C++ 利用遞迴設計逆展BOM (Recursive Method Used in BOM implosion)

本文解說以C++程式,遞迴設計逆展BOM的方法。

首先設計函式 bom_parents_last:擷取件號(零件)在BOM的上一階件號(組合件或工單件)

//若有指定lst,則輸出至至lst。不指定則lst & frm均為NULL
//return 陣列
//若full_info=false 僅記錄件號
//若full_info=true  記錄: '總數量 / 件號 中文品名 規格' ;中文品名及規格若無則以'---'替代
TStringDynArray bom_parents_last(String pno,TListBox *lst,TForm *frm,bool full_info)
{ 
  ... 
}

執行函式bom_parents_last,查詢列出零件L732808之所有上階的父件資料。

執行的程式碼:

 bom_parents_last("L732808",ListBox3,this,true);
 bom_parents_last("864975",ListBox3,this,true);
 ...
 ...

結果如下圖示:

BOM逆展1

L732808有上階: 865975 875033 M607707
865975 875033均無上階
M607706有上階: 956478 A000401
956478無上階
A000401有上階: 885228 895352 936085 956477

再設計函式bom_parents_full:

// 從pno逆展BOM結構樹
bom_parents_full(String pno,TTreeView *tre,TTreeNode *node0)
{
  if(tre->Items->Count==0){
    node0=tre->Items->AddChild(NULL,pno);
    node0->ImageIndex=0;
    node0->SelectedIndex=0;
  }
  DynamicArray < String > ara;
  ara=bom_parents_last(pno,NULL,NULL,true);
  for(int i=0;i<ara.Length;i++){     TTreeNode *node;     node=tre->Items->AddChild(node0,ara[i]);
    node->ImageIndex=node->Level;
    node->SelectedIndex=node->Level;
    bom_parents_full(str_divide_str(ara[i]," ",3),tre,node); //遞迴執行自己
  }
}
//str_divide_str(ara[i]," ",3) 說明:因ara[i]內容格式為: '總數量 / 件號 中文品名 規格',須以函式str_divide_str以空白做分隔,擷取其第三個文字,即是件號

執行的程式段:

  String pno=DBEdit1->Text.Trim();
  TreeView1->Items->Clear();
  TTreeNode *node0;
  bom_parents_full(pno,TreeView1,node0);
  TreeView1->FullExpand();

結果如下:

BOM逆展2

*** 本文結束 ***

Tagged: ,

2 thoughts on “C++ 利用遞迴設計逆展BOM (Recursive Method Used in BOM implosion)

  1. […] 本文展示C++程式的作法:從一BOM Tree讀取其所有尾階件號資料。 因本例的Tree是以一個零件逆展出來的BOM,因此尾階就是機台了。即查出零件L732808被組裝在7個機台上。(前文:逆展BOM) […]

  2. […] 最近完成C++利用递回设计逆展BOM,分享大家,请多多指教 C++利用递回设计逆展BOM 本文 […]

發表留言