📄 unitinstore.pas
字号:
Open;
if IsEmpty then //返回结果集为空表示不存在。
begin
with TFormSingleStore.Create(Self) do
//创建一个输入员工的对话框实例。请看TFormSingleStore的OnCreate事件中的代码。
begin
Try
Query1.Append; //添加一个记录。
Query1.FieldByName('iNo').AsInteger:=iNo;//并把新输入的编号加进去。
if ShowModal=mrOK then//如果按OK键。
begin
QueryStore.Close; //重新打开Employee表。
QueryStore.Open;
QueryInStoreMasteriStore.AsInteger:=iNo;
end;
finally
Free;
end;
end;
end else
QueryInStoreMasteriStore.AsInteger:=iNo;
finally
Free;
end;
end;
end;
procedure TFormInStore.FormDestroy(Sender: TObject);
begin
GoodsNameField.Free;
SumField.Free;
end;
procedure TFormInStore.QueryInStoreDetailiGoodsNoSetText(Sender: TField;
const Text: String);
Var iNo:Integer;
begin
//在本事件中如果不给QueryInStoreDetailiGoodsNo.AsInteger赋值则QueryInStoreDetailiGoodsNo字段的值将无法输入。
//如果输入了非法的字符串或输入的编号不在Goods表中则弹出一个对话框供输入新的记录。
Try
iNo:=StrToInt(Text);
Except
Exit;
//如果字符串不是数字则退出。
end;
With TQuery.Create(Application) do
begin
Try
DatabaseName:=FormMain.Database1.DatabaseName;
SQL.Add('Select * from Goods Where iNo=:iNo');
ParamByName('iNo').AsInteger:=iNo;
//检查输入的编号在Goods表中是否存在。
Open;
if IsEmpty then //返回结果集为空表示不存在。
begin
with TFormSingleGoods.Create(Self) do
//创建一个输入对话框实例。请看TFormSingleGoods的OnCreate事件中的代码。
begin
Try
Query1.Append; //添加一个记录。
Query1.FieldByName('iNo').AsInteger:=iNo;//并把新输入的编号加进去。
if ShowModal=mrOK then//如果按OK键。
begin
QueryGoods.Close; //重新打开Employee表。
QueryGoods.Open;
QueryInStoreDetailiGoodsNo.AsInteger:=iNo;
end;
finally
Free;
end;
end;
end else
QueryInStoreDetailiGoodsNo.AsInteger:=iNo;
finally
Free;
end;
end;
end;
procedure TFormInStore.QueryInStoreMasterNewRecord(DataSet: TDataSet);
begin
QueryInStoreMasteriNo.AsString:=IntToHex(Trunc(TimeStampToMSecs(DateTimeToTimeStamp(Now))),12);
//取当前时间的毫秒数转换成十六进制字符串做INO确保不会重复。
end;
procedure TFormInStore.QueryInStoreDetailNewRecord(DataSet: TDataSet);
begin
QueryInStoreDetailiNo.AsString:=QueryInStoreMasteriNo.AsString;
QueryInStoreDetailfQuantity.AsFloat:=1;
QueryInStoreDetailfPrice.AsFloat:=0;
//明细表的INO字段与主表的INO字段要相同。
end;
procedure TFormInStore.QueryInStoreMasterBeforeScroll(DataSet: TDataSet);
begin
SaveMasterCurrentRecord;
//移动记录前需要保存数据,否则Detail明细表的数据将会丢失。
end;
procedure TFormInStore.SaveMasterCurrentRecord;
var ThisDataSource:TDataSource;
begin
with FormMain.Database1 do
begin
ThisDataSource:=QueryInStoreDetail.DataSource;
QueryInStoreDetail.DataSource:=nil;
//这里需要将QueryInStoreDetail.DataSource置为nil是因为如果不设为空,
//QueryInStoreMaster.Post时会关闭并重新打开QueryInStoreDetail。这样将会丢失数据。
try
if QueryInStoreDetail.State in dsEditModes then//先将正在修改的数据提交到内存缓冲区。
QueryInStoreDetail.Post;
if QueryInStoreMaster.State in dsEditModes then//先将正在修改的数据提交到内存缓冲区。
QueryInStoreMaster.Post;
if QueryInStoreMaster.UpdatesPending or QueryInStoreDetail.UpdatesPending then
//如果缓存中有数据需要更新到服务器。
begin
if QueryInStoreMaster.UpdateStatus = usInserted then//如果当前记录是新增加的记录。
ApplyUpdates([QueryInStoreMaster, QueryInStoreDetail])//先更新主表再更新明细表,因为明细表中的INO字段必须在主表中存在。
else
ApplyUpdates([QueryInStoreDetail, QueryInStoreMaster]);
end;
finally
QueryInStoreDetail.DataSource:=ThisDataSource;//恢复DataSource属性。
end;
end;
end;
procedure TFormInStore.QueryInStoreMasterBeforeDelete(DataSet: TDataSet);
begin
While not QueryInStoreDetail.IsEmpty do
QueryInStoreDetail.Delete;
//删除主表时首先删除从表否则主表保存会出错。因为明细表中INO字段有的值在主表中必须存在。
end;
procedure TFormInStore.DBNavigatorMasterBeforeAction(Sender: TObject;
Button: TNavigateBtn);
begin
if Button in [nbFirst, nbPrior, nbNext, nbLast] then
Exit;
//如果是以上四个按钮则执行内置动作。
case Button of
nbInsert: //把Insert动作改成插入动作。
DBNavigatorMaster.DataSource.DataSet.Append;
nbCancel:
begin
if QueryInStoreMaster.State in dsEditModes then
QueryInStoreMaster.Cancel;
QueryInStoreMaster.CancelUpdates;
QueryInStoreMaster.CommitUpdates;
//如果主表取消,则重要需要保存。
end;
nbDelete:
begin
QueryInStoreMaster.Delete;
SaveMasterCurrentRecord;
//主表删除时从表需要保存。
end;
nbPost:
SaveMasterCurrentRecord;
//提交时保存。
nbRefresh:
begin
QueryInStoreMaster.Close;
QueryInStoreMaster.Open;
//刷新时重新打开数据表。
end;
end;
Abort;
//不再执行内置动作。
end;
procedure TFormInStore.QueryInStoreDetailBeforeClose(DataSet: TDataSet);
begin
Try
//关闭前检查主表是否是插入状态,如果不是就保存数据。如果是,因为服务器没有相应的主表记录,所以从表不能保存。
if QueryInStoreDetail.UpdateStatus<>usInserted then
begin
if QueryInStoreDetail.State in dsEditModes then
QueryInStoreDetail.Post;
if QueryInStoreDetail.UpdatesPending then
begin
QueryInStoreDetail.ApplyUpdates;
QueryInStoreDetail.CommitUpdates;
end;
end;
Except
end;
end;
procedure TFormInStore.DBNavigatorDetailBeforeAction(Sender: TObject;
Button: TNavigateBtn);
begin
case Button of
nbRefresh:
begin
QueryInStoreDetail.Close;
QueryInStoreDetail.Open;
Abort;
//取消执行内置动作。
end;
nbInsert://把Insert动作改成插入动作。
begin
QueryInStoreDetail.Append;
Abort;
//取消执行内置动作。
end;
end;
end;
procedure TFormInStore.QueryInStoreDetailAfterClose(DataSet: TDataSet);
Var i:Integer;
begin
For i:=0 to DBGrid1.Columns.Count-1 do
DBGrid1.Columns[i].Title.Alignment:=taCenter;
//使用标题置中。
end;
procedure TFormInStore.QueryInStoreDetailCalcFields(DataSet: TDataSet);
begin
SumField.AsCurrency:=QueryInStoreDetailfPrice.AsCurrency*QueryInStoreDetailfQuantity.AsFloat;
//计算字段只能在这里赋值,其他地方赋值没有用,而这个事件中只能对计算字段赋值,因为对于其他任何字段的修改都将触发这个事件。
end;
procedure TFormInStore.FormActivate(Sender: TObject);
begin
WindowState:=wsMaximized;
end;
procedure TFormInStore.DataSourceInStoreDetailStateChange(Sender: TObject);
Var b:Boolean;
begin
b:=(QueryInStoreDetail.State in dsEditModes) or QueryInStoreDetail.UpdatesPending;
b:=b or (QueryInStoreMaster.State in dsEditModes) or QueryInStoreMaster.UpdatesPending;
TNavButton(DBNavigatorMaster.Controls[ORD(nbPost)]).Enabled:=b;
TNavButton(DBNavigatorMaster.Controls[ORD(nbCancel)]).Enabled:=b;
//改变导航接钮的状态/
end;
procedure TFormInStore.DataSourceInStoreDetailDataChange(Sender: TObject;
Field: TField);
Var b:Boolean;
begin
b:=(QueryInStoreDetail.State in dsEditModes) or QueryInStoreDetail.UpdatesPending;
b:=b or (QueryInStoreMaster.State in dsEditModes) or QueryInStoreMaster.UpdatesPending;
TNavButton(DBNavigatorMaster.Controls[ORD(nbPost)]).Enabled:=b;
TNavButton(DBNavigatorMaster.Controls[ORD(nbCancel)]).Enabled:=b;
//改变导航接钮的状态/
end;
procedure TFormInStore.QueryInStoreDetailiGoodsNoChange(Sender: TField);
begin
With TQuery.Create(Application) do
begin
Try
DatabaseName:=FormMain.Database1.DatabaseName;
SQL.Add('Select fPrice From Goods where ino=:INO');
ParamByName('INO').AsInteger:=Sender.AsInteger;
Open;
if (not IsEmpty) and (not FieldByName('fPrice').IsNull) then
QueryInStoreDetailfPrice.AsCurrency:=FieldByName('fPrice').AsCurrency
else
QueryInStoreDetailfPrice.AsCurrency:=1;
Finally
Free;
end;
end;
end;
procedure TFormInStore.DBEdit4KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
TDBEdit(Sender).Field.Text:=TDBEdit(Sender).Text;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -