⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitinstore.pas

📁 一个操作sql server的实例
💻 PAS
📖 第 1 页 / 共 2 页
字号:
      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 + -