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

📄 untinstock.~pas

📁 数据库实习个人作品
💻 ~PAS
字号:
unit untInStock;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DB, ADODB, ExtCtrls;

type
  TfrmInStock = class(TForm)
    Panel1: TPanel;
    Bevel1: TBevel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    edtGoodsCode: TEdit;
    edtInPrice: TEdit;
    edtQtyInStock: TEdit;
    edtGoodsName: TEdit;
    edtUnit: TEdit;
    edtPrice: TEdit;
    edtSafeStock: TEdit;
    Label8: TLabel;
    edtQtyBuyMin: TEdit;
    uspTmp: TADOStoredProc;
    btnOK: TBitBtn;
    btnCancel: TBitBtn;
    procedure edtGoodsCodeExit(Sender: TObject);
    procedure btnOKClick(Sender: TObject);
  private
    function CheckAllRecords: Boolean;
    function SaveAllRecords: Boolean;
  public
    function Execute: Boolean;
  end;

var
  frmInStock: TfrmInStock;

implementation

uses untGoodsOrderDat;

//  注意:如何定义一个不属于类的独立函数??
//  将一个指定的数字型字符串转换为一个实型数据,缺省值为Default
function StrToFloatDef(const S: String; Default: Extended): Extended;
var
  nErrNo: Integer;
begin
  // 将字符串S转换对应的数值 ,If Result is an integer-type variable, S must form a whole number.
  Val(S, Result, nErrNo);
  if nErrNo <> 0 then Result := Default;
end;


{$R *.dfm}

function TfrmInStock.Execute: Boolean;
begin
  //  初始化窗体显示内容
  edtGoodsCode.Text := '';
  edtInPrice.Text := '';
  edtQtyInStock.Text := '';
  edtGoodsName.Text := '';
  edtUnit.Text := '';
  edtPrice.Text := '';
  edtSafeStock.Text := '';
  edtQtyBuyMin.Text := '';
  //  显示窗体,并返回函数结果
  Result := ShowModal = mrOK;
end;

function TfrmInStock.SaveAllRecords: Boolean;
var
  sGoodsCode: string;
begin
  Result := False;
  with datGoodsOrder do begin
    //  开始事务提交
    conGoodsOrder.BeginTrans;

    try
      //  打开商品表
      qryGoods.SQL.Text := 'SELECT * FROM Goods';
      qryGoods.LockType := ltBatchOptimistic;
      qryGoods.CursorType := ctKeyset;
      qryGoods.Open;

      // 打开入库明细表,为什么条件写成“WHERE 1=0”?
      // -- InStock表中不可能存在第一列(Ind)为0的记录,故返回为空
      qryInStock.SQL.Text := 'SELECT * FROM InStock WHERE 1=0';
      qryInStock.LockType := ltBatchOptimistic; //  锁类型
      qryInStock.CursorType := ctKeyset;  //  指针类型
      qryInStock.Open;

      sGoodsCode := Trim(edtGoodsCode.Text);

      //  向商品表中追加或修改基本信息
      if qryGoods.Locate('GoodsCode',sGoodsCode,[]) then
        qryGoods.Edit     //  准备修改商品表中的记录
      else begin
        qryGoods.Append;  //  向商品表追加商品记录
        qryGoods.FieldByName('GoodsCode').AsString := sGoodsCode;
      end;
      qryGoods.FieldByName('GoodsName').AsString := Trim(edtGoodsName.Text);
      qryGoods.FieldByName('Unit').AsString := Trim(edtUnit.Text);
      qryGoods.FieldByName('Price').AsCurrency := StrToFloatDef(edtPrice.Text,0.0);
      qryGoods.FieldByName('SafeStock').AsCurrency := StrToFloatDef(edtSafeStock.Text,0.0);
      qryGoods.FieldByName('QtyBuyMin').AsCurrency := StrToFloatDef(edtQtyBuyMin.Text,0.0);
      qryGoods.Post;
      //  批更新商品表
      qryGoods.UpdateBatch;

      //  向入库明细表中追加记录
      //  注:通过入库明细表的插入触发器完成对库存表的追加记录
      qryInStock.Append;
      qryInStock.FieldByName('DateInStock').AsDateTime := now;
      qryInStock.FieldByName('GoodsCode').AsString := sGoodsCode;
      qryInStock.FieldByName('QtyInStock').AsCurrency := StrToFloatDef(edtQtyInStock.Text,0.0);
      qryInStock.FieldByName('Price').AsCurrency := StrToFloatDef(edtInPrice.Text,0.0);
      qryInStock.Post;
      //  批更新商品入库表
      qryInStock.UpdateBatch;

      //  事务提交
      conGoodsOrder.CommitTrans;

      //  修改缺货订单状态
      uspTmp.Parameters.Clear;
      uspTmp.ProcedureName := 'usp_ChgOrderState';
      uspTmp.Parameters.CreateParameter('GoodsCode',ftString,pdInput,10,sGoodsCode);
      uspTmp.Parameters.CreateParameter('Result',ftSmallInt,pdOutput,0,0);
      uspTmp.ExecProc;
      
      Result := True;
    except
      //  回滚事务
      conGoodsOrder.RollbackTrans;
      MessageDlg('保存数据失败!',mtError,[mbOK],0);
      Close;
    end;
  end;
end;

function TfrmInStock.CheckAllRecords: Boolean;
begin
  Result := True;

  if Trim(edtGoodsCode.Text) = '' then begin
    Result := False;
    Exit;
  end;
  if StrToFloatDef(edtInPrice.Text,0.0) < 0.01 then begin
    Result := False;
    Exit;
  end;
  if StrToFloatDef(edtQtyInStock.Text,0.0) < 0.01 then begin
    Result := False;
    Exit;
  end;
  if Trim(edtGoodsName.Text) = '' then begin
    Result := False;
    Exit;
  end;
  if Trim(edtUnit.Text) = '' then begin
    Result := False;
    Exit;
  end;
  if StrToFloatDef(edtPrice.Text,0.0) < 0.01 then begin
    Result := False;
    Exit;
  end;
  if Trim(edtSafeStock.Text) = '' then begin
    Result := False;
    Exit;
  end;
  if StrToFloatDef(edtQtyBuyMin.Text,0.0) < 0.01 then begin
    Result := False;
    Exit;
  end;
end;

procedure TfrmInStock.edtGoodsCodeExit(Sender: TObject);
var
  sGoodsCode: string;
begin
  sGoodsCode := Trim(edtGoodsCode.Text);
  //  调用存储过程,得到商品的名称、单位和单价
  uspTmp.Parameters.Clear;
  uspTmp.ProcedureName := 'usp_GetGoodsInfo';
  uspTmp.Parameters.CreateParameter('GoodsCode',ftString,pdInput,10,sGoodsCode);
  uspTmp.Parameters.CreateParameter('GoodsName',ftString,pdOutput,20,'');
  uspTmp.Parameters.CreateParameter('Find',ftSmallInt,pdOutput,0,0);
  uspTmp.Parameters.CreateParameter('Unit',ftString,pdOutput,20,'');
  uspTmp.Parameters.CreateParameter('Price',ftCurrency,pdOutput,0,0);
  uspTmp.Parameters.CreateParameter('SafeStock',ftCurrency,pdOutput,0,0);
  uspTmp.Parameters.CreateParameter('QtyBuyMin',ftCurrency,pdOutput,0,0);
  uspTmp.ExecProc;

  if uspTmp.Parameters.ParamByName('Find').Value = 1 then begin
    edtGoodsName.Text := uspTmp.Parameters.ParamByName('GoodsName').Value;
    edtUnit.Text := uspTmp.Parameters.ParamByName('Unit').Value;
    edtPrice.Text := uspTmp.Parameters.ParamByName('Price').Value;
    edtSafeStock.Text := uspTmp.Parameters.ParamByName('SafeStock').Value;
    edtQtyBuyMin.Text := uspTmp.Parameters.ParamByName('QtyBuyMin').Value;
  end;
end;

procedure TfrmInStock.btnOKClick(Sender: TObject);
begin
  if CheckAllRecords then
    SaveAllRecords;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -