VD3產生BOM的範例..
主程式:
* 產生單一成品的BOM表.
ARRAY('I',1,1) && 宣告一個二維的ARRAY,存放BOM表
CDS4.EXECUTE("DELETE BOM WHERE ITEM_NO=&(CDS0.'ITEM_NO')")
CDS0.REFRESH()
CDS3.DISABLE()
GENBOM1(CDS0.'ITEM_NO',1,'',1) && 呼叫遞歸次程序
CDS3.ENABLE()
IF CDS0.STATE<>1 &&如果有INSERT BOM的話
CDS0.POST()
ENDIF
RETURN
*****************
GENBOM1次程序:
* 本程序為一個遞歸的程序
PARAMETERS ITEM,LAYER,MTREE,QTY
IF LAYER>20
MESSAGE('料件階層超過!')
RETURN
ENDIF
CDS4.SEND("SELECT PART_NO,USED_QTY,REMARK,ITEM.POST AS TYPE FROM PARTS;
LEFT JOIN ITEM ON PARTS.PART_NO=ITEM.ITEM_NO WHERE PARTS.ITEM_NO=&(ITEM)")
IF CDS4.EOF() && 沒有料件
RETURN
ENDIF
POS=1 && POS為料件位置,因為CDS4為多層共用, 所以必須用ARRAY I記錄下來
DO WHILE .NOT. CDS4.EOF()
SELECT CDS4
I[LAYER,POS]=TYPE+','+PART_NO+','+STR(USED_QTY,5)+','+REMARK
&& 將多個字段以','記錄下來
CDS4.SKIP(1)
POS=POS+1
ENDDO
POS=1
DO WHILE POS<=LEN(I[LAYER])
DATA=I[LAYER,POS]
CDS3.INSERT()
CDS3.REPLACE('ITEM_NO',CDS0.'ITEM_NO')
CDS3.REPLACE('TREE',MTREE+STR(POS,2))
CDS3.REPLACE('PART_NO',GETPARA(DATA,1))
MQTY=VAL(GETPARA(DATA,2))*QTY && 料件數量
CDS3.REPLACE('USED_QTY',MQTY)
CDS3.REPLACE('SEMI_PART',GETPARA(DATA,0))
CDS3.POST()
IF DATA='S'
GENBOM1(GETPARA(DATA,1),LAYER+1,MTREE+STR(POS,2),MQTY)
ENDIF
POS=POS+1
ENDDO
RETURN
*********************
以上,CDS0為ITEM,CDS3為BOM的(CDS0的Detail),CDS4為空的(下SQL用的)
本程序限制20階,如要再多,請增加TREE的字段寬,每個成品/半成品
料件數限制為99個,如超過要將TREE以每3個BYTE為單位.
***** 請下載Sample.VDS與ITEM/PARTS/BOM的SQL/DAT
下載文件:
http://www.infolight.com.tw/download/QAFiles/SAMPLE1.zip