?? untcustorder.~pas
字號:
unit untCustOrder;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, ADODB, StdCtrls, ExtCtrls, Grids, DBGrids, Buttons;
type
TfrmCustOrder = class(TForm)
qryOrderItemGrd: TADOQuery;
uspTmp: TADOStoredProc;
souOrderItemGrd: TDataSource;
gupCustInfo: TGroupBox;
Bevel1: TBevel;
Bevel2: TBevel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
edtOrderID: TEdit;
edtCustID: TEdit;
edtCustName: TEdit;
edtTel: TEdit;
edtZip: TEdit;
edtAddress: TEdit;
rdoSexMale: TRadioButton;
rdoSexFemale: TRadioButton;
gupOrderItem: TGroupBox;
grdOrderItem: TDBGrid;
btnAdd: TButton;
btnDel: TButton;
btnOK: TBitBtn;
btnCancel: TBitBtn;
edtCode: TEdit;
procedure edtCustIDCodeExit(Sender: TObject);
procedure grdOrderItemColExit(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure btnDelClick(Sender: TObject);
procedure edtChange(Sender: TObject);
private
IsOldCustomer:Boolean;
function CheckAllRecords: Boolean;
function SaveAllRecords: Boolean;
{ Private declarations }
public
function Execute:Boolean;
{ Public declarations }
end;
var
frmCustOrder: TfrmCustOrder;
implementation
uses untGoodsOrderDat;
function TfrmCustOrder.Execute:Boolean;
const
cSqlOrderItem='SELECT A.GoodsCode,A.GoodsName,A.Unit,A.Price,A.Price,B.Quantity FROM Goods A,OrderItem B WHERE 1=0';
var
sOrderID: string;
begin
//設置數據庫組件屬性,設置數據表以批方式存取
qryOrderItemGrd.SQL.Text:=cSqlOrderItem;
qryOrderItemGrd.LockType:=ltBatchOptimistic;
qryOrderItemGrd.CursorType:=ctKeyset;
qryOrderItemGrd.Open;
//調用存儲過程,得到新訂單號
uspTmp.Parameters.Clear;
uspTmp.ProcedureName:='usp_GetNewOrderID';
uspTmp.Parameters.CreateParameter('DataStr',ftString,pdInput, 8, FormatDateTime('YYYYMMDD',Now));
uspTmp.Parameters.CreateParameter('OrderID',ftString,pdOutput,11,'');
uspTmp.ExecProc;
sOrderID:=uspTmp.Parameters.ParamByName('OrderID').Value;
//初始化窗體顯示的內容
edtOrderID.Text:=sOrderID;
edtCustID.Text:='';
edtCode.Text:='';
edtCustName.Text:='';
edtTel.Text:='';
edtZip.Text:='';
edtAddress.Text:='';
rdoSexMale.Checked:=True;
rdoSexFemale.Checked:=False;
//顯示窗體,并返回函數結果
Result:=ShowModal=mrOK;
end;
function TfrmCustOrder.CheckAllRecords:Boolean;
begin
Result:=True;
if Trim(edtCode.Text) =''then begin
Result:=False;
Exit;
end;
if Trim(edtCustName.Text) =''then begin
Result:=False;
Exit;
end;
if Trim(edtTel.Text)=''then begin
Result := False;
Exit;
end;
if Trim(edtZip.Text)=''then begin
Result:=False;
Exit;
end;
if Trim(edtAddress.Text)=''then begin
Result:=False;
Exit;
end;
end;
function TfrmCustOrder.SaveAllRecords: Boolean;
var
dAmount, dPrice, dQuantity: Currency;
begin
Result:=False;
with datGoodsOrder do begin
//開始事務提交
conGoodsOrder.BeginTrans;
try
//打開顧客表
if IsOldCustomer then
qryCustomer.SQL.Text:='SELECT * FROM Customer WHERE CustID=''' + Trim(edtCustID.Text) + ''''
else
qryCustomer.SQL.Text:='SELECT * FROM Customer WHERE 1=0';
qryCustomer.LockType := ltBatchOptimistic;
qryCustomer.CursorType := ctKeyset;
qryCustomer.open;
//打開訂單表
qryCustomer.SQL.Text := 'SELECT * FROM Orders WHERE 1=0';
qryCustomer.LockType := ltBatchOptimistic;
qryCustomer.CursorType := ctKeyset;
qryCustomer.open;
//打開訂單明細表
qryCustomer.SQL.Text := 'SELECT * FROM OrderItem WHERE 1=0';
qryCustomer.LockType := ltBatchOptimistic;
qryCustomer.CursorType := ctKeyset;
qryCustomer.open;
//修改或增加顧客記錄
if IsOldCustomer then
qryCustomer.Edit
else begin
qryCustomer.Append;
qryCustomer.FieldByName('CustID').AsString := Trim(edtCustID.Text);
qryCustomer.FieldByName('Code').AsString := Trim(edtCode.Text);
end;
qryCustomer.FieldByName('CustName').AsString := Trim(edtCustName.Text);
qryCustomer.FieldByName('Sex').AsString := '';
if rdoSexMale.Checked then
qryCustomer.FieldByName('Sex').AsString := 'M'
else if rdoSexFemale.Checked then
qryCustomer.FieldByName('Sex').AsString := 'F';
qryCustomer.FieldByName('Tel').AsString := Trim(edtTel.Text);
qryCustomer.FieldByName('Zip').AsString := Trim(edtZip.Text);
qryCustomer.FieldByName('Address').AsString := Trim(edtAddress.Text);
qryCustomer.Post;
//增加訂單明細記錄
dAmount := 0.0;
qryOrderItemGrd.First;
while not qryOrderItemGrd.Eof do begin
dPrice := qryOrderItemGrd.FieldByName('Price').AsCurrency;
dQuantity := qryOrderItemGrd.FieldByName('Quantity').AsCurrency;
dAmount := dAmount + dPrice * dQuantity;
qryOrderItem.Append;
qryOrderItem.FieldByName('OrderID').AsString := Trim(edtOrderID.Text);
qryOrderItem.FieldByName('ItemNo').AsInteger := qryOrderItemGrd.RecNo + 1;
qryOrderItem.FieldByName('GoodsCode').AsString := qryOrderItemGrd.FieldByName('GoodsCode').AsString;
qryOrderItem.FieldByName('Quantity').AsCurrency := qryOrderItemGrd.FieldByName('Quantity').AsCurrency;
qryOrderItem.Post;
qryOrderItemGrd.Next;
end;
//增加訂單記錄
qryOrders.Append;
qryOrders.FieldByName('OrderID').AsString := Trim(edtOrderID.Text);
qryOrders.FieldByName('CustID').AsString := Trim(edtCustID.Text);
qryOrders.FieldByName('Amount').AsCurrency := dAmount;
qryOrders.Post;
//批更新數據表
qryCustomer.UpdateBatch;
qryOrders.UpdateBatch;
qryOrderItem.UpdateBatch;
//事務提交
conGoodsOrder.CommitTrans;
Result := True;
except
//回滾事務
conGoodsOrder.RollbackTrans;
MessageDlg('保存數據失敗!',mtError, [mbOK], 0);
Close;
end;
end;
end;
//如何讓多個事件響應同一個消息?
//如何修改缺省的消息響應函數名稱?
procedure TfrmCustOrder.edtCustIDCodeExit(Sender: TObject);
const
cSqlCustom = 'SELECT * FROM Customer WHERE RTRIM(CustID)=''%s'' AND RTRIM(Code)=''%s''';
var
sCustID, sCode: string;
begin
sCustID := Trim(edtCustID.Text); // Trim()是什么意思?
sCode := Trim(edtCode.Text); // 為什么要使用Trim()函數?
//下面程序段的功能是什么意思?
if (sCustID <> '') and (sCode <> '') then begin
with datGoodsOrder do begin // with ... do是什么意思?
qryCustomer.SQL.Text := Format(cSqlCustom, [sCustID, sCode]);
qryCustomer.Open;
// 如果是老顧客(為什么這樣可以判斷是老顧客?)
if not qryCustomer.IsEmpty() then begin
IsOldCustomer := True;
edtCustName.Text := qryCustomer.FieldByName('CustName').AsString;
rdoSexMale.Checked := qryCustomer.FieldByName('Sex').AsString = 'M';
rdoSexFemale.Checked := qryCustomer.FieldByName('Sex').AsString = 'F';
edtTel.Text := qryCustomer.FieldByName('Tel').AsString;
edtZip.Text := qryCustomer.FieldByName('Zip').AsString;
edtAddress.Text := qryCustomer.FieldByName('Address').AsString;
end
//否則是新顧客
else begin
IsOldCustomer := False;
ShowMessage('顧客號與身份證號不相符,該顧客是新顧客!');
// 調用存儲過程,得到新顧客號
uspTmp.Parameters.Clear;
uspTmp.ProcedureName := 'usp_GetNewCustID';
uspTmp.parameters.CreateParameter('DateStr', ftString, pdInput, 8, FormatDateTime('YYYYMMDD', now));
uspTmp.parameters.CreateParameter('CustID', ftString, pdInput, 11, '');
uspTmp.ExecProc;
sCustID := uspTmp.Parameters.ParamByName('CustID').Value;
edtCustID.Text := sCustID;
end;
end;
end;
// 如果訂單號為空,表明是新顧客
if (sCustID = '') and (sCode <> '') then begin
//調用存儲過程,得到新顧客號
uspTmp.Parameters.Clear;
uspTmp.ProcedureName := 'usp_GetNewCustID';
uspTmp.parameters.CreateParameter('DateStr', ftString, pdInput, 8, FormatDateTime('YYYYMMDD', now));
uspTmp.parameters.CreateParameter('CustID', ftString, pdoutput, 11, '');
uspTmp.ExecProc;
sCustID := uspTmp.Parameters.ParamVALUES['CustID'];
edtCustID.Text := sCustID;
end;
end;
procedure TfrmCustOrder.grdOrderItemColExit(Sender: TObject);
var
sGoodsCode: string;
begin
if grdOrderItem.SelectedIndex = 0 then begin
sGoodsCode := qryOrderItemGrd.FieldByName('GoodsCode').AsString;
// 調用存儲過程,得到商品的名稱,單位和單價
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;
//輸出當前商品代碼的商品名稱、單位和單價
qryOrderItemGrd.Edit;
// 如果返回的幾個值可能為空,數據轉換時就會錯誤,為了避免中斷程序執行,采用下面方法
if uspTmp.Parameters.ParamByName('Find').Value = 1 then begin
qryOrderItemGrd.FieldByName('GoodsName').AsString :=uspTmp.Parameters.ParamByName('GoodsName').Value;
qryOrderItemGrd.FieldByName('Unit').AsString :=uspTmp.Parameters.ParamByName('Unit').Value;
qryOrderItemGrd.FieldByName('Price').AsCurrency :=uspTmp.Parameters.ParamByName('Price').Value;
end;
qryOrderItemGrd.Post;
grdOrderItem.SelectedIndex := 4; // 是什么意思?
end;
end;
procedure TfrmCustOrder.btnOKClick(Sender: TObject);
begin
// 如果處于編輯狀態,退出編輯狀態
if qryOrderItemGrd.State = dsEdit then
qryOrderItemGrd.Post;
// 如果訂單明細不為空,才認為該訂單是有效訂單
if not qryOrderItemGrd.IsEmpty then
SaveAllRecords;
end;
{$R *.DFM}
procedure TfrmCustOrder.btnAddClick(Sender: TObject);
begin
qryOrderItemGrd.Append;
end;
procedure TfrmCustOrder.btnDelClick(Sender: TObject);
begin
qryOrderItemGrd.Delete;
end;
procedure TfrmCustOrder.edtChange(Sender: TObject);
begin
if CheckAllRecords then begin
grdOrderItem.Enabled := True;
btnAdd.Enabled := True;
btnDel.Enabled := True;
end
else begin
grdOrderItem.Enabled := False;
btnAdd.Enabled := False;
btnDel.Enabled := False;
end;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -