📄 bomform.~pas
字号:
unit BomForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, DB, ADODB, Grids, DBGrids, StdCtrls, Buttons,MainForm,
ToolWin, ExtCtrls;
type
Tbom = class(TForm)
TreeView1: TTreeView;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
DBGrid1: TDBGrid;
ADOQuery3: TADOQuery;
DataSource1: TDataSource;
ADOCommand1: TADOCommand;
ToolBar1: TToolBar;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
ToolButton1: TToolButton;
BitBtn5: TBitBtn;
BitBtn7: TBitBtn;
BitBtn8: TBitBtn;
ToolButton2: TToolButton;
BitBtn9: TBitBtn;
BitBtn10: TBitBtn;
ToolButton3: TToolButton;
BitBtn11: TBitBtn;
BitBtn6: TBitBtn;
Panel1: TPanel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
BitBtn12: TBitBtn;
Edit6: TEdit;
Edit7: TEdit;
Edit8: TEdit;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Label1: TLabel;
Label5: TLabel;
Label4: TLabel;
Label3: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
BitBtn13: TBitBtn;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Memo1: TMemo;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn9Click(Sender: TObject);
procedure BitBtn12Click(Sender: TObject);
procedure BitBtn11Click(Sender: TObject);
procedure BitBtn13Click(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure BitBtn6Click(Sender: TObject);
procedure BitBtn10Click(Sender: TObject);
procedure BitBtn8Click(Sender: TObject);
procedure BitBtn7Click(Sender: TObject);
procedure Edit6KeyPress(Sender: TObject; var Key: Char);
procedure Edit7KeyPress(Sender: TObject; var Key: Char);
procedure Edit8KeyPress(Sender: TObject; var Key: Char);
procedure DataSource1DataChange(Sender: TObject; Field: TField);
private
{ Private declarations }
public
{ Public declarations }
//标示按钮操作,用不同的值表示不同的草错
//insflag=1标识新增子项按钮被按下
//insflag=2表示新增同级项按钮被按下
//insflag=3表示修改按钮被按下
insflag:integer;
//数据库中需求数量和损耗率为decimal,在sql操作中需要进行转换
ratio,num:double;
//声明编写的函数和过程
procedure showtree();
function checknode(pnode:Ttreenode):integer;
end;
type
//这个表用于保存树形图中各节点的详细数据
Ttable=array[1..200,1..3] of string;
//这个表用于存储树形图各节点的节点位置
//与上一个表一起用来查询储存好的某个节点的数据
Tnodetable=array[1..200] of TTreeNode;
var
bom: Tbom;
mytable:TTable;
mynodetable:Tnodetable;
implementation
{$R *.dfm}
uses chooseForm;
//---------点窗体的X按钮时关闭窗体----------
procedure Tbom.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
end;
//--------显示窗体时就创建树形图-------
procedure Tbom.FormShow(Sender: TObject);
begin
showtree();
end;
//----------自己编写的显示树形图的过程--------------
procedure Tbom.showtree();
var
pnode1,pnode,curnode:TTreenode;
pcode,code,pname,name:string;
i,count,order:integer;
begin
//读入数据,刷新数据链接
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add('select a.*,b.* from 物料清单 a, 物料主文件 b');
adoquery1.SQL.Add('where a.物料编号=b.物料编号');
adoquery1.SQL.Add('order by a.低层码,a.父项编号');
adoquery1.Open;
//由于“全部产品”这一项数据不在物料清单表中,因此要从物料主文件中读入
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select 物料名称 from 物料主文件 where 物料编号=''0''');
adoquery2.Open;
//创建主节点‘全部产品’
curnode:=treeview1.Items.AddFirst(nil,adoquery2.fieldbyname('物料名称').AsString);
//逐个创建树形图中的子项
//order代表某个节点是第几个创建的
//这个编号也是该节点在mytable中的储存位置,初始化为0
order:=0;
//逐项读入数据
while not adoquery1.Eof do
begin
//将父项编号等读入变量
pcode:=adoquery1.fieldbyname('父项编号').AsString;
code:=adoquery1.fieldbyname('物料编号').AsString;
name:=adoquery1.fieldbyname('物料名称').AsString;
//查找记录的父项编号所对应的物料名称
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select 物料名称 from 物料主文件 where 物料编号='''+pcode+'''');
adoquery2.Open;
pname:=adoquery2.fieldbyname('物料名称').AsString;
//计算当前树形图中的总结点数目
count:=treeview1.Items.Count;
//从第一个节点开始,逐个检查其物料名称是否与要创建的节点的父项节点的物料名称相同
//如相同,则在这个节点下创建子项
for i:=1 to count do
begin
pnode1:=treeview1.Items.Item[i-1];
if pnode1.Text=pname then
begin
//创建子节点
pnode:=treeview1.Items.AddChild(pnode1,name);
pnode.Expanded:=true;
//根据创建顺序储存数据信息
order:=order+1;
mytable[order,1]:=pcode;
mytable[order,2]:=code;
mytable[order,3]:=name;
//储存树节点的节点数据
mynodetable[order]:=pnode;
end;
end;
//处理下一条记录
adoquery1.Next;
end;
end;
//----------显示在树形图中选中的节点的物料清单数据------
procedure Tbom.TreeView1Click(Sender: TObject);
var
pcode,code,name,temp:string;
i:integer;
begin
//如选择的是首节点,则读入产品信息
if treeview1.Selected.Parent=nil then
begin
adoquery3.Close;
adoquery3.SQL.Clear;
adoquery3.SQL.Add('select a.*,b.* from 物料主文件 a,物料清单 b');
adoquery3.SQL.Add('where (a.物料编号=b.物料编号)and(b.父项编号=''0'')');
adoquery3.Open;
edit1.Text:='0';
edit2.Text:='全部产品';
edit3.Text:='';
edit4.Text:='';
edit5.Text:='0';
groupbox1.Caption:='全部产品';
end
else
//如选择的是非首节点以外的节点,则读入相对应的物料清单信息
begin
//取得所选节点的数据在mytable中的位置
i:=checknode(treeview1.Selected);
//从储存表中读入详细数据
pcode:=mytable[i,1];
code:=mytable[i,2];
name:=mytable[i,3];
//根据节点是否有子节点,给予sql不同的语句进行查询
adoquery3.Close;
adoquery3.SQL.Clear;
//如选取得节点有子节点,则表中显示的是它的子项信息
if treeview1.Selected.HasChildren then
begin
adoquery3.SQL.Add('select a.*,b.* from 物料主文件 a,物料清单 b where (a.物料编号=b.物料编号)');
adoquery3.SQL.Add('and(b.父项编号='''+code+''')');
temp:='下属的物料清单';
end
else
//如果没有子节点,则显示它自己的信息
begin
adoquery3.SQL.Add('select a.*,b.* from 物料主文件 a,物料清单 b where (a.物料编号=b.物料编号)');
adoquery3.SQL.Add('and(b.物料编号='''+code+''')');
adoquery3.SQL.Add('and(b.父项编号='''+pcode+''')');
temp:='无下属零件';
end;
adoquery3.Open;
//在窗体的文本框中显示选中的节点的信息
edit1.Text:=code;
edit2.Text:=name;
edit3.Text:=pcode;
edit4.Text:=dbgrid1.Fields[11].AsString;
edit5.Text:=inttostr(treeview1.Selected.level);
memo1.Text:=adoquery3.fieldbyname('其它事项').AsString;
edit9.Text:=adoquery3.fieldbyname('领料车间').AsString;
edit10.Text:=adoquery3.fieldbyname('领料库房').AsString;
edit11.Text:=adoquery3.fieldbyname('损耗率').AsString;
edit12.Text:=adoquery3.fieldbyname('审核日期').AsString;
groupbox1.Caption:=copy(name,1,16)+temp;
end;
end;
//----------自行编写的函数-----------------------
//----用于从一个储存节点的表中查找某个节点的详细在mytable中的储存位置-----
function Tbom.checknode(pnode:TTreeNode):integer;
var
i:integer;
begin
for i:=1 to treeview1.Items.Count-1 do
if pnode=mynodetable[i] then
begin
checknode:=i;
end;
end;
//--------------首记录---------------------
procedure Tbom.BitBtn1Click(Sender: TObject);
begin
datasource1.DataSet.First;
end;
//--------------上一条记录---------------------
procedure Tbom.BitBtn2Click(Sender: TObject);
begin
datasource1.DataSet.Prior;
end;
//--------------下一条记录---------------------
procedure Tbom.BitBtn3Click(Sender: TObject);
begin
datasource1.DataSet.Next;
end;
//--------------尾记录---------------------
procedure Tbom.BitBtn4Click(Sender: TObject);
begin
datasource1.DataSet.Last;
end;
//----------------新增子项---------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -