本帖最后由 linlingwei 于 2010-08-30 20:29:24 编辑

解决方案 »

  1.   

    先数据排序当前年值:='';
    当前月值:='';
    当前年节点:=nil;
    当前月节点:=nil;
    再顺序处理每一条记录:
      如年份字段值<>当前年值,则当前年节点:=treeview.items.add(nil,年份字段值);当前年值:=年份字段值;
      如月份字段值<>当前月值,则当前月节点:=treeview.items.add(当前年节点,月份字段值);当前月值:=月份字段值;
      treeview.items.add(当前月节点,日期字段值);
      

  2.   

    unit Res_Department;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Base_Unit, Buttons, ExtCtrls, ComCtrls, cxControls, cxContainer,
      cxTreeView,CommDeclare, DB, ADODB, StdCtrls;type
      TRes_Department_F = class(TBase_F)
        cx_TV: TcxTreeView;
        pnl_main: TPanel;
        qry_tmp: TADOQuery;
        qry_op: TADOQuery;
        pnl_top: TPanel;
        lbl1: TLabel;
        edt_zg: TEdit;
        lbl2: TLabel;
        edt_jb: TEdit;
        lbl3: TLabel;
        edt_mail: TEdit;
        procedure btnSB_SearchClick(Sender: TObject);
        procedure cx_TVChange(Sender: TObject; Node: TTreeNode);
        procedure FormCreate(Sender: TObject);
        procedure cx_TVExpanded(Sender: TObject; Node: TTreeNode);
        procedure cx_TVExpanding(Sender: TObject; Node: TTreeNode;
          var AllowExpansion: Boolean);
        procedure FormDestroy(Sender: TObject);
      private
        p_data:PString;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Res_Department_F: TRes_Department_F;implementationuses sys_datamoudle;{$R *.dfm}procedure TRes_Department_F.btnSB_SearchClick(Sender: TObject);
    var
      iLoop:Integer;
      Master,MasterNode:TTreeNode;
    begin
      inherited;
      qry_tmp.Close;
      qry_tmp.SQL.Text:='select bmbh,bmmc from RES_DEPARTMENT where sjbm=''10000''';
      qry_tmp.Open;
      cx_TV.Items.BeginUpdate;
      cx_TV.Items.Clear;
      New(p_data);
      p_data^:='10000';
      Master:=cx_TV.Items.AddObject(nil,'總經理',p_data);
      while not qry_tmp.Eof do
      begin
        Screen.Cursor:=crSQLWait;
        New(p_data);
        p_data^:=qry_tmp.fieldbyname('bmbh').AsString;
        MasterNode:=cx_TV.Items.AddChildObject(Master,qry_tmp.fieldbyname('bmmc').AsString,p_data);
        qry_op.Close;
        qry_op.SQL.Text:='select bmbh,max(bmmc)as bmmc from RES_DEPARTMENT where sjbm='+ QuotedStr(qry_tmp.fieldbyname('bmbh').AsString)+' group by bmbh';
        qry_op.Open;
        Application.ProcessMessages;
        for iLoop:=0 to qry_op.RecordCount -1 do
        begin
          New(p_data);
          p_data^:=qry_op.fieldbyname('bmbh').AsString;
          cx_TV.Items.AddChildObject(MasterNode,qry_op.fieldbyname('bmmc').AsString,p_data);
          qry_op.Next;
        end;
        qry_tmp.Next;
      end;
      cx_TV.Items.EndUpdate;
      Screen.Cursor:=crDefault;
      Application.ProcessMessages;
    end;procedure TRes_Department_F.cx_TVChange(Sender: TObject; Node: TTreeNode);
    begin
      inherited;
      if Node.Data<>nil then
      begin
        qry_tmp.Close;
        qry_tmp.SQL.Text:='select fzr,bmjb from RES_DEPARTMENT where bmbh='+ QuotedStr(pstring(Node.Data)^);
        qry_tmp.Open;
        edt_zg.Text:=qry_tmp.fieldbyname('fzr').AsString;
        edt_jb.Text:=qry_tmp.fieldbyname('bmjb').AsString;
      end;
    end;procedure TRes_Department_F.FormCreate(Sender: TObject);
    begin
      inherited;
      btnSB_SearchClick(Sender);
    end;procedure TRes_Department_F.cx_TVExpanded(Sender: TObject;
      Node: TTreeNode);
    var
      iLoop:Integer;
    begin
      inherited;
      if Node.Level>0 then
      begin
        for iLoop:=0 to Node.Count-1 do
        begin
          qry_op.Close;
          qry_op.SQL.Text:='select top 1 bmbh from RES_DEPARTMENT where sjbm='+QuotedStr(pstring(Node.Item[iLoop].Data)^);
          qry_op.Open;
          if (qry_op.RecordCount>0) then
            Node.Item[iLoop].HasChildren:=True;
          Application.ProcessMessages;
        end;
      end;
    end;procedure TRes_Department_F.cx_TVExpanding(Sender: TObject;
      Node: TTreeNode; var AllowExpansion: Boolean);
    begin
      inherited;
      if Node.Level>0 then
      begin
        Node.DeleteChildren;
        qry_op.Close;
        qry_op.SQL.Text:='select bmbh,max(bmmc)as bmmc from RES_DEPARTMENT where sjbm='+ QuotedStr(pstring(Node.Data)^)+' group by bmbh';
        qry_op.Open;
        while not qry_op.Eof do
        begin
          New(p_data);
          p_data^:=qry_op.Fieldbyname('bmbh').AsString;
          cx_TV.Items.AddChildObjectFirst(Node,qry_op.Fieldbyname('bmmc').AsString,p_data);
          qry_op.Next;
        end;
      end;  
    end;procedure TRes_Department_F.FormDestroy(Sender: TObject);
    begin
      inherited;
      if p_data<>nil then
        Dispose(p_data);
    end;end.
      

  3.   

    procedure TDlgUser.InitTreeView(Node: TTreeNode; nIndex: Integer);
    var
      sSql: String;
      nOrgId: Integer;
      dbQuery: TADOQUery;
      TreeNode: TTreeNode;
    begin
      sSql := Format('Select * from Org Where OrgParentId = %d Order By OrgId', [nIndex]);
      dbQuery := TADOQUery.Create(nil);
      if dbQuery <> nil then
      begin
        dbQuery.Connection := dbDataModule.m_dbConnection;
        dbQuery.SQL.Clear;
        dbQuery.SQL.Add(sSql);
        dbQuery.Open;    dbQuery.First;
        while not dbQuery.Eof do
        begin
          nOrgId := dbQuery.FieldByName('OrgId').AsInteger;
          TreeNode := TreeView.Items.AddChild(Node, dbQuery.FieldByName('OrgName').AsString);
          InitTreeView(TreeNode, nOrgId);
          dbQuery.Next;
        end;
      end;
      dbQuery.Close;
      dbQuery.Free;
    end;
      

  4.   

    procedure TDlgUser.InitTreeView(Node: TTreeNode; nIndex: Integer);
    var
      sSql: String;
      nOrgId: Integer;
      dbQuery: TADOQUery;
      TreeNode: TTreeNode;
    begin
      sSql := Format('Select * from Org Where OrgParentId = %d Order By OrgId', [nIndex]);
      dbQuery := TADOQUery.Create(nil);
      if dbQuery <> nil then
      begin
        dbQuery.Connection := dbDataModule.m_dbConnection;
        dbQuery.SQL.Clear;
        dbQuery.SQL.Add(sSql);
        dbQuery.Open;    dbQuery.First;
        while not dbQuery.Eof do
        begin
          nOrgId := dbQuery.FieldByName('OrgId').AsInteger;
          TreeNode := TreeView.Items.AddChild(Node, dbQuery.FieldByName('OrgName').AsString);
          InitTreeView(TreeNode, nOrgId);
          dbQuery.Next;
        end;
      end;
      dbQuery.Close;
      dbQuery.Free;
    end;
      

  5.   

    表名 Org :
    ======================================
    OrgId : 自动编号
    OrgName : 文本 
    OrgParentId : 数字
    ======================================