数据结构如下
表 inventory
cinvcode(存货编码)  cinvname(产品名称)     cinvccode(大类码)
1A001120             C03-1醇酸磁漆         1A001
1A002520             C03-1                    1A002
   
表 inventoryclass
cinvccode(大类码)   cinvcname(大类名称)  
1A001                    醇酸漆
1A002          C03-1
  主要代码
 with adoquery1 do 
 begin 
  close;
  sql.Clear;
  sql.add('DECLARE @var1 varchar(50)');
  SQL.Add('select @var1=cinvccode from inventoryclass');
  sql.Add('where cinvcname=:s1');
  parameters.ParamByName('s1').Value:=trim(treeview1.selected.text);
  SQL.Add('select * from inventory a');
  sql.Add('where left(a.cinvcode,5)=@VAR1');
end当treeview改变时,只能过滤出C03-1,而C03-1醇酸磁漆过滤不出来
查看其他的发现当'大类名称'是英文和数字是可以过滤出数据,而当鼠标选中的'大类名称'是英文加汉字时,数据好象就传递不过来.请问这是怎么回事.

解决方案 »

  1.   

    with adoquery1 do 
     begin 
      close;
      sql.Clear;
      sql.add('DECLARE @var1 varchar(50)');
      SQL.Add('select @var1=cinvccode from inventoryclass');
      sql.Add('where cinvcname=:s1');
      parameters.ParamByName('s1').Value:=trim(treeview1.selected.text);
      SQL.Add('select * from inventory a');
      sql.Add('where a.cinvccode=@VAR1');//为什么不这样写
    end
    或者直接
    select * from inventory a join
                  inventoryclass b on b.cinvccode=a.cinvccode and
                                      b.cinvcname=isnull(:s1,b.cinvcname)
      

  2.   

    提的问题有点误会,不能按大类码组合,大类码长度有些并不一样。
    具体数据库如下:
    表 inventotyclasscinvccode(大类码)  cinvcname(大类名称)   iinvcgrade(等级) 
     
    1               产成品            1
    1A               氨基漆            2
    1A001               A01-1氨基烘干清漆   3
    1A002                A01-2氨基烘干清漆   3
    1A026              中国蓝氨基醇酸锤纹烘   3
    1A027              中国兰发动机锤纹漆   3
    1A028              朱红超快干磁漆 3   1
    1A029                A04-1自干氨基磁漆   3
    1A0292                白                     4
    1A0293                 红                     4
    1A032                   A936   3
    1A0325              蓝色                      4
    1B                   丙烯漆            2
    1B001              B01-15丙烯酸清漆   3
    1B002             B01-3丙烯酸清漆            3
    1B003             B01-34丙烯酸烘干清漆   3
    1B004              B01-5丙烯酸清漆   3
    1B005              B01-6丙烯酸清漆   3
    1B006                B04-2丙烯酸工程磁漆   3
    1B0062            白色                      4
    1B0063             红色                      4
    1B0064               黄色                      4
    1B0065             兰色                      4
    1B0066            绿色                      4
    1B007            B04-6丙烯酸磁漆             3
    1B0072            白色                      4
    1B0073            红色                      4
    1B0074            黄色                      4
    1B0075             兰色                       4
    1B008             B04-60丙烯酸半光磁漆    3
    1B0085              兰色                       4
    表  inventory  cinvcode(产品编码) cinvname(存货名称)           cinvccode(所属大类)
    1A001100           A01-1氨基烘干清漆     1A001
    1A002100 A01-2氨基烘干清漆     1A002
    1A003100 A01-6氨基烘干清漆     1A003
    1A004303 A04-14桔红氨基烘干静电磁漆     1A0043
    1A004400 A04-14黄色氨基烘干静电磁漆     1A0044
    1A005211 A04-60灰氨基半光烘干磁漆     1A0052
    1A005228 A04-60中绿灰氨基半光烘干磁漆    1A0052
    1A005228G A04-60中绿灰氨基半光烘干磁漆(国标) 1A0052
    1A005228biG A04-60中绿灰氨基半光烘干磁漆(172专用)(国标)1A0052
    1A005213zb A04-60淡灰氨基半光烘干磁漆(20所专板) 1A0052
    1A005216 A04-60银灰氨基半光烘干磁漆 1A0052
    1A005200 A04-60白氨基半光烘干磁漆 1A0052
    1A005216bj A04-60银灰氨基半光烘干磁漆(182专用) 1A0052
    1A005266dp A04-60淡灰白氨基半光烘干磁漆(太原专板) 1A0052
    1A005217G A04-60海灰氨基半光烘干磁漆(国标) 1A0052
    1A005211zb A04-60灰氨基半光烘干磁漆(专板) 1A0052
    1A005232zb A04-60氨基半光磁漆                  1A0052
    1A005300 A04-60红氨基半光烘干磁漆 1A0053   
    1B001100 B01-15丙稀酸清漆 1B001
    1B002110 B01-3辊涂清漆 1B002
    1B002100          B01-3丙烯酸清漆 1B002
    1B003100 B01-34丙烯酸烘干清漆 1B003
    1B005100 B01-6丙烯酸清漆 1B005
    1B006200 B04-2白丙稀酸工程漆 1B0062
    1B006213 B04-2淡灰丙稀酸工程磁漆 1B0062
    1B006213cx B04-2淡灰丙烯酸工程磁漆(瑞达专用) 1B0062
    1B006213ba B04-6淡灰丙烯酸工程磁漆(韦曲专板) 1B0062
    1B006304ac B04-2砖红丙烯酸工程磁漆(西变专板)(雅特专用)1B0063
    1B006304 B04-2砖红丙烯酸工程磁漆 1B0063
    1B006400do B04-2黄丙烯酸工程磁漆(三捷专板) 1B0064
    1B006532zb B04-2孔雀兰丙烯酸工程磁漆(专板) 1B0065
    1B006500zb B04-2兰丙烯酸工程磁漆(专板) 1B0065
    1B006500(W) B04-2孔雀兰丙烯酸工程磁漆(RAL5017专板) 1B0065 
    表 currentstock
    cinvcode(存货编码)    iquantity(结存数量)  一inum(结存件数)   cfree1(包装) 1A001100 .000000 .000000 10L/9
    1A001100 36.000000 4.000000 10L/9
    1A001100 207.000000 23.000000 10L/9
    1A002100 9.000000 1.000000 10L/9
    1A002100 2.000000 1.000000 4L/2
    1A004303 15.000000 1.000000 16L/15
    1A005200 .000000 .000000 10L/12
    1A005200 .000000 .000000 10L/12
    1A005200 384.000000 32.000000 10L/12
    1A005200 336.000000 28.000000 10L/12
    1A005211 .000000 .000000 10L/11
    1A005211 .000000 .000000 10L/12
    1A005211 .000000 .000000 10L/10
    1A005211 .000000 .000000 10L/12
    1A005211 .000000 .000000 10L/11
    1A005211 .000000 .000000 10L/12
    1A005300 22.000000 2.000000 10L/11
    1A005300 6.000000 1.000000 10L/6
    1A005300zb 27.000000 3.000000 10L/9
    1A005507 12.000000 1.000000 10L/12
    1A005800 .000000 .000000 10L/11
    1A005800 .000000 .000000 10L/11
    1A005800 880.000000 80.000000 10L/11
    1A005800 836.000000 76.000000 10L/11
    1A005800 451.000000 41.000000 10L/11
    1A005800bi .000000 .000000 4L/2
    1A005800bi .000000 .000000 4L/2
    1A005800cy 512.000000 32.000000 16l/16
    1A006200 .000000 .000000 10L/12
    1A006200 84.000000 7.000000 10L/12
    1A006617 684.000000 38.000000 16L/18
    1A006800 .000000 .000000 10L/11
    1A006800 .000000 .000000 10L/11
    1A006800 242.000000 22.000000 10L/11
    1A006800 242.000000 22.000000 10L/11
    1A006800 .000000 .000000 10L/11
    1A007200 170.000000 17.000000 10L/10
    1A007211 .000000 .000000 10L/10
    1A007211 .000000 .000000 10L/10
    1A007212zb .000000 .000000 10L/10
    1A007217G .000000 .000000 16l/16
    1A007217G .000000 .000000 16l/16
    1A007300 .000000 .000000 10L/9
    1A007300 36.000000 4.000000 10L/9
    1A007300 9.000000 1.000000 10L/9
    1A007400 96.000000 6.000000 16l/16
    1A007500 81.000000 9.000000 10L/9
      

  3.   

    代码如下:
    unit main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls, Grids, DBGrids, StdCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        ADOQuery1: TADOQuery;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        ADOQuery2: TADOQuery;
        Label1: TLabel;
        Label2: TLabel;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      procedure GetNode;
        procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
      private
      TmpNode,rootNode,Nodel:TTreeNode;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;type
     PMyData=^TMyData;
      TMyData=Record
        nmenuid:string;
        nmenuname:string;
      end;implementation{$R *.dfm}
    procedure TForm1.GetNode;
    var
     parent:string;
     pi,hi,i,tmpi:integer;
     myshuju: PMyData;
    begin
      TreeView1.Items.Clear;
      AdoQuery1.Close;
      ADOQuery1.SQL.Clear;
      adoquery1.SQL.Add('select cinvccode,cinvcname,iinvcgrade from inventoryclass where cinvccode like ''1%'' and iinvcgrade in (1,2,3) order by cinvccode');
      ADOQuery1.open;
      ADOQuery1.First;
      while not adoquery1.Eof do
      begin
        parent:=ADOQuery1.Fields[2].AsString;
        if parent='1' then
        begin
          new(myshuju);
          myshuju^.nmenuid:=ADOQuery1.Fields[0].Asstring;
          myshuju^.nmenuname:=ADOQuery1.Fields[1].Asstring;
          rootNode:=TreeView1.Items.Add(nil,ADOQuery1.Fields[1].asstring);
          rootNode.SelectedIndex:=0;
          Nodel:=rootNode;
          Nodel.Data:=myshuju;
          pi:=strtoint(ADOQuery1.Fields[2].asstring);
          ADOQuery1.Next;
        end
        else
        begin
          hi:=strtoint(ADOQuery1.Fields[2].asstring);
         if hi>pi then   
         //运行时这里提示"variable 'pi' might not have been initialized"
          //但是程序可以运行
           begin
             new(myshuju);
             myshuju^.nmenuid:=ADOQuery1.Fields[0].Asstring;
             myshuju^.nmenuname:=ADOQuery1.Fields[1].Asstring;
             TmpNode:=TreeView1.Items.AddChild(nodel,ADOQuery1.Fields[1].asstring);
             pi:=hi;
             nodel:=tmpNode;
             nodel.Data:=myshuju;
             ADOQuery1.next;
           end
           else
          if hi=pi then
              begin
               new(myshuju);
               myshuju^.nmenuid:=ADOQuery1.Fields[0].Asstring;
               myshuju^.nmenuname:=ADOQuery1.Fields[1].Asstring;
               TmpNode:=TreeView1.Items.AddChild(nodel.Parent,ADOQuery1.Fields[1].asstring);//创建同级节点
               pi:=hi;
               nodel:=TmpNode;
               nodel.Data:=myshuju;
               ADOQuery1.next;
              end       else
            if hi<pi then
              begin
                tmpi:=(pi-hi);
                for i:=0 to tmpi do
                begin
                  nodel:=nodel.Parent;
                end;
                  new(myshuju);
                  myshuju^.nmenuid:=ADOQuery1.Fields[0].Asstring;
                  myshuju^.nmenuname:=ADOQuery1.Fields[1].Asstring;
                  TmpNode:=TreeView1.Items.Addchild(nodel,ADOQuery1.Fields[1].asstring);
                  pi:=hi;
                  nodel:=TmpNode;
                  nodel.Data:=myshuju;
                  ADOQuery1.next;
              end;
              end;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    GetNode;
    end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
      edit1.Text:=tlabel(treeview1.Selected.).caption;
      with AdoQuery2 do
      begin;
      close;
      sql.Clear;
      sql.add('DECLARE @var1 char(500)');
      SQL.Add('select @var1=cinvccode from inventoryclass');
      sql.Add('where cinvcname=:s1');
      Parameters.ParamByName('s1').Value:=trim(treeview1.Selected.Text);
      SQL.Add('select a.cinvname,a.cinvcode,b.cfree1,b.iquantity,b.inum from inventory a,currentstock b');
      sql.Add('where left(a.cinvcode,5)=@VAR1 and a.cinvcode=b.cinvcode');
      ExecSQL;
      Open;
      end;end;end.如果查询的大类名称是汉字就过滤不出来,如‘A01-1氨基烘干清漆‘
    如果查询的大类是数字和英文就可以,如’A936‘
    请高手指点!!!!