我已经能在数据库中动态加载数了,因为值分了2个大的节点,所以主数(最外面的)相当于写死了,里面的内容是数据库读的,
现在想获取数中的值,(选中数)然后作为查询条件查询,
请问:怎么可取到数中的值(条件查询),注:选主数子数就全选了,我的数就2层(第二层是数据库读的)
  谢谢      代码如下:
procedure Tform1.pdLoadBumen;
var
  str:String;
  i:Integer;
  TNode:TTreenode;
begin
  RzCheckTree1.Items.Clear;
  with qryTree do
  begin
  close;
  sql.Text:='select * from bumen where bm<80 order by bms';
  open;
  for i:=0 to 1 do
  begin
      if i=0 then
      begin
          str:='商场部';
      end
      else
      begin
          str:='天地部';
      end;
          TNode:=RzCheckTree1.Items.AddChild(nil,str);
          TNode.ImageIndex :=0;
          TNode.SelectedIndex:=0;
          pdLoadFenBu(TNode);
   end;
  end;
 end;procedure Tform1.pdLoadFenBu(aTvNode:TTreeNode);
var
  str:string;
  i:integer;
begin
  str:=aTvNode.text;
  //i:=Pos('[',str);
  //if i=0 then Exit;
  //str:=Copy(str,i+1,2);
  with qrytree1 do
  begin
    Close;
    if str='商场部' then
      begin
        sql.Text:='Select * from bumen where bm='+Quotedstr(str)+' or bm<80 order by bms ';
      end
    else
      begin
        sql.Text:='Select * from bumen where bm='+Quotedstr(str)+' or bm>=80 order by bms ';
      end;
    open;
    while not eof do
    begin
      str:=qrytree1.fieldbyName('bms').AsString+'['+qrytree1.fieldbyName('bm').AsString+']';
      (RzCheckTree1.Items.AddChild(aTvNode,str)).ImageIndex:=0 ;
      Next;
    end;
    Close;
  end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
  form1:=nil;
end;procedure TForm1.FormShow(Sender: TObject);
begin
       Form1.FormInit;
end;

