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

📄 unitinstore.pas

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