是我程序的问题,还是delphi7的BUG?????
有一个单元文件,用来做部门资料管理,在程序刚编译完成时,可以正确添加部门信息,修改也没有问题,但在多次运行以后,就发现添加部门信息时,只能保存部门编号,而不能保存部门的其它信息,但如果编辑部门信息,则还是一切正常。不知道是我程序代码的问题还是D7本身的问题,我已经把这个单元重做过了一次,结果还是一样,所以请教!
下面是单元文件、窗体文件、以及SQL脚本
单元文件:
unit Bmzl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Grids, DBGrids, DB, ADODB, DBControl, XPMenu,
ComCtrls, dxtree, dxdbtree,dmunit;
{DBControl是一个定义的控件,类似TDBNavigator,只是把TDBNav的事件拿出来,在程序中完成;XPMenu,dxtree,dxdbtree都是第三方控件,一个是做XP界面效果,一个是根据数据库的内容做一个TreeView;dmunit是一个程序的数据单元。
type
TfrmBmzl = class(TForm)
D1: TADODataSet;
DS: TDataSource;
DG: TDBGrid;
P: TPanel;
L5: TLabel;
L4: TLabel;
L3: TLabel;
L2: TLabel;
L1: TLabel;
E5: TEdit;
E4: TEdit;
E3: TCombobox;
E2: TEdit;
E1: TEdit;
XP: TXPMenu;
DB: TDBControl;
TV: TdxDBTreeView;
T: TADODataSet;
procedure E1KeyPress(Sender: TObject; var Key: Char);
procedure DBClick(Sender: TObject; Button: TDBBtn);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TVChange(Sender: TObject; Node: TTreeNode);
procedure E3DropDown(Sender: TObject);
private
{ Private declarations }
procedure GetCurrentRec;
procedure TSelect(S:String);
public
{ Public declarations }
end;
procedure CreateBmzl(C:String);stdcall;
var
frmBmzl: TfrmBmzl;
implementation
uses Pub_info;
{$R *.dfm}
//创建是主程序中的调用函数,来创建这个窗体
procedure CreateBmzl(C:String);
var
F:TfrmBmzl;
begin
F:=TfrmBmzl.Create(Application);
F.Caption:=C;
F.Show;
end;
procedure TfrmBmzl.E1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9',char(VK_back),Char(vk_delete):;
else Key:=#0;
end;
end;
//取当前记录的各字段值,以赋给相应的控件
procedure TfrmBmzl.GetCurrentRec;
begin
if D1.FieldByName(L1.Caption).IsNull then E1.Clear else E1.Text:=D1.FieldValues[L1.Caption];
if D1.FieldByName(L2.Caption).IsNull then E2.Clear else E2.Text:=D1.FieldValues[L2.Caption];
if D1.FieldByName(L3.Caption).IsNull then E3.Clear else E3.Text:=D1.FieldValues[L3.Caption];
if D1.FieldByName(L4.Caption).IsNull then E4.Clear else E4.Text:=D1.FieldValues[L4.Caption];
if D1.FieldByName(L5.Caption).IsNull then E4.Clear else E5.Text:=D1.FieldValues[L5.Caption];
end;
//自定数据导航控件的单击事件
procedure TfrmBmzl.DBClick(Sender: TObject; Button: TDBBtn);
begin
case Button of
dbInsert://单击添加按钮
begin
P.Enabled:=true;
D1.Append;
GetCurrentRec;
end;
dbEdit://单击编辑按钮
begin
P.Enabled:=True;
D1.Edit;
end;
dbPost://单击更新按钮
begin
P.Enabled:=False;
D1.FieldByName(L1.Caption).AsString:=E1.Text;
D1.FieldByName(L2.Caption).AsString:=E2.Text;
D1.FieldByName(L3.Caption).AsString:=E3.Text;
D1.FieldByName(L4.Caption).AsString:=E4.Text;
D1.FieldByName(L5.Caption).AsString:=E5.Text;
D1.Post;
end;
dbCancel://单击取消按钮
begin
P.Enabled:=true;
D1.Cancel;
end;
dbDelete://单击删除按钮,先判断选择的部门是否包含子部门及员工,包含则停止删除
begin
TSelect('Select 序号 From P_bmzl Where 上级部门='+D1.FieldValues['部门编号']);
if T.RecordCount>0 then
ShowInfo('指定部门有下级部门存在,请先将其清空!')
else
begin
TSelect('Select 序号 From P_ygzl Where 部门编号='+D1.FieldValues['部门编号']);
if T.RecordCount>0 then
ShowInfo('指定部门包含有多个员工,请先将其清空!')
else
D1.Delete;
end;
end;
dbRefresh:E3.Tag:=0;
dbReturn:Close;
end;
end;
procedure TfrmBmzl.FormCreate(Sender: TObject);
begin
D1.Connection:=DM.DAdoCnt;
T.Connection:=DM.DAdoCnt;
D1.CommandText:='Select * From P_bmzl Order By 上级部门,序号';
D1.Prepared:=true;
D1.Active:=true;
end;
procedure TfrmBmzl.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
procedure TfrmBmzl.TVChange(Sender: TObject; Node: TTreeNode);
begin
GetCurrentRec;
end;
//填充下接列表框
procedure TfrmBmzl.E3DropDown(Sender: TObject);
begin
If E3.Tag=0 then
begin
E3.Items.Clear;
TSelect('Select 部门编号,部门名称 From P_bmzl Order By 部门编号');
with T do
while Not Eof do
begin
E3.Items.Add(FieldValues['部门编号']+' '+Trim(FieldValues['部门名称']));
Next;
end;
E3.Tag:=1;
end;//End of If
end;
procedure TfrmBmzl.TSelect(S: String);
begin
T.Active:=False;
T.CommandText:=S;
T.Prepared:=True;
T.Active:=True;
end;
end.