C++ 利用遞迴設計函式的做法 (Recursive Method Used in desiging a function)

本篇示範利用遞迴設計函式的做法。

// 檢查BOM子件pno所有存在於<父階bomno>及<父階bomno的所有父階>的ERP製令狀態:該製令是否未完工或未生產
bool exist_in_gp_mocta_and_not_done(String pno,String bomno)
{
  bool chk;
  String s=" SELECT MOCTA.TA011 AS 狀態碼, MOCTA.TA013 AS 確認碼 FROM MOCTB INNER JOIN "
           " MOCTA ON MOCTB.TB001 = MOCTA.TA001 AND MOCTB.TB002 = MOCTA.TA002 "
           " WHERE (MOCTA.TA013 = 'Y') AND MOCTB.TB003 = '"+pno+"' AND MOCTA.TA006 = '"+bomno+"'";
  TADOQuery *qu;
  qu = new TADOQuery (Application);
  qu->Connection=DataModule3->ERP_Dahbah;
  qu->SQL->Add(s);
  qu->Active = true;
  if( qu->RecordCount==0                                   || // 無所屬製令
      qu->FieldByName("狀態碼")->AsString.UpperCase()=="Y"  || // Y:已完工)  y:指定完工)
      qu->FieldByName("狀態碼")->AsString=="1"                 // 1:未生產
    )
  {
    chk=false;                                      //但須再執行以下檢查
    //-----------------------------------------
    DynamicArray < String > ar;
    ar=parent_view(bomno,NULL,NULL);                //找出bomno的所有父階,加入陣列ar
    for(int i=0;i<ar.Length;i++)
    {
      if(exist_in_gp_mocta_and_not_done(pno,ar[i])) //<-遞迴   
      {
        chk=true;                                   //若檢查到true,則即跳出
        break;
      }}
    //-----------------------------------------
  }
  else
    chk=true;
  delete qu;qu=NULL;
  return chk;
}

應用實例 :

下圖展示M607706在逆展BOM的位置

檢查BOM子件之父件及父件所有父件的製令的狀態1

//檢查本子件M607706所有存在於父階(A000401)及以上(885228、895352、936085、956477)的製令狀態
  String SON="M607706";
  String MOM="A000401";
  if(exist_in_gp_mocta_and_not_done(SON,MOM)) 
    should_del=false;
  else
    should_del=true;

Tagged: ,

發表留言