我觉得可以这样:
1、总装规格定义表:
[总装图号] [产品号][规格号] [规格描述]
ck2.1.1.1 ck2.1.1 1 10A
ck2.1.1.2 ck2.1.1 2 16A
ck2.1.1.3 ck2.1.1 3 20A
........
ck5.1.1.1 ck5.1.1 1 10A
ck5.1.1.2 ck5.1.1 2 16A
ck5.1.1.3 ck5.1.1 3 20A
........2、总装组成结构表:
[产品号] [序号] [部件图号] [台用量] [是否通用件] []
ck2.1.1 1 CK5.1.1 3 是
ck2.1.1 2 ck6.1.1 3 是
ck2.1.1 3 ck8.1.1 1 是
ck2.1.1 4 ck5.1.1 1 否
.........
ck5.1.1 1 ck8.2.2 1 是
ck5.1.1 2 ck5.2.2 2 是
ck5.1.1 3 ck5.1.2 X 否
.........
3、总装规格组成表:(其中序号是第二个表中[是否通用件]为否的序号)
[产品号] [规格号] [序号] [部件图号] [台用量]
ck2.1.1 1 4 ck5.1.1.1 1
ck2.1.1 2 4 ck5.1.1.2 1
ck2.1.1 3 4 ck5.1.1.3 1
......
ck5.1.1 1 3 ck5.1.2.1 X
ck5.1.1 2 3 ck5.1.2.2 X
ck5.1.1 3 3 ck5.1.2.3 X
.....
1、总装规格定义表:
[总装图号] [产品号][规格号] [规格描述]
ck2.1.1.1 ck2.1.1 1 10A
ck2.1.1.2 ck2.1.1 2 16A
ck2.1.1.3 ck2.1.1 3 20A
........
ck5.1.1.1 ck5.1.1 1 10A
ck5.1.1.2 ck5.1.1 2 16A
ck5.1.1.3 ck5.1.1 3 20A
........2、总装组成结构表:
[产品号] [序号] [部件图号] [台用量] [是否通用件] []
ck2.1.1 1 CK5.1.1 3 是
ck2.1.1 2 ck6.1.1 3 是
ck2.1.1 3 ck8.1.1 1 是
ck2.1.1 4 ck5.1.1 1 否
.........
ck5.1.1 1 ck8.2.2 1 是
ck5.1.1 2 ck5.2.2 2 是
ck5.1.1 3 ck5.1.2 X 否
.........
3、总装规格组成表:(其中序号是第二个表中[是否通用件]为否的序号)
[产品号] [规格号] [序号] [部件图号] [台用量]
ck2.1.1 1 4 ck5.1.1.1 1
ck2.1.1 2 4 ck5.1.1.2 1
ck2.1.1 3 4 ck5.1.1.3 1
......
ck5.1.1 1 3 ck5.1.2.1 X
ck5.1.1 2 3 ck5.1.2.2 X
ck5.1.1 3 3 ck5.1.2.3 X
.....
假设有一产品构成表(product_stru)如下 右边为存储过程产生的结果。在PB里可用DATAWINDOW测试(需增加缩排条件) Product_no Part_no Part_qty -------> 层次结构:
---------------------------------------------------
PRODUCT01 A 3 PRODUCT01
PRODUCT01 B 1 A
A XXX 1 XXX
B PART01 2 PART01
B PART02 1 PART03
XXX PART01 3 B
XXX PART03 4 PART01
... ... ... PART02
下面是基于sybase sql anywhere实现的存储过程
//定义存储过程:create procedure parts_explosion() //in @current char(25)result(part_no char(25),structure_level integer,structure_qty decimal(15,6),children integer,siblings integer,open_children integer,same_level integer)begindeclare @current char(25); //存放当前待查产品或零件declare @level integer; //存放产品层次declare @structure_qty decimal(15,4); //存放构成数量select '最初产品编号' into @current; //后台测试用create table #stack( //中间结果存表current_item char(25) null, part_level integer null,part_qty decimal(15,4) null,);create table #parts( //最后返回结果存放表part_no char(25) null,structure_level integer null,structure_qty decimal(15,6) null,children integer null, //存放如果有子级产品.则1.否0.siblings integer null, //存放是否邻居产品open_children integer null, //前台用same_level integer null, //前台用);/* SELECT @current='45860020A'*/insert into #stack values(@current,1,1); //初始中间表select 1 into @level; while @level>0 loopif exists(select* from #stack where part_level=@level) thenselect current_item,part_qty into @current,@structure_qty from #stackwhere part_level=@level;if @level<>1 theninsert into #parts values(@current,@level,@structure_qty,1,1,1,1)end if;delete from #stackwhere part_level=@level and current_item=@current;insert into #stackselect part_no,@level+1,part_qtyfrom product_struwhere product_no=@current;if @@rowcount>0 thenselect @level+1 into @level;if @@rowcount=1 thenupdate #parts set same_level=0where part_no=@currentend ifelseupdate #parts set children=0where part_no=@currentend ifelseselect @level-1 into @levelend ifend loop;select part_no,structure_level,structure_qty,children,siblings,open_children,same_level from #partsend------------------------------------
是个梯归过程,有什么不适合的地自己改改吧!
你的方法是不错,但有一个问题。(可能上次写的不清楚)
你的库结构:
2、总装组成结构表:
[产品号] [序号] [部件图号] [台用量] [是否通用件] []
ck2.1.1 1 CK5.1.1 3 是
ck2.1.1 2 ck6.1.1 3 是
ck2.1.1 3 ck8.1.1 1 是
ck2.1.1 4 *ck5.1.1 1 否
.........
ck5.1.1 1 ck8.2.2 1 是
ck5.1.1 2 ck5.2.2 2 是
ck5.1.1 3 ck5.1.2 X 否
但 ck2.1.1.1~10 序4 可能是这样的(上面打*处)
ck2.1.1.1~5 是 与 ck5.1.1.1~5 对应的
ck2.1.1.6~10 是 与 ck5.1.1.6~10 对应的
我知道,可能你没理解我的意思。打*这行[是否通用件]一栏是“否”,就是说这里[部件图号]字段只给出产品号,根据ck2.1.1的规格号从第三个表中取相应的部件图号和用量,若[是否通用件]中是“是”,就直接取这个数。比如我现在要做一批ck2.1.1.1, 先从第二个表中取出所有[是否通用件]中是“是”的部件计算,再取出[是否通用件]中是“否”的从第三个表中取[产品号]是ck2.1.1 ,规格号是1的记录来计算(这里对应的是每一条记录,部件号是ck5.1.1.1)。若ck2.1.1 有10 种规格,第一个表中就会有10条记录,第三个表中也有条记录。
这种方法比每种规格做一个对照表记录数要少得多。
Thank you very much!