我有两个表(ADO+ACCESS)表1:func
id           cd           fcd
1            中国          0
1001         河北          1
1002         河南          1
1002001      郑州         1002
1002002      洛阳         1002
2            美国          0
2001         纽约          2
2002         华盛顿        2表2:qx
user   id  
123    1     
123    1001
123    1002
123    1002001 
123    1002002 
123     2     
123     2001  
456     1
456     1001
456     1002
456     2
456     2001我想把func表中的所有数据放入treeview中,然后把qx中的user=123的过滤出来,以两个表的ID为条件,如果ID相同,treeview中对应的节点的图标为“√”(图标索引为0),如果不同,节点的图标为“X”(图标索引为1),请教代码怎么写。

解决方案 »

  1.   

    /// 这些代码,也是我搜集得来的 以便参考:
    SCODEFORMAT   = '133'; //代码结构:根据你自己的结构 再定吧
    ....// 以下函数将代码库中的内容调入树结构控件
    // crtbl 是 选定的 树型数据部件
    Function loadcode(crtbl:tADOQUERY;Ltvwcode:Ttreeview):integer;
    var NowID,Showtxt:string;
        Level:integer;
        MyNode:array[0..5] of TtreeNode;
           //保存各级节点,最长支持6级(本系统)begin
    Screen.Cursor :=crHourGlass;
    Level:=0;
     with crTbl do
      begin
       try
        if not active then open;
           First;
           Ltvwcode.Items.clear;
           //以下是增加第一项;
           MyNode[Level]:=Ltvwcode.items.add(LtvWcode.topitem,sFirstNodeTxt);
           Mynode[Level].ImageIndex:=0;
           MYnode[Level].selectedindex:=0;
           //以上是增加第一项;
        while not eof do
        begin
          NowID:=TRIM(FieldbYNAME('typeID').ASSTRING);
         // ShowTxt:=NowID+'_'+FIELDBYNAME('typeNAME').AsString;
          ShowTxt:=FIELDBYNAME('typeNAME').AsString;
          Level:=GetLevel(SCodeFormat,NowID);
          //返回代码的级数
          //以下是增加子项
          //以下用上一级节点为父节点添加子节点
          IF Level>0 then  //确保代码符合标准
          begin
            MyNode[level]:=Ltvwcode.items.addChild(MyNode[Level-1],ShowTXT);
            Mynode[level].ImageIndex :=1;
            Mynode[level].SelectedIndex:=2;
          end;
          //以上是增加子项
          next;
        end;
       except
        close;
       end;
      end;
     MyNODE[0].Expand(false);//将首节点展开
     Screen.cursor:=crDefault;
     RESULT:=1;
    end;Function getlevel(sFormat,sCode:string):integer;
    VAR I,Level,iLEN:iNTEGER;
    BEGIN
     LEVEL:=-1; //如果代码不符合标准,则返回-1
     iLEN:=0;
     IF (sFORMAT<>'') AND (SCODE<>'') THEN
     FOR I:=1 TO LENGTH(SFORMAT) DO
      BEGIN
      iLEN:=iLEN+StrtoINT(sFORMAT[I]);
      IF LENGTH(SCODE)=ILEN THEN
         BEGIN
         LEVEL:=I;
         BREAK;
         END;
      END;
      RESULT:=LEVEL;
    END;       //上面函数的功能是返回一代码的级数
      

  2.   

    TreeView使用笔记TreeView由节点构成,建树通过对TreeView.items属性进行操作。Items是一个TTreeNodes对象,这是一个TTreeNode集。一、针对TTreeNodes,也就是 TreeView.Items,有这些属性:
    1、count,节点个数。
    2、item[index] ,通过index得到节点。二、针对TTreeNodes,也就是 TreeView.Items,常用的添加节点的操作有:
    AddFirst添加第一个根节点。由此函数添加的节点总排在前面,除非后来又使用此函数添加了一个节点,则后添加的节点将排在前面。该函数返回新添加的节点。
    AddChildFirst添加第一个子节点,要求有父节点作为其参数。返回新添加的节点。
    AddChild添加一个子节点,要求有父节点作为其参数。返回新添加的节点。
    Add添加一个兄弟节点,要求有兄弟节点作为其参数。返回新添加的节点。三、针对TTreeNodes,也就是 TreeView.Items,常用的得到节点的操作有:
    GetFirstNode() 得到根节点。
    然后配合TTreeNode.GetNext(),就可以访问所有的节点。四、建树举例:var
    root_node,cur_node:TTreeNode;
    begin
    root_node:=AddFirst(nil,'根节点1');
    cur_node:=addChildfirst(root_node,nil,'根节点1_child1');
    add(cur_node,'根节点1_child2');
    root_node:=Add(nil,'根节点2');
    AddChildFirst(root_node,''根节点2_child1'); 
    end;
    五、事件触发:
    当从一个节点跳到另一个节点,会触发TTreeView.OnChange事件。该事件中,将传递node,即当前被选中的节点。当修改一个节点的text时,会触发TTreeView.onEdit事件。
    六、将节点和节点所对应的数据联系起来
    对于每个TTreeNode,有个Data属性,可以存放一个指针。我们可以利用这个域来存放与节点对应的自己的数据。
    1.我们先定义一个数据结构,作为记录我们要记录的数据。如:
    type 
    PMyData=^TMyData;
    TMyData=Record
    sFName:string;
    sLName:String;
    nIndex:integer;
    end;2.然后,创建数时,将节点和节点数据联系起来:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    myshuju: PMyData
    cur_node:TTreeNode;
    begin
    New(MyRecPtr); //记住,一定要先分配内存。有几个节点,就要分配几次内存。
    myshuju^.FName:=Edit1.Text;
    Myshuju^.LName := Edit2.Text;
    TreeViewIndex := StrToInt(Edit3.Text);
    with TreeView1 do
    begin
    cur_node:=items.AddFirst(nil,'first');
    cur_node.data:=myshuju;
    end;
    end;3.当我们选中一个节点时,就可以使用我们的数据了。
    procedure TForm1.TreeView1Change(Sender:TObject;Node:TTreeNode);
    begin
    if node.data<>nil then
    self.label1.caption:=pmyData(node.data)^.Fname+pmyData(node.data)^.Lname
    end;
    七、一般使用流程:
    1、添加全局变量:
    b_first:boolean; //记录是否是第一次访问节点,因为此时数据还未准备好,而一旦访问节点就会触发OnChange事件,在此事件处理函数中也许会出错。
    2、在FormCreate中,
    a、设置b_first:=true;
    b. 创建数并将节点与数据联系。
    3、在FormShow中
    设置b_first:=false;
    4.在事件OnChange中处理节点被选中事件。
    5.在Edit中处理节点被修改Text事件。
    并调用OnChange.
    6.在 TreeView.Destory中
    释放Data 中指向的内存空间。
      

  3.   

    /*生成测试数据*/
    create table #func(id int, cd varchar(10), fcd int)
    create table #qx([user] int, id int)insert #func select 1,         '中国',          0
    union all select 1001,         '河北',          1
    union all select 1002,         '河南',          1
    union all select 1002001,      '郑州',         1002
    union all select 1002002,      '洛阳',         1002
    union all select 2,            '美国',          0
    union all select 2001,         '纽约',          2
    union all select 2002,         '华盛顿',        2
    insert #qx select 123,    1     
    union all select 123,    1001
    union all select 123,    1002
    union all select 123,    1002001 
    union all select 123,    1002002 
    union all select 123,     2     
    union all select 123,     2001  
    union all select 456,     1
    union all select 456,     1001
    union all select 456,     1002
    union all select 456,     2
    union all select 456,     2001
    /*生成测试数据结束*//*开始查询*/
    select t1.id, t1.cd, 
      case when (t2.id is null) then '×' else '√' end as '#qx是否有user=123的相同id记录'
    from #func t1
    left join #qx t2
    on t2.[user] = 123 and t2.id = t1.id
    /*查询结束*/--清除测试数据
    drop table #func, #qx/*查询结果
    id          cd         #qx是否有user=123的相同id记录 
    ----------- ---------- --------------------- 
    1           中国         √
    1001        河北         √
    1002        河南         √
    1002001     郑州         √
    1002002     洛阳         √
    2           美国         √
    2001        纽约         √
    2002        华盛顿        ×
    */
      

  4.   

    TO:hthunter:我的表是ACCESS,你的查询代码select t1.id, t1.cd, 
      case when (t2.id is null) then '×' else '√' end as '#qx是否有user=123的相同id记录'
    from #func t1
    left join #qx t2
    on t2.[user] = 123 and t2.id = t1.id在运行时出错。
      

  5.   

    access里面好像是用if来代替case语法的
      

  6.   

    case when (t2.id is null) then '×' else '√' end
    改成
    iif (isnull(t2.id), '×', '√')既然你使用access,你就应该熟悉一下access的语法,像iif这种应该是access比较常用的基本语法