?»??»?unit S406; //REF:HR_DEP,JL_DEPHIRCH,PP_WRCID,CO_CSTC,HR_EMPLYM,MM_STKLOCM, //SS_DEPBROW interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, IKForm, StdCtrls, Buttons, ExtCtrls, Menus, Db, DBTables, Mask, DBCtrls, Grids, DBGrids, ComCtrls, ActnList, Variants, DBClient, Provider, DBLocal, DBLocalB, ImgList; type TFmS406 = class(TFmIKForm) FilterPanel: TPanel; Label8: TLabel; DisplayButton: TBitBtn; Edit1: TEdit; TreeView1: TTreeView; Panel1: TPanel; GroupBox2: TGroupBox; Query1: TQuery; Query2: TQuery; DataSource1: TDataSource; DataSource2: TDataSource; ActionPanel: TPanel; InsertButton: TButton; EditButton: TButton; PostButton: TButton; CancelButton: TButton; DeleteButton: TButton; CloseBitBtn: TBitBtn; Label1: TLabel; GroupBox1: TGroupBox; DBGrid1: TDBGrid; Query1DEPID: TStringField; Query1DEPNM: TStringField; Query2DEPID: TStringField; Query2DPRTID: TStringField; Label2: TLabel; DBEdit1: TDBEdit; Label3: TLabel; DBEdit2: TDBEdit; Splitter1: TSplitter; Splitter2: TSplitter; ClearBitBtn: TBitBtn; bcd: TBDEClientDataSet; bcdDEPID: TStringField; bcdDPRTID: TStringField; ImageList2: TImageList; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure CloseBitBtnClick(Sender: TObject); procedure Edit1DblClick(Sender: TObject); procedure Edit1Exit(Sender: TObject); procedure ClearBitBtnClick(Sender: TObject); procedure DisplayButtonClick(Sender: TObject); procedure TreeView1Click(Sender: TObject); procedure InsertButtonClick(Sender: TObject); procedure EditButtonClick(Sender: TObject); procedure Query2AfterInsert(DataSet: TDataSet); procedure Query2BeforeInsert(DataSet: TDataSet); procedure Query2NewRecord(DataSet: TDataSet); procedure Query2BeforePost(DataSet: TDataSet); procedure PostButtonClick(Sender: TObject); procedure Query2AfterPost(DataSet: TDataSet); procedure Query2AfterDelete(DataSet: TDataSet); procedure DeleteButtonClick(Sender: TObject); procedure Query2BeforeEdit(DataSet: TDataSet); procedure CancelButtonClick(Sender: TObject); procedure DataSource2DataChange(Sender: TObject; Field: TField); procedure Query2CalcFields(DataSet: TDataSet); procedure DBGrid1DblClick(Sender: TObject); private { Private declarations } public { Public declarations } ifInsert: boolean; sDEPID: string; procedure CreateSubTree(vNode: TTreeNode; vNSN: string); procedure CreateTopTree; end; implementation uses MainDM, DbFunc, SetFunc, Func, PickFunc, mdimain, PickForm; const sSep: string='¡G'; {$R *.DFM} procedure TFmS406.FormCreate(Sender: TObject); begin inherited; GridPickFields(DBGrid1, 'DEPID'); //DBGrid1 end; procedure TFmS406.FormClose(Sender: TObject; var Action: TCloseAction); begin inherited; Action := caFree; end; procedure TFmS406.CloseBitBtnClick(Sender: TObject); begin inherited; Close; end; procedure TFmS406.Edit1DblClick(Sender: TObject); begin EditPick('select * from HR_DEP order by DEPID', Sender, 'DEPID', 'DEPNM'); end; procedure TFmS406.Edit1Exit(Sender: TObject); begin CheckNo(Sender, 'HR_DEP', 'DEPID'); end; procedure TFmS406.ClearBitBtnClick(Sender: TObject); begin inherited; ClearEdit(FilterPanel); sDEPID := ''; end; procedure TFmS406.DisplayButtonClick(Sender: TObject); begin sDEPID := StrExtract(Edit1.Text, ':'); inherited; CreateTopTree; //®i¶}²Ä¤@¶¥ DisplayButton.Font.Color := clBlack; end; procedure TFmS406.CreateTopTree; var qy: TQuery; aNode:TTreeNode; begin qy := SQLCreate('select DPRTID, DEPNM from SS_DEPBROW, HR_DEP ' + 'where SS_DEPBROW.DEPID=SS_DEPBROW.DPRTID ' + 'and HR_DEP.DEPID=SS_DEPBROW.DPRTID ' + iif(sDEPID='', '', ' and DPRTID='+AA(sDEPID)) + ' ' + 'order by SS_DEPBROW.DPRTID'); try with qy, TreeView1 do begin Items.Clear; Items.Add(nil, '¸ê®Æ©ÒÄݳ¡ªù'); First; while not Eof do begin aNode:=Items.AddChild(Items[0], FieldByName('DPRTID').AsString + sSep + FieldByName('DEPNM').AsString); if Sqlvalue('select count(*) from SS_DEPBROW where DPRTID='+ AA(FieldByName('DPRTID').AsString)+' and DEPID<>DPRTID')>0 then aNode.StateIndex:=3 else aNode.StateIndex:=4; Next; end; Items[0].Expand(True); //®i¶} Items[0].Selected := True; TreeView1.SetFocus; TreeView1Click(Self); end; finally qy.Free; end; end; procedure TFmS406.TreeView1Click(Sender: TObject); var SelDPRTID: string; SelNode: TTreeNode; begin if TreeView1.Selected <> nil then begin SelNode := TreeView1.Selected; SelDPRTID := StrExtract(SelNode.Text, sSep); if not SelNode.HasChildren then begin CreateSubTree(SelNode, SelDPRTID); //®i¶}¦U²Ó¶µ SelNode.Expand(True); end; if SelNode=TreeView1.Items[0] then begin SQLOpen(Query1, 'select * from HR_DEP where 1=2'); SQLOpen(Query2, 'select * from SS_DEPBROW ' + 'where DEPID=DPRTID ' + iif(sDEPID='', '', 'and DPRTID=' + AA(sDEPID)) + ' ' + 'order by DPRTID'); end else begin SQLOpen(Query1, 'select * from HR_DEP where DEPID=' + AA(SelDPRTID)); SQLOpen(Query2, 'select * from SS_DEPBROW ' + 'where DPRTID=' + AA(SelDPRTID) + ' and DEPID<>DPRTID order by DEPID'); end; end else begin SQLOpen(Query1, 'select * from HR_DEP where 1=2'); SQLOpen(Query2, 'select * from SS_DEPBROW where 1=2'); InsertButton.Enabled := False; end; end; procedure TFmS406.CreateSubTree(vNode: TTreeNode;vNSN: string); begin if vNode.HasChildren then Exit; with SQLCreate('Select SS_DEPBROW.DEPID, SS_DEPBROW.DPRTID, HR_DEP.DEPNM ' + 'from SS_DEPBROW, HR_DEP ' + 'where SS_DEPBROW.DPRTID=' + AA(StrExtract(vNode.Text, sSep)) + ' ' + 'and SS_DEPBROW.DEPID<>SS_DEPBROW.DPRTID ' + 'and SS_DEPBROW.DEPID=HR_DEP.DEPID ' + 'order by SS_DEPBROW.DPRTID') do try while not Eof do begin TreeView1.Items.AddChild(vNode, FieldByName('DEPID').AsString + sSep + FieldByName('DEPNM').AsString); Next; end; finally Free; end; end; //¨ú±o©Ò¦³³¡ªù procedure GetDEPID(bcd:TBDEClientDataSet; sDEPID:string); var sDEP: string; begin if not bcd.Locate('DEPID', sDEPID, []) then begin //¥[¤JsDEPID³¡ªù bcd.Append; bcd['DEPID'] := sDEPID; bcd.Post; end; //¥[¤JsDEPID¥H¤U³¡ªù with SQLCreate('select DEPID from SS_DEPBROW '+ 'where DPRTID='+AA(sDEPID)+' '+ 'and DEPID<>DPRTID order by DPRTID') do try while not Eof do begin sDEP:=FieldByName('DEPID').AsString; if not bcd.Locate('DEPID',sDEP,[]) then begin bcd.Append; bcd['DEPID']:=sDEP; bcd.Post; end; if SqlValue('select count(*) from SS_DEPBROW'+ ' where DPRTID='+AA(sDEP)+ ' and DEPID<>DPRTID')>0 then GetDEPID(bcd, sDEP); Next; end; finally Free; end; end; procedure TFmS406.DataSource2DataChange(Sender: TObject; Field: TField); begin inherited; if Field=nil then begin InsertButton.Enabled := Query2.Active and (Query2.State=dsBrowse); EditButton.Enabled := InsertButton.Enabled and (not Query2.IsEmpty); DeleteButton.Enabled := EditButton.Enabled; PostButton.Enabled := Query2.State in [dsInsert, dsEdit]; CancelButton.Enabled := PostButton.Enabled; end; end; procedure TFmS406.Query2CalcFields(DataSet: TDataSet); begin DataSet['DEPID_']:=SQLValue('select DEPNM from HR_DEP where DEPID='+AA(DataSet['DEPID']) ); //DEPID_ end; procedure TFmS406.Query2BeforeInsert(DataSet: TDataSet); begin if TreeView1.Selected = nil then raise Exception.Create('½Ð¥ý¿ï¾Ü¤W¼h³¡ªù¥N¸¹!!'); DBGrid1.SetFocus; inherited; end; procedure TFmS406.InsertButtonClick(Sender: TObject); begin inherited; Query2.Insert; end; procedure TFmS406.Query2NewRecord(DataSet: TDataSet); begin inherited; if TreeView1.Selected<> TreeView1.Items[0] then Query2['DPRTID'] := StrExtract(TreeView1.Selected.Text, sSep); end; procedure TFmS406.Query2AfterInsert(DataSet: TDataSet); begin inherited; DBGrid1.Columns[0].ReadOnly := False; end; procedure TFmS406.Query2BeforeEdit(DataSet: TDataSet); begin inherited; DBGrid1.Columns[0].ReadOnly := True; end; procedure TFmS406.EditButtonClick(Sender: TObject); begin inherited; Query2.Edit; end; procedure TFmS406.Query2BeforePost(DataSet: TDataSet); begin inherited; if VarToStr(Query2['DPRTID'])='' then Query2['DPRTID'] := Query2['DEPID']; ifInsert := Query2.State=dsInsert; end; procedure TFmS406.PostButtonClick(Sender: TObject); begin inherited; if Query2.State in [dsInsert, dsEdit] then Query2.Post; end; procedure TFmS406.Query2AfterPost(DataSet: TDataSet); var InsertsNSN: string; SelNode: TTreeNode; begin inherited; InsertsNSN := Query2DEPID.AsString + sSep + DataSet.FieldByName('DEPID_').AsString; if ifInsert then begin SelNode := TreeView1.Selected; TreeView1.Items.AddChild(SelNode, InsertsNSN); SelNode.Expand(True); ReOpen(Query2); Query2.Locate('DEPID', StrExtract(InsertsNSN, sSep), []); end; Treeview1.SetFocus; end; procedure TFmS406.CancelButtonClick(Sender: TObject); begin inherited; Query2.Cancel; end; procedure TFmS406.DeleteButtonClick(Sender: TObject); begin Query2.Delete; end; procedure TFmS406.Query2AfterDelete(DataSet: TDataSet); var SelNode: TTreeNode; begin inherited; SelNode := TreeView1.Selected; SelNode.DeleteChildren; CreateSubTree(SelNode, StrExtract(SelNode.Text, sSep)); SelNode.Expand(True); Treeview1.SetFocus; end; procedure TFmS406.DBGrid1DblClick(Sender: TObject); begin with TDBGrid(Sender).SelectedField do if FieldName='DEPID' then EditPick('select * from HR_DEP ' + 'where DEPID not in (select DEPID from SS_DEPBROW) ' + 'order by DEPID', Sender, 'DEPID', '', 'HR_DEP'); {SQLOpen(Query10, 'select * from HR_DEP ' + 'where DEPID not in (select DEPID from SS_DEPBROW) ' + 'order by DEPID'); //³¡ªù¬[ºcÀÉ EditPick(Query10, Sender, 'DEPID');} end; initialization RegisterClass(TFmS406); end.