iT邦幫忙

0

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

  • 分享至 

  • xImage
  •  

進行PDM系統設計時,須有一功能:檢查BOM子件所有存在於<父階>及<父階所有父階>的ERP製令狀態--該製令是否未完工或未生產。做此功能函式,應用到遞迴。
利用遞迴設計函式的做法 本文


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
外獅佬
iT邦大師 1 級 ‧ 2015-02-05 13:49:30

為什麼SQL要用組字串的方式?無言

看更多先前的回應...收起先前的回應...
cpc0935 iT邦研究生 5 級 ‧ 2015-02-06 00:18:41 檢舉

不太了解你的疑問,本例是在C++的程式碼。在程式中建立SQL連線,擷取資料,傳回程式做處理。

外獅佬 iT邦大師 1 級 ‧ 2015-02-06 09:10:41 檢舉

AdoQuery可以透過參數話查詢去寫
組SQL查詢字串,能免盡量免吧!
BCB的參數化寫法:

&lt;pre class="c" name="code">
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";
P1 = ADOQuery->Parameters->ParamByName("Pno");
P1->Value = pno;

p2 = ADOQuery->Parameters->ParamByName("Bomno");
p2->Value = bomno
外獅佬 iT邦大師 1 級 ‧ 2015-02-06 09:15:24 檢舉

ㄟ?!不錯,TADOQuery還存在著官方文件
TADOQuery Members
裡頭有提到Parameters的用法

外獅佬 iT邦大師 1 級 ‧ 2015-02-06 09:16:38 檢舉

上頭的範例,故意把SQL的參數與外部傳入的參數值,透過第一個字元大小寫的差異分隔開,避免混淆

cpc0935 iT邦研究生 5 級 ‧ 2015-02-06 17:38:44 檢舉

喔,我知道可以這樣。
但請問差別在哪裡?

0
pantc328
iT邦高手 1 級 ‧ 2015-02-05 14:41:10

強~
但這是很少階層才能用遞回展開

我以前用SQL 遞回寫傳銷系統的左右樹
每個會員下有幾個子會員,幾個左線,幾個右線
缺幾顆球,有多少獎金
獎金怎麼往上拋等..

2,3層運算度都很快
16,17層,上千筆資料用遞回方式..很慢

這樣要用反正規化方式,在資料進入時就要算,而不能在查詢時算

cpc0935 iT邦研究生 5 級 ‧ 2015-02-06 00:21:41 檢舉

謝謝指教,本公司BOM層數不多,頂多5、6層而已。
而依我比較過遞迴及迴圈,兩者效能差不多,速度都可接受。只是最大困擾是在建tree,往往時間都是耗費在DBTreeView上,有夠慢,應該是BCB元件本身的問題了。

0
尼克
iT邦大師 1 級 ‧ 2015-02-05 17:10:16

Oracle 的PL/SQL 提供 oracle start with connect by 也是相同效果。

0
外獅佬
iT邦大師 1 級 ‧ 2015-02-06 09:01:58

SQL Server 2005以上的版本,用Common Table Expression也是可以

0
dondonyen
iT邦新手 4 級 ‧ 2015-02-24 21:45:09

請問各位高手..像類似的BOM.要如何讓他展出來的資料是最低階(尾階)的資料呢?中間的階的品號不管。

例如:

最上階品號,最下階品號,階數,組成用量

0
cpc0935
iT邦研究生 5 級 ‧ 2015-03-04 15:02:33

// 取出TreeView:tre所有最尾階node之Text值,函式傳出陣列
TStringDynArray tree_last_sons_txt(TTreeView *tre)
{
DynamicArray < String > ar;
TTreeNode *nd;
for(int i=0;i<tre->Items->Count;i++)
{
nd=tre->Items->Item[i];
if(nd->getFirstChild()==NULL){
ar.Length++;
ar[ar.Length-1]=nd->Text;
}
}
return ar;
}

用法:
DynamicArray < String > ar; //建一動態陣列
ar=tree_last_sons_txt(TreeView1); //所得的所有尾階件號存入陣列

尼克 iT邦大師 1 級 ‧ 2015-03-04 15:43:06 檢舉

灑花

我要留言

立即登入留言