ERP中的BOM清单。多级情况下,如何计算出所耗原材料?(200)

  • 主题发起人 主题发起人 fly555
  • 开始时间 开始时间
F

fly555

Unregistered / Unconfirmed
GUEST, unregistred user!
比如:A产品由 1个B 和 2个C组成。B是最末级了。C不是最末级。C是由 3个D 以及 4个E组成。E可能还要往 下分。那么A最终由N级。这个级数也是不确定的。最后怎么计算出一定量的A具体分别有哪些最末级的材料组成的呢?
 
两种方法,一种是类似递归,一级一级的找;另一种比较省事,就是建一个新的表,专门存放这些材料组成及用量。
 
一般没有ERP的公司,用EXCEL来算物料就是按第二种来处理先计算出最终物料保存起来,不过很粗糙,无法核算中间物料的库存和、计划和消耗动态
 
递归计算bom的有人能贴些代码吗?
 
递归的不会,都是无限循环
 
写个存储过程,递归
 
我也想知道怎么解决这个问题啊,高手给点意见啊。
 
我们厂的只有4级。所以还好写。不知这种不知到级数的递归怎么写,顶一下。
 
存储过程加递归。
 
搞递归,多麻烦呀计算bom数量,我都是搞个条件循环来处理的,逻辑简单while exist(select * from ****) do***
 
递归也不会说不过去了,不过sql的递归最多是有13层的限制
 
做一个中间表,专门管理产品的层次,这是我软件用到的中间层,递归算法procedure pdCcCreate(Aid,Aclid,Aclmc:string; ASql1:string=''; ASql2: string='';M:integer=1;ACc:string='1';ACs:integer=1;Asl:Double=1); //创建层次procedure pdCcCreate(Aid, Aclid, Aclmc, ASql1:string; ASql2: string; M: integer;ACc:string;Acs:integer;Asl:double);var adotmp:TADOQuery; Sqlstr,lb:string; Sql3,sql4:string; id,clid,clmc:string; i:integer; sl:double;begin try if m>10 then begin Fbl :=true; exit; end; adotmp :=TADOQuery.Create(nil); adotmp.Connection :=fdm.adocnn ; Sqlstr:='select * from Pl_Wljcsj_Wl where lb=''组件'' and id='+quotedstr(Aid); adotmp.SQL.Text:=Sqlstr; adotmp.Open; if Asql1='' then ASql1:='insert into Pl_Wljcsj_Cc(id,zjno,zjname,Cid1,CName1'; if Asql2='' then ASql2:='values('+quotedstr(Aid)+','+quotedstr(Aclid) +','+quotedstr(Aclmc)+','+quotedstr(Aclid) +','+quotedstr(Aclmc); i:=1; // Asl:=adotmp.fieldbyname('sl').AsCurrency*Asl; if not adotmp.IsEmpty then begin while not adotmp.eof do begin id:=adotmp.fieldbyname('lmid').AsString ; clid:=adotmp.fieldbyname('clid').AsString ; CLmc:=adotmp.fieldbyname('clmc').AsString ; Sql3:=ASql1+',Cid'+inttostr(m+1)+','+'Cname'+inttostr(m+1); Sql4:=ASql2+','+quotedstr(clid)+','+quotedstr(CLmc); Sl:= adotmp.fieldbyname('sl').AsCurrency; pdCcCreate(id, clid, CLmc,Sql3, Sql4,m+1,Acc+'-'+inttostr(i),ACs+1,Asl*Sl); adotmp.Next; i:=i+1; end; end else begin lb:='End'; // Sl:= adotmp.fieldbyname('sl').AsCurrency; end; Sqlstr:=ASql1+',lmid,clid,clmc,lb,cc,cs,sl)'+ ASql2+','+quotedstr(Aid)+',' +quotedstr(Aclid)+','+quotedstr(Aclmc)+','+quotedstr(lb)+','+quotedstr(Acc)+','+inttostr(Acs)+','+floattostr(Asl)+')'; fdm.adocnn.Execute(Sqlstr); finally adotmp.Free; end;end;
 
估计你的算法会非常慢
 
1.在保存BOM时,要注意是否引用循环了。2.用递归算法来处理比较容易,当然效率也不高。(递归算法不一定要一个个物料处理的)ps:如果用Oracle的,可以试一下递归查询,很爽的。
 
递归很简单呀http://www.delphibbs.com/keylife/iblog_show.asp?xid=7547根据这个贴子的思路再改成你的求和的吧如果是Oracle的,就如cancheung所说用,递归查询
 

Similar threads

D
回复
0
查看
876
DelphiTeacher的专栏
D
D
回复
0
查看
936
DelphiTeacher的专栏
D
D
回复
0
查看
951
DelphiTeacher的专栏
D
D
回复
0
查看
781
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部