📄 unitmain.pas
字号:
//本程序对于一些主要的控件比如TDatabase属性为了便于理解,都放在程序里,不需要这设计时作设置。
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, Grids, DBGrids, StdCtrls, DBTables, Menus;
type
TFormMain = class(TForm)
Query1: TQuery;
Database1: TDatabase;
MainMenu1: TMainMenu;
MenuItemWork: TMenuItem;
ItemInStore: TMenuItem;
ItemExit: TMenuItem;
ItemEmployee: TMenuItem;
ItemStore: TMenuItem;
ItemGoods: TMenuItem;
ItemStorage: TMenuItem;
procedure ItemExitClick(Sender: TObject);
procedure ItemInStoreClick(Sender: TObject);
procedure ItemEmployeeClick(Sender: TObject);
procedure ItemStoreClick(Sender: TObject);
procedure ItemGoodsClick(Sender: TObject);
procedure ItemStorageClick(Sender: TObject);
private
Function ChildFormExists(FormName: String):Boolean;
{ Private declarations }
public
constructor Create(AOwner: TComponent); override; //重载Form的Create构造函数。
{ Public declarations }
end;
var
FormMain: TFormMain;
ServerName,UserName,Password:String;
MainFormCreated:Boolean;
Function CheckTableIsExistsed:Boolean;
implementation
Uses UnitDataBaseInfo,UnitInStore,UnitEmployee, UnitStore, UnitGoods,UnitStorage,UnitFlash;
{$R *.DFM}
Function CheckTableIsExistsed:Boolean;
begin
Result:=True;
try
With TQuery.Create(Application) do
begin
Try
DatabaseName:=FormMain.Database1.DatabaseName;
//检查商品数据表是否建立。
SQL.Clear;
SQL.Add('Select * from SysObjects Where Name="Goods"');
//每个数据库的所有的表都在本数据库的SysObjects中有记录。
Try
Open;
Except
On E:Exception do
begin
ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
if IsEmpty then//如果返回结果集为空,则表示没有商品数据表。
begin
SQL.Clear;
SQL.Add('CREATE TABLE Goods (');//创建数据表。
SQL.Add(' [iNo] [INT] NOT NULL ,'); //关键字段。编号
SQL.Add(' [sName] [varchar] (40) NULL ,'); //名称。为避免和数据的保留字冲突,建议字段名前类型缩写,比如用sName而不用Name做字段名。
SQL.Add(' [sEName] [varchar] (40) NULL ,'); //英文名称
SQL.Add(' [iUnit] [varchar] (6) NULL ,'); //单位。
SQL.Add(' [fPrice] [varchar] (4) NULL)'); //单价。
Try
ExecSQL;
//这里用ExecSQL而不是用Open,是因为DataSet的Open方法只是用于打开SQL语是Select语句的返回结果集
//对于其它SQL语句因为没有返回集所以只能用ExecSQL来执行。
SQL.Clear;
SQL.Add('ALTER TABLE Goods WITH NOCHECK ADD');
SQL.Add(' PRIMARY KEY CLUSTERED ([iNo]) ON [PRIMARY]');
ExecSQL;
//创建主关键字段约束。一旦创建主关键字段约束,这个表中的主关键字段就是iNo,这个字段就不允许有重复。并且数据都会按照这个字段自动排序。
Except
On E:Exception do
begin
ShowMessage('创建商品数据表:Goods出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
end;
SQL.Clear;
SQL.Add('Select * from SysObjects Where Name="Employee"');
Try
Open;
Except
On E:Exception do
begin
ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
if IsEmpty then
begin
SQL.Clear;
SQL.Add('CREATE TABLE Employee ('); //建立员工表。
SQL.Add(' [iNo] [INT] NOT NULL ,'); //关键字段。编号
SQL.Add(' [sName] [varchar] (40) NULL ,'); //姓名
SQL.Add(' [sEName] [varchar] (40) NULL)'); //英文名。
Try
ExecSQL;
//这里用ExecSQL而不是用Open,是因为DataSet的Open方法只是用于打开SQL语是Select语句的返回结果集
//对于其它SQL语句因为没有返回集所以只能用ExecSQL来执行。
SQL.Clear;
SQL.Add('ALTER TABLE Employee WITH NOCHECK ADD');
SQL.Add(' PRIMARY KEY CLUSTERED ([iNo]) ON [PRIMARY]');
ExecSQL;
//创建主关键字段约束。
Except
On E:Exception do
begin
ShowMessage('创建员工数据表:Emploree出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
end;
SQL.Clear;
SQL.Add('Select * from SysObjects Where Name="Store"');
Try
Open;
Except
On E:Exception do
begin
ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
if IsEmpty then
begin
SQL.Clear;
SQL.Add('CREATE TABLE Store ('); //建立仓库表。
SQL.Add(' [iNo] [INT] NOT NULL ,'); //关键字段。编号
SQL.Add(' [sName] [varchar] (40) NULL ,'); //名称。
SQL.Add(' [sEName] [varchar] (40) NULL)'); //英文名。
Try
ExecSQL;
//这里用ExecSQL而不是用Open,是因为DataSet的Open方法只是用于打开SQL语是Select语句的返回结果集
//对于其它SQL语句因为没有返回集所以只能用ExecSQL来执行。
SQL.Clear;
SQL.Add('ALTER TABLE Store WITH NOCHECK ADD');
SQL.Add(' PRIMARY KEY CLUSTERED ([iNo]) ON [PRIMARY]');
ExecSQL;
//创建主关键字段约束。
Except
On E:Exception do
begin
ShowMessage('创建仓库数据表:Store出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
end;
SQL.Clear;
SQL.Add('Select * from SysObjects Where Name="Storage"');
Try
Open;
Except
On E:Exception do
begin
ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
if IsEmpty then
begin
SQL.Clear;
SQL.Add('CREATE TABLE Storage ('); //库存数据量表。
SQL.Add(' [iStoreNo] [Int] NOT NULL ,'); //仓库编号
SQL.Add(' [iGoodsNo] [INT] NOT NULL ,'); //商品编号。
SQL.Add(' [fQuantity] [Numeric] (8,2) NULL)'); //商品数量。
Try
ExecSQL;
SQL.Clear;
SQL.Add('ALTER TABLE Storage WITH NOCHECK ADD');
SQL.Add(' PRIMARY KEY CLUSTERED ([iStoreNo],[iGoodsNo]) ON [PRIMARY]');
SQL.Add('ALTER TABLE Storage ADD');
SQL.Add(' FOREIGN KEY ([iStoreNo]) REFERENCES Store ([iNo])');
SQL.Add('ALTER TABLE Storage ADD');
SQL.Add(' FOREIGN KEY ([iGoodsNo]) REFERENCES Goods ([iNo])');
ExecSQL;
//创建主关键字段约束和外键。
//在SQL中,外键是指一个表(称之为关连表)中的某个字段(称之为关连字段)与另一个表(称之为被关连表)的某个字段(称之为被关连字段)关连,
//当创建了外键约束后,关连表的每一个关连字段的记录值,都必须在被关连表中存在。而被关连表中被关连字段的值如果在关连表中存在,
//则被关连表的这个记录的被关连字段值不允许修改,也不允许删除。
//如果说主键约束主要是保证字段值的唯一性的话,外键约束就是为了保存整个数据库数据的完整性。
//也就是说:InStoreMaster的员工编号字段不允许也不应该存在一个在Employee表中不存在的记录。
Except
On E:Exception do
begin
ShowMessage('创建仓库数据表:Store出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
end;
SQL.Clear;
SQL.Add('Select * from SysObjects Where Name="InStoreMaster"');
Try
Open;
Except
On E:Exception do
begin
ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
if IsEmpty then
begin
SQL.Clear;
SQL.Add('CREATE TABLE InStoreMaster ('); //创建进仓单明细表。
SQL.Add(' [iNo] [VARCHAR] (12) NOT NULL ,'); //单号
SQL.Add(' [dDate] [DateTime] NULL ,'); //商品编号。
SQL.Add(' [iStore] [INT] NOT NULL ,'); //仓库编号。
SQL.Add(' [iEmployee] [INT] NOT NULL)'); //员工。
Try
ExecSQL;
SQL.Clear;
SQL.Add('ALTER TABLE InStoreMaster WITH NOCHECK ADD');
SQL.Add(' PRIMARY KEY CLUSTERED ([iNo]) ON [PRIMARY]');
SQL.Add('ALTER TABLE InStoreMaster ADD');
SQL.Add(' FOREIGN KEY ([iEmployee]) REFERENCES Employee ([iNo])');
ExecSQL;
//创建主关键字段约束和外键。
//在SQL中,外键是指一个表(称之为关连表)中的某个字段(称之为关连字段)与另一个表(称之为被关连表)的某个字段(称之为被关连字段)关连,
//当创建了外键约束后,关连表的每一个关连字段的记录值,都必须在被关连表中存在。而被关连表中被关连字段的值如果在关连表中存在,
//则被关连表的这个记录的被关连字段值不允许修改,也不允许删除。
//如果说主键约束主要是保证字段值的唯一性的话,外键约束就是为了保存整个数据库数据的完整性。
//也就是说:InStoreMaster的员工编号字段不允许也不应该存在一个在Employee表中不存在的记录。
Except
On E:Exception do
begin
ShowMessage('创建仓库数据表:Store出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
end;
SQL.Clear;
SQL.Add('Select * from SysObjects Where Name="InStoreDetail"');
Try
Open;
Except
On E:Exception do
begin
ShowMessage('打开系统数据表:SysObjects出错,请检查网络连接是否正常!'+#13#10+
'错误信息:'+E.Message);
Raise;
end;
end;
if IsEmpty then
begin
SQL.Clear;
SQL.Add('CREATE TABLE InStoreDetail ('); //创建进仓单明细表。
SQL.Add(' [iNo] [VARCHAR] (12) NOT NULL ,'); //单号
SQL.Add(' [iGoodsNo] [INT] NOT NULL ,'); //商品编号。
SQL.Add(' [fPrice] [Money] NULL ,'); //单价。
SQL.Add(' [fQuantity] [Numeric] (8,2) NULL)'); //数量。
Try
ExecSQL;
SQL.Clear;
SQL.Add('ALTER TABLE InStoreDetail WITH NOCHECK ADD');
SQL.Add(' PRIMARY KEY CLUSTERED ([iNo],[iGoodsNo]) ON [PRIMARY]');
SQL.Add('ALTER TABLE InStoreDetail ADD');
SQL.Add(' FOREIGN KEY ([iGoodsNo]) REFERENCES Goods ([iNo])');
SQL.Add('ALTER TABLE InStoreDetail ADD');
SQL.Add(' FOREIGN KEY ([iNo]) REFERENCES InStoreMaster ([iNo])');
ExecSQL;
//创建主关键字段约束和外键。
//在SQL中,外键是指一个表(称之为关连表)中的某个字段(称之为关连字段)与另一个表(称之为被关连表)的某个字段(称之为被关连字段)关连,
//当创建了外键约束后,关连表的每一个关连字段的记录值,都必须在被关连表中存在。而被关连表中被关连字段的值如果在关连表中存在,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -