我觉得可以这样:
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.   

    http://www.csdn.net/expert/topic/243/243213.shtm
      

  2.   

    MRP中BOM表的关键技术--部件爆炸在ERP/MRPII或任何生产系统中,BOM(Bill of material)表中的共同关键技术--部件爆炸(产品构成表分层的展开) 
         假设有一产品构成表(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------------------------------------
    是个梯归过程,有什么不适合的地自己改改吧!
      

  3.   

    To: icevi(按钮工厂) 
     你的方法是不错,但有一个问题。(可能上次写的不清楚)
     你的库结构:
    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 对应的
      

  4.   

    applekiller():
    我知道,可能你没理解我的意思。打*这行[是否通用件]一栏是“否”,就是说这里[部件图号]字段只给出产品号,根据ck2.1.1的规格号从第三个表中取相应的部件图号和用量,若[是否通用件]中是“是”,就直接取这个数。比如我现在要做一批ck2.1.1.1, 先从第二个表中取出所有[是否通用件]中是“是”的部件计算,再取出[是否通用件]中是“否”的从第三个表中取[产品号]是ck2.1.1 ,规格号是1的记录来计算(这里对应的是每一条记录,部件号是ck5.1.1.1)。若ck2.1.1 有10 种规格,第一个表中就会有10条记录,第三个表中也有条记录。
    这种方法比每种规格做一个对照表记录数要少得多。
      

  5.   

    To icevi(按钮工厂):
      Thank you very much!