常常在設計連結資料庫程式的時候, 階層式架構的 Table 大致上都是母子在同一行的樣式來設計,
資料庫 Table 是容易設計,不過呢? 要把所有的階層展開時,程式就不容易寫,且執行效能也低落,
其實 SQL 是可以做遞迴查詢的,不但不用寫程式一直 WHILE 跑迴圈 , 而且執行效率更快.
以下是 TIPTOP 5.x 的多階 BOM 的 Oracle 範例:
select level,bmb02,bmb01,bmb03,bmb04,bmb05 from bmb_file,bma_file,ima_file
where (bmb05 > sysdate or bmb05 is null)
and (bmb04 < sysdate or bmb04 is null)
and bma01 = bmb01 and bmaacti = 'Y'
and bma01 = ima01
connect by bmb01 = prior bmb03 and (bmb05 > sysdate or bmb05 is null) and (bmb04 < sysdate or bmb04 is null) and bmaacti = 'Y'
start with ima01 = '料件編號' and (bmb05 > sysdate or bmb05 is null) and (bmb04 < sysdate or bmb04 is null) and bmaacti = 'Y'
抓取最新的 BOM , 有生失效日的判斷 , 重點是還有階層數喔~~
可以試試看.
再提供一些相關的指令:
LEVEL:階數
SYS_CONNECT_BY_PATH(欄位,符號):可以列出整個路徑出來,符號用 -> 會比較清楚
CONNECT_BY_ISLEAF:可以判斷是不是最底層
CONNECT_BY_ROOT(欄位):顯示最上層的資料欄位
CONNECT_BY_ISCYCLE:判斷是否有迴圈
NOCYCLE:加在 CONNECT BY 後面有迴圈的就不繼續往下,可配合 CONNECT_BY_ISCYCLE 使用
very good, special syntax
回覆刪除您好關於展BOM有問題想請教您,謝謝。
回覆刪除如果在程式中展BOM,我參考abmq502的方式,
移植到客製時,產生特別的情況:
假設件號有3階:0,1,2
第1階有3個件號:a1,a2,a3
a1下有9個件號:a11,a12,...,a19(底下無子件)
找的方式是:找每階的第1個件號,如底下有子件,則繼續找,底下無子件則回到上1階找第2個件號。
當我找到a11時,再回到第1階,我的變數值a2,a3則會被a12,a13取代,而標準程式並不會。
這個問題很困擾我,先謝謝您的協助了。
q502_bom 是以遞迴的方式來呼叫,有下一階就會自已再呼叫自已,
刪除變數在記憶體就會劃分不同區域,變數值是不會互相影響,
要用 q502_bom 的區域變數,不能用全域變數來給值。
謝謝您的回答,我趕快來測試測試!!
回覆刪除就如同您所說的,使用區域變數才能達到效果。
回覆刪除謝謝你。
請問以start with CONNECT BY 如果從子件已經查詢到父件了,可以在加程式查詢此父件以下的所有階層或子件嗎??謝謝
回覆刪除