📄 uorderdetail.pas
字号:
unit uOrderDetail;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, uBaseDetail, dxExEdtr, DB, DBClient, ActnList, ImgList,
dxCntner, dxTL, dxDBCtrl, dxDBGrid, ExtCtrls, ComCtrls, ToolWin,
dxEditor, dxDBEdtr, dxDBELib, ccLabeledDBLookupEdit, dxEdLib,
ccLabeledDBDateEdit, ccLabeledDBEdit, ccLabeledDBCombobox,
ccLabeledDBMemo, Menus, Grids, DBGrids, DBCtrls, dxDBTLCl, dxGrClms;
type
TOrderDetail = class(TBaseDetail)
ToolButton1: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ToolButton7: TToolButton;
ToolButton8: TToolButton;
ToolButton9: TToolButton;
cclabeledDBLookupEdit1: TcclabeledDBLookupEdit;
cclabeledDBDateEdit1: TcclabeledDBDateEdit;
cclabeledDBEdit3: TcclabeledDBEdit;
cclabeledDBEdit1: TcclabeledDBEdit;
cclabeledDBCombobox1: TcclabeledDBCombobox;
cclabeledDBMemo1: TcclabeledDBMemo;
cclabeledDBEdit2: TcclabeledDBEdit;
cclabeledDBEdit4: TcclabeledDBEdit;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure cclabeledDBLookupEdit1CloseUp(Sender: TObject;
var Value: Variant; var Accept: Boolean);
private
{ Private declarations }
protected
function CheckDataBeforeSave:Boolean;override;
procedure SaveMasterDetailData(const pMasterData, pDetailData:OleVariant); override;
procedure GetMasterDetailData(var pMasterData, pDetailData:OleVariant); override;
procedure SetFieldsInfo; override;
procedure AddItem; override;
procedure ImpRecords(pSrcData: OleVariant; pDesDataSet: TClientDataSet); virtual;
procedure SetMasterFieldsDefaultValue; override;
procedure SetDetailFieldsDefaultValue; override;
procedure OnPriceSetText(Sender: TField; const Text: String);
procedure OnQtySetText(Sender: TField; const Text: String);
procedure OnRateSetText(Sender: TField; const Text: String);
procedure CalcItemAmt;
public
{ Public declarations }
end;
var
OrderDetail: TOrderDetail;
implementation
uses uDM, uGlobal, uMultiSelect;
{$R *.dfm}
{ TOrderDetail }
procedure TOrderDetail.AddItem;
begin
MultiSelect := TMultiSelect.Create(nil);
try
MultiSelect.TableName :=CS_View_Employee;
if MultiSelect.ShowModal = mrOk then
if MultiSelect.SelectedCount >0 then
ImpRecords(MultiSelect.SelectedRecords, cdsItem);
finally
FreeAndNil(MultiSelect);
end;
end;
procedure TOrderDetail.GetMasterDetailData(var pMasterData,
pDetailData: OleVariant);
begin
DM.GetMasterDatailData(CS_Table_PayMaster, CS_Table_PayDetail, KeyFieldValue,
pMasterData, pDetailData);
end;
procedure TOrderDetail.SaveMasterDetailData(const pMasterData, pDetailData:OleVariant);
begin
if not IsDataChanged then exit;
//DM.SaveMasterDatailData(CS_Table_PayMaster, CS_Table_PayDetail, pMasterData , pDetailData );
DM.SaveMasterDatailData(CS_Table_PayMaster, CS_Table_PayDetail, pMasterData , pDetailData, FKeyFieldValue, GetOrderID, GetOrderDate );
end;
procedure TOrderDetail.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
inherited;
CanClose:= SaveChangedData ;
end;
function TOrderDetail.CheckDataBeforeSave: Boolean;
begin
Result:=inherited CheckDataBeforeSave;
if not Result then Exit;
Result:=False;
if not CheckCanNotEmptyField(cdsMast, '单据类型主键') then Exit;
if not CheckCanNotEmptyField(cdsMast, '单据日期') then Exit;
if not CheckCanNotEmptyField(cdsMast, '单价') then Exit;
if not CheckCanNotEmptyField(cdsMast, '数量') then Exit;
if not CheckCanNotEmptyField(cdsMast, '单位') then Exit;
if cdsItem.RecordCount =0 then
begin
Application.MessageBox(pchar('明细中至少要有一名员工!'), pchar(Application.Title ), MB_OK + MB_ICONERROR );
Exit;
end;
Result:=True;
end;
procedure TOrderDetail.ImpRecords(pSrcData: OleVariant;
pDesDataSet: TClientDataSet);
var
i: integer;
cdsTmp: TClientDataset;
sField: string;
begin
cdsTmp := TClientDataset.Create(nil);
pDesDataSet.DisableControls;
pDesDataSet.FindField(CS_RateFieldName).OnSetText :=nil;
try
cdsTmp.Data := pSrcData;
cdsTmp.First;
while not cdsTmp.Eof do
begin
if not pDesDataSet.Locate(CS_EmpIDFieldName, cdsTmp.FieldByName(CS_KeyFieldName).AsString, []) then
begin
pDesDataSet.Append;
for i := 0 to cdsTmp.FieldCount - 1 do
begin
sField := cdsTmp.Fields[i].FieldName;
if (sField=CS_KeyFieldName) then
begin
SetFieldValue(pDesDataSet, CS_EmpIDFieldName,
cdsTmp.FieldByName(sField).AsString);
end else
if (pDesDataSet.FindField(sField) <> nil) then
{设置字段值}
begin
SetFieldValue(pDesDataSet, sField,
cdsTmp.FieldByName(sField).AsString);
end;
end;
pDesDataSet.Post;
SetDetailFieldsDefaultValue;
end;
cdsTmp.Next;
end;
CalcItemAmt;
finally
pDesDataSet.EnableControls;
pDesDataSet.FindField(CS_RateFieldName).OnSetText := OnRateSetText;
SetCellAutoWidth(Cell);
FreeAndNil(cdsTmp);
end;
end;
procedure TOrderDetail.cclabeledDBLookupEdit1CloseUp(Sender: TObject;
var Value: Variant; var Accept: Boolean);
begin
inherited;
{ if Accept then
with cdsMast do
if FindField ('单据类型主键')<>nil then
begin
Edit;
FindField ('单据类型主键').AsString :=DM.dsOrderType.DataSet.FieldByName('主键').AsString ;
end; }
end;
procedure TOrderDetail.OnPriceSetText(Sender: TField; const Text: String);
var
sText: string;
pQty, pPrice:Double;
begin
sText := Text;
if Trim(Text) = '' then sText := '0';
Sender.AsFloat := FormatFloat_Ex(StrToFloat(sText), CI_Default_FloatRoundRange);
pPrice:=Sender.AsFloat;
pQty:=Sender.DataSet.FieldByName(CS_QtyFieldName).AsFloat ;
Sender.DataSet.FieldByName(CS_AmtFieldName).AsFloat:=
FormatFloat_Ex(pPrice * pQty, CI_Default_FloatRoundRange);
CalcItemAmt;
end;
procedure TOrderDetail.OnQtySetText(Sender: TField; const Text: String);
var
sText: string;
pQty, pPrice:Double;
begin
sText := Text;
if Trim(Text) = '' then sText := '0';
Sender.AsFloat := FormatFloat_Ex(StrToFloat(sText), CI_Default_FloatRoundRange);
pQty:=Sender.AsFloat;
pPrice:=Sender.DataSet.FieldByName(CS_PriceFieldName).AsFloat ;
Sender.DataSet.FieldByName(CS_AmtFieldName).AsFloat:=
FormatFloat_Ex(pPrice * pQty, CI_Default_FloatRoundRange);
CalcItemAmt;
end;
procedure TOrderDetail.OnRateSetText(Sender: TField; const Text: String);
var
sText: string;
begin
sText := Text;
if Trim(Text) = '' then sText := '0';
Sender.AsFloat := FormatFloat_Ex(StrToFloat(sText), CI_Default_FloatRoundRange);
CalcItemAmt;
end;
procedure TOrderDetail.SetFieldsInfo;
begin
inherited;
if CheckDataSet(cdsMast) then
begin
if cdsMast.FindField(CS_PriceFieldName)<>nil then
cdsMast.FindField(CS_PriceFieldName).OnSetText := OnPriceSetText;
if cdsMast.FindField(CS_QtyFieldName)<>nil then
cdsMast.FindField(CS_QtyFieldName).OnSetText := OnQtySetText;
end;
if CheckDataSet(cdsItem) then
begin
if cdsItem.FindField(CS_RateFieldName)<>nil then
cdsItem.FindField(CS_RateFieldName).OnSetText := OnRateSetText;
end;
end;
procedure TOrderDetail.SetDetailFieldsDefaultValue;
begin
inherited;
if CheckDataSet(cdsItem) then
begin
SetFieldValue(cdsItem, CS_RateFieldName,'1');
end;
end;
procedure TOrderDetail.SetMasterFieldsDefaultValue;
begin
inherited;
if CheckDataSet(cdsMast) then
begin
if cdsMast.FindField(CS_PriceFieldName)<>nil then
cdsMast.FieldByName(CS_PriceFieldName).AsFloat := CI_Default_FloatValue;
if cdsMast.FindField(CS_QtyFieldName)<>nil then
cdsMast.FieldByName(CS_QtyFieldName).AsFloat := CI_Default_FloatValue;
if cdsMast.FindField(CS_OrderDateFieldName)<>nil then
cdsMast.FieldByName(CS_OrderDateFieldName).AsDateTime := Date;
end;
end;
procedure TOrderDetail.CalcItemAmt;
var
pAmt, pRate, pRateSum, pItemAmt:Double;
begin
if CheckDataSet(cdsMast) then
pAmt:= cdsMast.FieldByName(CS_AmtFieldName).AsFloat
else
pAmt:=CI_Default_FloatValue;
if CheckDataSet(cdsItem) then
begin
pRateSum:=GetFieldSumValue(cdsItem, CS_RateFieldName);
with cdsItem do
begin
First;
while not Eof do
begin
pRate:= FieldByName(CS_RateFieldName).AsFloat ;
if (pRate=0) or (pRateSum=0) or (pAmt=0) then
pItemAmt:=CI_Default_FloatValue
else
pItemAmt:= (pRate / pRateSum) * pAmt ;
Edit;
FieldByName(CS_ItemAmtFieldName).AsFloat := FormatFloat_Ex(pItemAmt, CI_Default_FloatRoundRange);
Post;
Next;
end;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -