📄 unitinstore.pas
字号:
unit UnitInStore;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, DBTables, StdCtrls, Mask, DBCtrls,UnitMain, Grids, DBGrids,
ExtCtrls;
type
TFormInStore = class(TForm)
QueryGoods: TQuery;
QueryEmployee: TQuery;
QueryInStoreMaster: TQuery;
QueryInStoreDetail: TQuery;
QueryStore: TQuery;
DataSourceInStoreMaster: TDataSource;
DataSourceInStoreDetail: TDataSource;
QueryInStoreMasteriNo: TStringField;
QueryInStoreMasterdDate: TDateTimeField;
QueryInStoreMasteriEmployee: TIntegerField;
QueryEmployeeiNo: TIntegerField;
QueryEmployeesName: TStringField;
QueryEmployeesEName: TStringField;
DBGrid1: TDBGrid;
DataSourceEmploree: TDataSource;
DataSourceStore: TDataSource;
QueryInStoreDetailiNo: TStringField;
QueryInStoreDetailiGoodsNo: TIntegerField;
QueryInStoreDetailfPrice: TCurrencyField;
QueryInStoreDetailfQuantity: TFloatField;
QueryGoodsiNo: TIntegerField;
QueryGoodssName: TStringField;
QueryGoodssEName: TStringField;
QueryGoodsiUnit: TStringField;
QueryGoodsfPrice: TStringField;
QueryInStoreMasteriStore: TIntegerField;
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label4: TLabel;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit4: TDBEdit;
DBLookupComboBoxStore: TDBLookupComboBox;
Panel2: TPanel;
Label3: TLabel;
DBLookupComboBoxEmployee: TDBLookupComboBox;
DBEdit3: TDBEdit;
DBNavigatorMaster: TDBNavigator;
UpdateSQLDetail: TUpdateSQL;
UpdateSQLMaster: TUpdateSQL;
DBNavigatorDetail: TDBNavigator;
procedure QueryInStoreMasterAfterOpen(DataSet: TDataSet);
procedure QueryInStoreMasterBeforeClose(DataSet: TDataSet);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure QueryInStoreMasteriEmployeeSetText(Sender: TField;
const Text: String);
procedure QueryInStoreMasteriStoreSetText(Sender: TField;
const Text: String);
procedure FormDestroy(Sender: TObject);
procedure QueryInStoreDetailiGoodsNoSetText(Sender: TField;
const Text: String);
procedure QueryInStoreMasterNewRecord(DataSet: TDataSet);
procedure QueryInStoreDetailNewRecord(DataSet: TDataSet);
procedure QueryInStoreMasterBeforeScroll(DataSet: TDataSet);
procedure QueryInStoreMasterBeforeDelete(DataSet: TDataSet);
procedure DBNavigatorMasterBeforeAction(Sender: TObject;
Button: TNavigateBtn);
procedure QueryInStoreDetailBeforeClose(DataSet: TDataSet);
procedure DBNavigatorDetailBeforeAction(Sender: TObject;
Button: TNavigateBtn);
procedure QueryInStoreDetailAfterClose(DataSet: TDataSet);
procedure QueryInStoreDetailCalcFields(DataSet: TDataSet);
procedure FormActivate(Sender: TObject);
procedure DataSourceInStoreDetailStateChange(Sender: TObject);
procedure DataSourceInStoreDetailDataChange(Sender: TObject;
Field: TField);
procedure QueryInStoreDetailiGoodsNoChange(Sender: TField);
procedure DBEdit4KeyPress(Sender: TObject; var Key: Char);
private
GoodsNameField:TStringField;
SumField:TCurrencyField;
procedure SaveMasterCurrentRecord;
{ Private declarations }
public
constructor Create(AOwner: TComponent); override; //重载Form的Create构造函数。
{ Public declarations }
end;
var
FormInStore: TFormInStore;
implementation
Uses UnitSingleEmployee,UnitSingleStore,UnitSingleGoods;
{$R *.DFM}
{ TFormInStore }
constructor TFormInStore.Create(AOwner: TComponent);
begin
if CheckTableIsExistsed then//如果数据表完全正确,就创建Form,否则退出。
begin
inherited Create(AOwner);
//DBLookupComboBoxEmployee的属性可以在Object Inspector窗口中设置,但是为了便于明白,我还是把主要的属性设置写成代码。
DBLookupComboBoxEmployee.DataSource:=DataSourceInStoreMaster;//这个属性想你也知道了。
DBLookupComboBoxEmployee.DataField:='iEmployee'; //虽然我们是用这个控件来显示开这张单的员工姓名
//而InStoreMaster表中又没有姓名这个字段,但是TDBLookupComboBox这个控件让我们可以做到这一点。
DBLookupComboBoxEmployee.ListSource:=DataSourceEmploree; //我们需要列出的下拉列表框中的姓名数据的来源。
DBLookupComboBoxEmployee.ListField:='sName'; //我们需要在下拉列表框中列出的字段
DBLookupComboBoxEmployee.KeyField:='iNo'; //与DataSourceEmploree中和iEmployee属性相关连的Field。
//DBLookupComboBoxStore的属性可以在Object Inspector窗口中设置,但是为了便于明白,我还是把主要的属性设置写成代码。
DBLookupComboBoxStore.DataSource:=DataSourceInStoreMaster;//这个属性想你也知道了。
DBLookupComboBoxStore.DataField:='iStore'; //虽然我们是用这个控件来显示开这张单的仓库名称
//而InStoreMaster表中又没有名称这个字段,但是TDBLookupComboBox这个控件让我们可以做到这一点。
DBLookupComboBoxStore.ListSource:=DataSourceStore; //我们需要列出的下拉列表框中的名称数据的来源。
DBLookupComboBoxStore.ListField:='sName'; //我们需要在下拉列表框中列出的字段
DBLookupComboBoxStore.KeyField:='iNo'; //与DataSourceStore中和iStore属性相关连的Field。
GoodsNameField:=TStringField.Create(QueryInStoreDetail);
GoodsNameField.FieldName:='GoodsNameField';
GoodsNameField.DisplayLabel:='品名';
GoodsNameField.FieldKind:=fkLookup; //这个字段是一个LoopUp字段。
GoodsNameField.DataSet:=QueryInStoreDetail; //这个字段属于QueryInStoreDetail。
GoodsNameField.DisplayWidth:=QueryGoods.FieldByName('sName').DisplayWidth;//显示宽度。
GoodsNameField.Size:=QueryGoods.FieldByName('sName').Size; //宽度。
GoodsNameField.LookupDataSet:=QueryGoods;
GoodsNameField.LookupKeyFields:='iNo';
GoodsNameField.LookupResultField:='sName';
GoodsNameField.KeyFields:='iGoodsNo';
GoodsNameField.Index:=2;
SumField:=TCurrencyField.Create(QueryInStoreDetail);
SumField.FieldName:='SumField';
SumField.DisplayLabel:='合计';
SumField.FieldKind:=fkCalculated; //这个字段是一个计算(Calculated)字段。
SumField.DataSet:=QueryInStoreDetail; //这个字段属于QueryInStoreDetail。
// SumField.DisplayWidth:=QueryGoods.FieldByName('sName').DisplayWidth;//显示宽度。
// SumField.Size:=QueryGoods.FieldByName('sName').Size; //宽度。
//数字型或货币型字段不需设长度。
// SumField.LookupDataSet:=QueryGoods;
// SumField.LookupKeyFields:='iNo';
// SumField.LookupResultField:='sName';
// SumField.KeyFields:='iGoods';
//计算字段不需要设上面四个属性。
QueryInStoreDetail.FieldByName('iNo').DisplayLabel:='No';
QueryInStoreDetail.FieldByName('iNo').Visible:=False;
QueryInStoreDetail.FieldByName('fPrice').DisplayLabel:='单价';
QueryInStoreDetail.FieldByName('fQuantity').DisplayLabel:='数量';
QueryInStoreDetail.FieldByName('iGoodsNo').DisplayLabel:='商品编号';
QueryGoods.Close;
QueryGoods.SQL.Clear;
QueryGoods.SQL.Add('Select * from Goods');
QueryGoods.Open;
QueryEmployee.Close;
QueryEmployee.SQL.Clear;
QueryEmployee.SQL.Add('Select * from Employee');
QueryEmployee.Open;
QueryStore.Close;
QueryStore.SQL.Clear;
QueryStore.SQL.Add('Select * from Store');
QueryStore.Open;
QueryInStoreMaster.Close;
QueryInStoreMaster.RequestLive:=True;
QueryInStoreMaster.CachedUpdates:=True;
QueryInStoreMaster.SQL.Clear;
QueryInStoreMaster.SQL.Add('Select * from InStoreMaster');
QueryInStoreMaster.Open;
end;
end;
procedure TFormInStore.QueryInStoreMasterAfterOpen(DataSet: TDataSet);
begin
QueryInStoreDetail.Close;
QueryInStoreDetail.RequestLive:=True;
QueryInStoreDetail.CachedUpdates:=True;
QueryInStoreDetail.DataSource:=DataSourceInStoreMaster;//
//建立应用程序这关连。
QueryInStoreDetail.SQL.Clear;
QueryInStoreDetail.SQL.Add('Select * from InStoreDetail Where iNo=:iNo');
QueryInStoreDetail.Open;
//请注意这里的SQL语句中有一个iNo参数,但是确没有给这个参数赋值。
//这是因为QueryInStoreDetail的DataSource属性已经设为DataSourceInStoreMaster,
//这时如果没有给参数赋值,它会到DataSource属性所指向的DataSource也就是DataSourceInStoreMaster
//的DataSet所指向的DataSet也就是QueryInStoreMaster去找名为iNo的字段,如果找到,
//它会自动把这个字段当前记录的值作为它的参数值(所以把这段代码放在QueryInStoreMaster的AfterOpen事件中,
//就是因为QueryInStoreMaster必须打开。),如果QueryInStoreMaster没有打开或其中没有这个字段则会出错。
//而且最重要的,当建立这样的关连后,当QueryInStoreMaster的记录移动时,QueryInStoreDetail会自动根据
//QueryInStoreMaster当前记录的iNo字段的值来刷新。
end;
procedure TFormInStore.QueryInStoreMasterBeforeClose(DataSet: TDataSet);
begin
QueryInStoreDetail.Close;
//上面说到如果QueryInStoreMaster已经关闭,则打开QueryInStoreDetail会出错,所以为保险起见,在BeforeClose事件中先关闭QueryInStoreDetail。
end;
procedure TFormInStore.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
//对于MDIChild Form,必须要在OnClose事件中加这一行才能关闭。
end;
procedure TFormInStore.QueryInStoreMasteriEmployeeSetText(Sender: TField;
const Text: String);
Var iNo:Integer;
begin
//在本事件中如果不给QueryInStoreMasteriEmployee.AsInteger赋值则QueryInStoreMasteriEmployee字段的值将无法输入。
//如果输入了非法的字符串或输入的编号不在Employee表中则弹出一个对话框供输入新的记录。
Try
iNo:=StrToInt(Text);
Except
Exit;
//如果字符串不是数字则退出。
end;
With TQuery.Create(Application) do
begin
Try
DatabaseName:=FormMain.Database1.DatabaseName;
SQL.Add('Select * from Employee Where iNo=:iNo');
ParamByName('iNo').AsInteger:=iNo;
//检查输入的编号在Employee表中是否存在。
Open;
if IsEmpty then //返回结果集为空表示不存在。
begin
with TFormSingleEmployee.Create(Self) do
//创建一个输入员工的对话框实例。请看TFormSingleEmployee的OnCreate事件中的代码。
begin
Try
Query1.Append; //添加一个记录。
Query1.FieldByName('iNo').AsInteger:=iNo;//并把新输入的编号加进去。
if ShowModal=mrOK then//如果按OK键。
begin
QueryEmployee.Close; //重新打开Employee表。
QueryEmployee.Open;
QueryInStoreMasteriEmployee.AsInteger:=iNo;
end;
finally
Free;
end;
end;
end else
QueryInStoreMasteriEmployee.AsInteger:=iNo;
finally
Free;
end;
end;
end;
procedure TFormInStore.QueryInStoreMasteriStoreSetText(Sender: TField;
const Text: String);
Var iNo:Integer;
begin
//在本事件中如果不给QueryInStoreMasteriStore.AsInteger赋值则QueryInStoreMasteriStore字段的值将无法输入。
//如果输入了非法的字符串或输入的编号不在Store表中则弹出一个对话框供输入新的记录。
Try
iNo:=StrToInt(Text);
Except
Exit;
//如果字符串不是数字则退出。
end;
With TQuery.Create(Application) do
begin
Try
DatabaseName:=FormMain.Database1.DatabaseName;
SQL.Add('Select * from Store Where iNo=:iNo');
ParamByName('iNo').AsInteger:=iNo;
//检查输入的编号在Store表中是否存在。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -