📄 untinstock.~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 + -