在delphi5 中怎樣展開BOM,有原代碼奉獻嗎?(300分)

  • 主题发起人 主题发起人 bolly
  • 开始时间 开始时间
B

bolly

Unregistered / Unconfirmed
GUEST, unregistred user!
首先介绍一下我的基本情况吧~
本人一直从事MRPII(MFG/PRO)的第二次开发, 不过都是用的Progress 数据库语言,在UNIX环境下。大家也应该知道MRPII 的数据库相当庞大,一个BOM表就有几十万条记录。如果用递归在整个表中搜寻,将会特别的慢,我参考过好多BOM展开的例子, 它们都是遍布整个表这样搜索,大家想想这样有多慢呀! 不知各位高手是否有更好的例子贴出来, 老兄先谢了。

最近有一种想法, 就是根据我对MRPII的思想,想用DELPHI 写一套MRPII,但在写的过程中遇到好多问题,以使我失去好多信心,大家给点信心,给点力量吧~
在Progress中有 findfirst,findnext,findlast 过程,但在delphi中我就不知用什么好了。
BOM 表结构如下:
Table:bom_mstr bom主表

Field:bom_parent 产品主件
A
A1
A3

Table:ps_mstr 结构表
Field:ps_parent(主件) ps_comp(子件) ps_qty(用量)
A A1 1
A A2 1
A A3 2
A1 A1-1 3
A1 A1-2 1
A3 A3-1 1

最后展开的结果如下
A 成品
.1 A1 1
..2 A1-1 3
..2 A1-2 1
.1 A2 1
.1 A3 2
..2 A3-1 1

各位可以实现这种结果吗?

这是父查子,还有子查父又怎样实现呢?
 
先得到一级的BOM清单,存放到一临时表result中,同时增加并设置lev字段为1,lev为层次说明

得到次级BOM清单

select * from bom_mstr where 主件 in (select 子件 from result)

判断取出的记录数是否大于0,如大于0,即进入循环,如为0,说明无下层BOM单

while 次级BOM单记录数>0 do
begin
lev:=lev+1;
将次级bom单加入result,设置新加入result记录的lev层次值

select * from bom_mstr where 主件 in
(select 子件 from result where lev=当前的层次值)

如取出的记录数为0循环结束,说明已经到最底层BOM单,大于0,说明还有下层BOM单,继续循环
end;

到此,所有层次下的元件清单都已得到

对result进行 主件+子件 排序,如下
在此可以用SQL语句得到序号也可用遍历记录的方法来得到序号

Field:ps_parent(主件) ps_comp(子件) ps_qty(用量) 序号 层级
A A1 1 00001 1
A A2 1 00002 1
A A3 2 00003 1
A1 A1-1 3 00004 2
A1 A1-2 1 00005 2
A3 A3-1 1 00006 2

再增加临时字段来存放序号,再进行相应运算,得到如下结果

Field:ps_parent(主件) ps_comp(子件) ps_qty(用量) 序号 层级
A A1 1 00001 1
A A2 1 00002 1
A A3 2 00003 1
A1 A1-1 3 0000100004 2
A1 A1-2 1 0000100005 2
A3 A3-1 1 0000300006 2

对序号排序号后得到如下

Field:ps_parent(主件) ps_comp(子件) ps_qty(用量) 序号 层级
A A1 1 00001 1
A1 A1-1 3 0000100004 2
A1 A1-2 1 0000100005 2
A A2 1 00002 1
A A3 2 00003 1
A3 A3-1 1 0000300006 2

以上所有步骤均可用SQL语句达到要求,在ACCESS2000+ADO+DELPHI下通过。
写得粗劣了点,不足处请见谅。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1034180
可供参考
 
你用oracle 吧,它有条命令专门做这个迭代的

select
connect
start with ...

记不清了,太晚了,晚上再帮你找



 
接受答案了.
 
后退
顶部