VD3產生BOM的範例..

andy_KAO 2004-11-20 09:52:27
主程式:
* 產生單一成品的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
...全文
150 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fansoft 2004-11-22
  • 打赏
  • 举报
回复
很不错,希望有更多的人提供出来相互学习。
andy_KAO 2004-11-22
  • 打赏
  • 举报
回复
再分享,料件不合理遞歸的檢查方法:
將GENBOM1的中間那段改成:
POS=1 && POS為料件位置,因為CDS4為多層共用, 所以必須用ARRAY I記錄下來
DO WHILE .NOT. CDS4.EOF()
SELECT CDS4
IF !(PART_NO==CDS0.'ITEM_NO') && 料件不能與成品料號相同
L=1
DO WHILE L<LAYER
POS2=VAL(SUBSTR(MTREE,2*(L-1)+1,2))
IF PART_NO==GETPARA(I[L,POS2],1) &&檢查不合理遞迴
MESSAGE('料件重復:'+PART_NO+',在第'+MTREE+'位置上')
RETURN
ENDIF
L=L+1
ENDDO
ENDIF
I[LAYER,POS]=TYPE+','+PART_NO+','+STR(USED_QTY,5)+','+REMARK
&& 將多個欄位以','記錄下來
CDS4.SKIP(1)
POS=POS+1
ENDDO
linuxsea 2004-11-20
  • 打赏
  • 举报
回复
andy,我用了寫得很棒!謝謝andy,願意無私寫出來,供大家使用。我現在作BOM再也不把ITEM跟物料檔分開了。用一個ITEM就可以了。
linuxsea 2004-11-20
  • 打赏
  • 举报
回复
謝謝andy,無私的提供。

2,209

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 其他数据库
社区管理员
  • 其他数据库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