在BOM中,我们可以根据成品查找下层->最低层物料,组成产品的树形结构。
现在我在反过来使用,就是根据低层物料,查找有多少种成品中使用到它。比如:
成品1:=物料A+物料B+物料C 组成;
成品2:=物料A+物料D+物料E 组成。现根据物料A进行查找,就可以得出成品1,成品2。(即成品1,成品2中使用了物料A)给出代码,马上结贴,100分奉上,多谢了!不够在开新贴给分,因为CSDN系统限制我一次最多只能给出100分(级别太低,不好意思!)

解决方案 »

  1.   

    1、在数据库中,不可能是树形数据库,只是程序把数据从数据库中以树形方式显示在TreeView中而已
    2、在数据库中直接查找你要的数据再加分析
      

  2.   

    不清楚可以看:
    http://community.csdn.net/Expert/topic/4309/4309888.xml?temp=.3988916在线等结果,满意马上结贴,多谢了!
      

  3.   

    不好意思,打错贴子的网址了,现更正:http://community.csdn.net/Expert/topic/4332/4332923.xml?temp=5.079287E-02
      

  4.   

    可否写一个算法,列出来嘛。(andrew223的朋友)
      

  5.   

    算法这里有,这也是我开的贴:http://community.csdn.net/Expert/topic/4332/4332923.xml?temp=5.079287E-02在线等,多谢了!
      

  6.   

    以产品-中间件-物料最多有4层为例:
    select p,c from pctable
    P    C    
    ---- ---- 
    A    A1
    A    A2
    A    B3
    B    B1
    B    B2
    B    B3
    B3   D1
    B3   D2
    D1   E1
    D1   E2CREATE  VIEW dbo.PCTREE
    AS
    SELECT dbo.pctable.p, dbo.pctable.c AS C1, pctable_1.c AS C2, pctable_2.c AS C3
    FROM dbo.pctable pctable_2 RIGHT OUTER JOIN
          dbo.pctable pctable_1 ON pctable_2.p = pctable_1.c RIGHT OUTER JOIN
          dbo.pctable ON pctable_1.p = dbo.pctable.cSELECT * FROM PCTREE
    p    C1   C2   C3   
    ---- ---- ---- ---- 
    A    A1   NULL NULL
    A    A2   NULL NULL
    A    B3   D1   E1
    A    B3   D1   E2
    A    B3   D2   NULL
    B    B1   NULL NULL
    B    B2   NULL NULL
    B    B3   D1   E1
    B    B3   D1   E2
    B    B3   D2   NULL
    B3   D1   E1   NULL
    B3   D1   E2   NULL
    B3   D2   NULL NULL
    D1   E1   NULL NULL
    D1   E2   NULL NULLCREATE VIEW dbo.pcview
    as
    SELECT p as '产品',isnull(c3,isnull(c2,c1)) AS '物料' FROM PCTREE
    where p not in (select c from pctable)select * from pcview
    产品   物料   
    ---- ---- 
    A    A1
    A    A2
    A    E1
    A    E2
    A    D2
    B    B1
    B    B2
    B    E1
    B    E2
    B    D2求用到物料B2的产品:
    select 产品 from pcview where 物料 like 'B2'
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type TMultiArr = array of array of string;
    type TArr = array of string;type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        function GetLeaf(arr: array of string; rsArr:TMultiArr; var rs: TArr):boolean;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }function TForm1.GetLeaf(arr: array of string; rsArr:TMultiArr; var rs: TArr): boolean;
    var
      i,j,k:integer;
      tmpArr:array of string;
      bFlag:boolean;
    begin
      Result := True;  k := High(arr)-Low(arr)+1;
      if k=0 then Exit;  for j:= Low(arr) to High(arr) do
      begin
        bFlag := False;
        for i:= Low(rsArr) to High(rsArr) do
        begin
          if AnsiSameStr(Trim(arr[j]),Trim(rsArr[i,1])) then
          begin
            bFlag := True;
            SetLength(tmpArr,High(tmpArr)-Low(tmpArr)+2);
            tmpArr[High(tmpArr)-Low(tmpArr)]:=rsArr[i,0];
          end;
        end;
        if not bFlag then
        begin
          SetLength(rs,High(rs)-Low(rs)+2);
          rs[High(rs)-Low(rs)]:=arr[j];
        end;
      end;
      GetLeaf(tmpArr,rsArr,rs);
      Result := True;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      rs:TArr;
      rsArr:TMultiArr;
      i:integer;
    begin
      SetLength(rsArr,11);
      for i:=low(rsArr) to High(rsArr) do
        SetLength(rsArr[i],2);
      rsArr[0,0] := 'A';
      rsArr[0,1] := 'A1';
      rsArr[1,0] := 'A';
      rsArr[1,1] := 'A2';
      rsArr[2,0] := 'A';
      rsArr[2,1] := 'B3';
      rsArr[3,0] := 'B';
      rsArr[3,1] := 'B1';
      rsArr[4,0] := 'B';
      rsArr[4,1] := 'B2';
      rsArr[5,0] := 'B';
      rsArr[5,1] := 'B3';
      rsArr[6,0] := 'B3';
      rsArr[6,1] := 'D1';
      rsArr[7,0] := 'B3';
      rsArr[7,1] := 'D2';
      rsArr[8,0] := 'B3';
      rsArr[8,1] := 'D3';
      rsArr[9,0] := 'D3';
      rsArr[9,1] := 'E1';
      rsArr[10,0] := 'D3';
      rsArr[10,1] := 'E2';
      GetLeaf(['E1'],rsArr,rs);
      Memo1.Lines.Clear;
      for i := Low(rs) to High(rs) do
        Memo1.Lines.Add(rs[i]);
    end;end.