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

📄 uorderdetail.pas

📁 简单易用的按件按时计工资管理系统
💻 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 + -