解决方案 »

  1.   

    我现在要从数中勾选 ,然后做为条件查询
    +A部门                      ----相当于写死了
    -B部门                      ----相当于写死了
      -B1部门                   ----从数据库读的
      -B2部门                   ----从数据库读的
      -B3部门                   ----从数据库读的
      -B4部门                   ----从数据库读的
      -B5部门                   ----从数据库读的
      -B6部门                   ----从数据库读的
      

  2.   

    你要勾选谁,要查谁
    勾选完,就判断那个node被选中了,然后组织查找条件
      

  3.   

    node在哪里?
    这是人家原来写的 ,我有点看不明白请高人指点下!  最好写点注释,谢谢(我刚学DELPHI,这个是公司让做的面试题目)procedure TForm1.SpeedButton2Click(Sender: TObject);
      //beginvar
      I: INteger;
      sBM,sFBM: string;
      sStr: string;
    begin
      sBM:='';
      sFBM:='';  for i:=0 to RzCheckTree1.Items.Count -1 do
      begin
        if RzCheckTree1.ItemState[i]=csunchecked then continue;    if (RzCheckTree1.Items[i].Level=1) and
           (RzCheckTree1.ItemState[(RzCheckTree1.Items[i].Parent).AbsoluteIndex]=csChecked) then Continue;    if RzCheckTree1.ItemState[i]=cschecked then
        begin
          if RzCheckTree1.Items[i].Level=0 then
          begin
            sBM := Copy(RzCheckTree1.Items[i].Text,pos('[',RzCheckTree1.Items[i].Text)+1,2);
            if sStr = '' then
              sStr := '(DOC.BM='''+sBM+''')'
            else
              sStr := sStr+ ' or (DOC.BM='''+sBM+''')';
          end
          else
          begin
            sBM := Copy((RzCheckTree1.Items[i].Parent).Text,pos('[',(RzCheckTree1.Items[i].Parent).Text)+1,2);
            sFBM := Copy((RzCheckTree1.Items[i]).Text,pos('[',(RzCheckTree1.Items[i]).Text)+1,2);
            if sStr = '' then
              sStr := '(DOC.BM='''+sBM+''' and DOC.FB='''+sFBM+''')'
            else
              sStr :=  sStr+ ' or (C.BM='''+sBM+''' and DOC.FB='''+sFBM+''')';
          end;
        end;
      end;
     // }
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select c.bms as 部门名称,count(*) as 数量,abs(sum(je)/100) as 金额,b.rq as 日期  from doc a join sfdata b on a.bh=b.bh join bumen c on a.bm=c.bm where a.bm<80 and b.jh>=20  ');
        ADOQuery1.SQL.Add(' and b.rq >='+formatdateTime('YYYYMMDD',s_date.date)+' and b.rq <='+formatdateTime('YYYYMMDD',e_date.date)+' ');
       if sStr <> '' then
        ADOQuery1.SQL.Add('and ('+sStr+')');
        ADOQuery1.SQL.Add(' group by c.bms,b.rq ');    ADOQuery1.Active:=true;
        dbgFrame.DataSource:=DataSource1;
    end;
      

  4.   


    var
      I: INteger;
      sBM,sFBM: string;
      sStr: string;
    begin
      sBM:='';
      sFBM:='';  for i:=0 to RzCheckTree1.Items.Count -1 do//循环节点
      begin
        if RzCheckTree1.ItemState[i]=csunchecked then continue;//如果没有选中返回,继续执行for    if (RzCheckTree1.Items[i].Level=1) and
           (RzCheckTree1.ItemState[(RzCheckTree1.Items[i].Parent).AbsoluteIndex]=csChecked) then Continue;//如果是第二层并且父节点被选中,返回执行for    if RzCheckTree1.ItemState[i]=cschecked then//节点被选中
        begin
          if RzCheckTree1.Items[i].Level=0 then//如果是最上级,下面就是开始拼查询条件了
          begin
            sBM := Copy(RzCheckTree1.Items[i].Text,pos('[',RzCheckTree1.Items[i].Text)+1,2);
            if sStr = '' then
              sStr := '(DOC.BM='''+sBM+''')'
            else
              sStr := sStr+ ' or (DOC.BM='''+sBM+''')';
          end
          else
          begin
            sBM := Copy((RzCheckTree1.Items[i].Parent).Text,pos('[',(RzCheckTree1.Items[i].Parent).Text)+1,2);
            sFBM := Copy((RzCheckTree1.Items[i]).Text,pos('[',(RzCheckTree1.Items[i]).Text)+1,2);
            if sStr = '' then
              sStr := '(DOC.BM='''+sBM+''' and DOC.FB='''+sFBM+''')'
            else
              sStr :=  sStr+ ' or (C.BM='''+sBM+''' and DOC.FB='''+sFBM+''')';
          end;
        end;
      end;
     // }
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add('select c.bms as 部门名称,count(*) as 数量,abs(sum(je)/100) as 金额,b.rq as 日期  from doc a join sfdata b on a.bh=b.bh join bumen c on a.bm=c.bm where a.bm<80 and b.jh>=20  ');
        ADOQuery1.SQL.Add(' and b.rq >='+formatdateTime('YYYYMMDD',s_date.date)+' and b.rq <='+formatdateTime('YYYYMMDD',e_date.date)+' ');
       if sStr <> '' then
        ADOQuery1.SQL.Add('and ('+sStr+')');
        ADOQuery1.SQL.Add(' group by c.bms,b.rq ');    ADOQuery1.Active:=true;
        dbgFrame.DataSource:=DataSource1;
    end;
      

  5.   

    RzCheckTree这个控件没用过,不过感觉上面的代码太复杂了吧,另外生成树时完全可以执行一次SQL即可,试想如果你的第一层节点如果有100个,那么你要执行100次SQL才生成这个树,代码有待优化
      

  6.   

    谢谢大家,我已经自己搞定,这个程序代码确实要优化,(公司以前人开发的,没注释不知道什么意思)谢谢bdmh