本文解說以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);
...
...
結果如下圖示:
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();
結果如下:
*** 本文結束 ***
Tagged: BCB, C++
[…] 本文展示C++程式的作法:從一BOM Tree讀取其所有尾階件號資料。 因本例的Tree是以一個零件逆展出來的BOM,因此尾階就是機台了。即查出零件L732808被組裝在7個機台上。(前文:逆展BOM) […]
讚讚
[…] 最近完成C++利用递回设计逆展BOM,分享大家,请多多指教 C++利用递回设计逆展BOM 本文 […]
讚讚