📄 formdeptchart.pas
字号:
//**********************************************************//
//部门组织架构图,采用穷举算法,试图找出该节点下面的所有节点//
//从左到右读二叉树的算法,算法逻辑基本准确,实现的方法不好,//
//它受到部门编码位数必须一样,且要按照规定的编码进行处理,该//
//方法的速度慢,不灵活,现提出一种解法,先把它写进临时表,在//
//用上面的方法进行,这样可以少写很多代码,不用循环(编码组成//
//部份的位数)次数即可。时间有限,放在第二版处理 //
//Danny 2002/03/07 8:50 //
//**********************************************************//
unit formdeptchart;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ImgList, ComCtrls, Db, DBTables, ADODB, ExtCtrls, DBCtrls, ToolWin;
type
TformDchart = class(TForm)
ListView1: TListView;
ADOQuery1: TADOQuery;
Tree1: TTreeView;
Splitter1: TSplitter;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
DBNavigator1: TDBNavigator;
ImageList2: TImageList;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Tree1Click(Sender: TObject);
procedure ToolButton7Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
function dup(s:integer):string;
function fname(field:string;i:integer):string; //field表示字段值,i是第几个点
public
{ Public declarations }
procedure createtable(tier:integer);
end;
var
formDchart: TformDchart;
implementation
uses datamol,main,cvcode;
{$R *.DFM}
procedure TformDchart.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
formdchart:=nil;
end;
function tformdchart.dup(s:integer):string;
var i:integer;
st:string;
begin
st:='';
for i:=1 to s do
st:=st+'0';
dup:=st;
end;
function tformdchart.fname(field:string;i:integer):string;
var p,k:integer;
f:string;
begin
f:=field;
for p:=1 to i do
begin
k:=pos('.',f);
delete(f,1,k);
if p=i then
fname:=f;
end;
end;
procedure TformDchart.Tree1Click(Sender: TObject);
var listitem:Tlistitem;
tn:Ttreenode;
s:string;
begin
with datamod.ADOQuery1 do
begin
s:='';
tn:=tree1.Selected;
repeat
if s='' then
s:=tn.text
else
s:=tn.Text +'.'+s;
tn:=tn.Parent;
until tn=nil;
s:=s+'.';
listview1.Items.Clear;
sql.Clear;
sql.Add ('select workno,name,sexname,prof from per24010 where dept='''+trim(s)+''' and leave<>1 order by workno');
open;
while not eof do
begin
listitem:=listview1.Items.add;
listitem.Caption:=fieldbyname('workno').asstring;
listitem.SubItems.Add (fieldbyname('name').asstring);
listitem.SubItems.Add (fieldbyname('sexname').asstring);
listitem.SubItems.Add (fieldbyname('prof').asstring);
next;
end;
close;
end;
end;
procedure TformDchart.ToolButton7Click(Sender: TObject);
begin
close;
end;
procedure TformDchart.FormActivate(Sender: TObject);
var i,j,n:0..8;
k:integer;
mynode:Ttreenode;
aqy1:Tadoquery;
begin
aqy1:=tadoquery.Create(self);
aqy1.Connection:=adoquery1.Connection ;
//部门资料dept∶dno部门编号,dname部门名称
//部门资料规格表∶a1是编码中的第一部份,存放的是该部份中有几位组成
// 编码定义最多为8位,最多为8部份组成
aqy1.sql.text:='select sumpart from pub05011';
aqy1.open;
if aqy1.eof then
begin
Application.messagebox('您必须设定您的部门名称最多有几部份组成','Warning',mb_ok+mb_iconwarning);
exit;
end
else
k:=strtoint(aqy1.fieldbyname('sumpart').asstring); //如果K值为空,证明部门编码规则有误,退出作业处理
//产生临时表的内容,tempDept,Cdept
try
Createtable(k);
except
Application.messagebox('对不起,产生部门资料时出错,请再来一次','Warning',mb_ok+mb_iconwarning);
exit;
end;
with tree1.Items do
begin
clear;
aqy1.Close;
aqy1.SQL.Text :='select dept from TempDept where num=''1'' ';
aqy1.Open;
while not aqy1.eof do
begin
mynode:=add(nil,aqy1.fieldbyname('dept').asstring);
aqy1.next;
end;
aqy1.Close;
end;
n:=k;
for j:=2 to n do
begin
aqy1.SQL.Text :='select * from tempDept where num='''+inttostr(j)+''' ';
aqy1.open;
while not aqy1.eof do
begin
for i:=0 to tree1.Items.Count-1 do
begin
if pos(aqy1.fieldbyname('fdept').asstring,tree1.items[i].Text)>0 then //find item;
begin
tree1.Items[i].Selected:=true;
//Mynode1:=tree1.Items.add(tree1.items[i].TreeView.Selected,aqy1.fieldbyname('dept').asstring);
tree1.Items.addchild(tree1.items[i].TreeView.Selected,aqy1.fieldbyname('dept').asstring);
end;
end;
aqy1.next;
end;
aqy1.Close;
end;
end;
procedure Tformdchart.createtable(tier:integer);
var aqy1:Tadoquery;
i,j:integer;
begin
aqy1:=Tadoquery.Create(self);
aqy1.Connection :=datamod.Database1;
aqy1.SQL.Clear;
aqy1.SQL.add('Delete from TempDept');
aqy1.sql.add('delete from Cdept');
aqy1.SQL.Add ('insert cdept(dno,dept) select dno,dept from pub05010');
aqy1.ExecSQL;
aqy1.Close; //第1,2层
j:=0;
for i:=1 to tier-1 do
begin
aqy1.sql.Clear;
j:=j+1;
if j=1 then
begin
aqy1.sql.add('insert tempdept(dept,fdept,num) select distinct( left(dept,charindex(''.'',dept)-1)),''f'',''1'' from Cdept where charindex(''.'',dept)>0');
j:=j+1;
end;
aqy1.SQL.add('insert tempdept(dept,fdept,num) select distinct(left(right(dept,len(dept)-charindex(''.'',dept)),charindex(''.'',right(dept,len(dept)-charindex(''.'',dept)))-1)) '+
',left(dept,charindex(''.'',dept)-1),'''+inttostr(J)+''' from Cdept '+
'where charindex(''.'',right(dept,len(dept)-charindex(''.'',dept)))>0');
aqy1.SQL.Add('update Cdept set dept=right(dept,len(dept)-charindex(''.'',dept)) ');
aqy1.SQL.add('delete Cdept where charindex(''.'',dept)=0');
aqy1.execsql;
aqy1.close;
end;
aqy1.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -