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

📄 ap_enter_purchasepayment.pas

📁 一个MRPII系统源代码版本
💻 PAS
📖 第 1 页 / 共 4 页
字号:
unit Ap_Enter_PurchasePayment;

Interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Base_Entry_Body, ExtPrintReport, Db, ActnList, AdODB, Grids, DBGridEh,
  StdCtrls, ExtCtrls, ComCtrls, ToolWin, jpeg, linkedit;

Type
  TFrm_Ap_Enter_PurchasePayment = Class(TFrm_Base_Entry_Body)
    Label1: TLabel;
    Edt_PayBillNo: TEdit;
    LEdt_VendorCode: TLinkEdit;
    Label2: TLabel;
    Label3: TLabel;
    Edt_RemArkNo: TEdit;
    Label4: TLabel;
    Edt_PayDate: TEdit;
    Label5: TLabel;
    Edt_PayInputdate: TEdit;
    Label6: TLabel;
    Edt_PayModeName: TEdit;
    Label7: TLabel;
    Edt_CurrencyName: TEdit;
    LEdt_CurrencyCode: TLinkEdit;
    Label8: TLabel;
    Edt_ExchRate: TEdit;
    Label9: TLabel;
    Edt_PayAmount: TEdit;
    Label10: TLabel;
    Edt_PayRemArk: TEdit;
    Edt_VendorName: TEdit;
    LEdt_PayModeCode: TLinkEdit;
    Label11: TLabel;
    Edt_Total: TEdit;
    Label12: TLabel;
    Edt_NoPayedAmount: TEdit;
    procedure LEdt_VendorCodeButtonClick(Sender: TObject);
    procedure LEdt_VendorCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure LEdt_VendorCodeExit(Sender: TObject);
    procedure LEdt_CurrencyCodeButtonClick(Sender: TObject);
    procedure LEdt_CurrencyCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure LEdt_CurrencyCodeExit(Sender: TObject);
    procedure Edt_PayDateExit(Sender: TObject);
    procedure Edt_PayInputdateExit(Sender: TObject);
    procedure Edt_PayAmountExit(Sender: TObject);
    procedure LEdt_PayModeCodeButtonClick(Sender: TObject);
    procedure LEdt_PayModeCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure LEdt_PayModeCodeExit(Sender: TObject);
    procedure Edt_ExchRateKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure AdoQry_BodyApPayFlagChange(Sender: TField);
    procedure FormDestroy(Sender: TObject);
    procedure DBGridEhColExit(Sender: TObject);
    procedure DBGridEhExit(Sender: TObject);
    procedure AdoQry_BodyBeforeInsert(DataSet: TDataSet);
    procedure DBGridEhEnter(Sender: TObject);
    procedure Edt_PayAmountChange(Sender: TObject);
    procedure AdoQry_BodyAfterEdit(DataSet: TDataSet);
    procedure AdoQry_Bodyflag1Change(Sender: TField);
    procedure AdoQry_BodyBeforeEdit(DataSet: TDataSet);
    procedure Act_PreviewExecute(Sender: TObject);
    procedure Act_PrintExecute(Sender: TObject);
    procedure Act_ExcelExecute(Sender: TObject);
    procedure DBGridEhMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure DBGridEhColEnter(Sender: TObject);
    procedure DBGridEhCellClick(Column: TColumnEh);
  private
    { Private declarations }
    brect,Arect:Trect;
    tmpvar:integer;
    dataChange:boolean;                                   //True run   procedure: previewPay;
    flag:integer;
    curdate:string;
    userName:string;
    PayMode:integer;                                       //<>2:余额承前核销法; =2逐票核销法
    prePay:double;                                         //预付款金额;
    PayBillid:string;
    procedure GetExchRate;
    Function IsMasterCurrency(Currency:string):boolean;    //是否本位币 1:为本位币 0:为非本位币;
    procedure SaveCheck;                                   //存盘前检查;
    procedure previewPay;                                  //模拟付款:测试付款金额是否等于选定核销发票额;
    Function TotalPay:double;                                //Dbgrideh中已选定的发票金额:
    Function GetApPayAmount(PayJournalId:string):double;   //获取付款匹配总金额
    procedure SaveBodydataForPayMode2;                     //用逐票核销法
    procedure SaveBodydataForPayMode1;                     //用余额承前核销法;
    procedure MatchPay               ;                     //增加一张付款记录时发票匹配过程函数
    procedure MatchPay_negative;                           //增加一张红冲付款记录时发票匹配过程函数
    procedure BackupLog(Action_flag:string);               //插入日志文件;
  public
    { Public declarations }
    procedure InitControls;Override;
    procedure SaveHeadData;Override;
    procedure SaveData; Override;//把表头控件写入缓存,不要Post
  end;

var
  Frm_Ap_Enter_PurchasePayment: TFrm_Ap_Enter_PurchasePayment;

implementation

uses Sys_Global;

{$R *.DFM}

procedure TFrm_Ap_Enter_PurchasePayment.InitControls;
var
  sqltext:string;
begin
  flag:=0;
  inherited;

  SetFocus_Control:=Edt_PayBillNo;
  //取服务器的日期;
  Executesql(AdoQry_tmp,'select convert (varchAr(10),getdate(),102) as a ',0);
  curdate:=AdoQry_tmp.fieldbyname('a').asstring;
  Executesql(AdoQry_tmp,'select EmployeeName from Employee where EmployeeCode='''+userCode+'''',0);
  userName:=AdoQry_tmp.fieldbyname('EmployeeName').asstring;
  Act_InsertLine.Enabled :=False;
  Act_InsertLine.Visible :=False;
  Act_Modify.Enabled :=False;
  Act_Modify.Visible :=False;
  Act_DeleteLine.Enabled:=False;
  Act_DeleteLine.Visible:=False;
  if status='Add' then
  begin
    {LEdt_CurrencyCodeExit(Sender: TObject);
    Edt_PayDateExit(Sender: TObject);
    edt_PayInputdateExit(Sender: TObject);
    Edt_PayAmountExit(Sender: TObject);}
    LEdt_VendorCode.text:='';
    Edt_VendorName.text:='';
    Edt_PayBillNo.text:='';
    LEdt_CurrencyCode.text:='';
    edt_CurrencyName.text:='';
    Edt_ExchRate.text:='';
    Edt_PayAmount.text:='';
    lEdt_PayModeCode.text:='';
    Edt_PayModeName.text:='';
    Edt_RemArkNo.text:='';
    Edt_PayRemArk.text:='';
    Edt_PayDate.text:=curdate;
    Edt_PayInputdate.text:=curdate;
    Edt_Total.text:='';
    Edt_NoPayedAmount.text:='0';
    AdoQry_Body.Close;
    Edt_PayBillNo.SetFocus ;
    dataChange:=False;
  end
  else
  begin
    with AdoQry_Head do
    begin
      LEdt_VendorCode.text:=fieldbyname('VendorCode').asstring;
      Edt_VendorName.text:=fieldbyname('VendorName').asstring;
      Edt_PayBillNo.text:=fieldbyname('PayBillNo').asstring;
      LEdt_CurrencyCode.text:=fieldbyname('CurrencyCode').asstring;
      edt_CurrencyName.text:=fieldbyname('CurrencyName').asstring;
      Edt_ExchRate.text:=fieldbyname('ExchRate').asstring;
      Edt_PayAmount.text:=fieldbyname('PayAmount').asstring;
      Edt_Total.text:=fieldbyname('PayAmount').asstring;
      Edt_Total.enabled:=False;
      lEdt_PayModeCode.text:=fieldbyname('PayModeCode').asstring;
      Edt_PayModeName.text:=fieldbyname('PayModeName').asstring;
      Edt_RemArkNo.text:=fieldbyname('RemArkNo').asstring;
      Edt_PayDate.text:=fieldbyname('PayDate').asstring;
      Edt_PayInputdate.text:=fieldbyname('PayInputdate').asstring;
      Edt_PayRemArk.text:=fieldbyname('PayRemArk').asstring;
      Executesql(AdoQry_tmp,'select PayJournalId from PayJournal  where PayBillno='''+AdoQry_Head.fieldbyname('PayBillno').asstring+'''',0);
      PayBillid:=AdoQry_tmp.fieldbyname('PayJournalId').asstring;
      Edt_NoPayedAmount.text:=floattostr(fieldbyname('PayAmount').asfloat-GetApPayAmount(PayBillid));
    end;
    if status='ReadOnly' then
    begin
      Sqltext:=' select ApInvoice.ApInvoiceId,ApInvoiceNo,ApInvoiceDate,ApInvoiceAmount , '+
                       ' ApInvoiceTax,ApInvoiceAmount-ApInvoiceTax as ApInvoiceNoTaxAmount,'+
                       ' ApInvoiceAmount-ApPayedAmount  as NoApPayAmount,'+
                       ' PayJournalline.PayedAmount as ThisApPayAmount,1 as flag1 '+
               ' from ApInvoice left join PayJournalline '+
                       ' on ApInvoice.ApInvoiceId=PayJournalline.ApInvoiceId '+
               ' where  PayJournalline.PayJournalId='+PayBillid +
               ' Order by ApInvoiceDate ';
      dbgrideh.Columns[6].ReadOnly :=True;
    end;
    if Status='AllEdit' then
    begin
      sqltext:=' create table #ApInvoice (ApInvoiceId integer not null, '+
                                         'ApInvoiceNo varchAr(20),'+
                                         'ApInvoiceDate datetime null,'+
                                         'ApInvoiceAmount decimal (12, 2) NOT NULL ,'+
                                         'ApInvoiceTax decimal (10, 2) NOT NULL ,'+
                                         'ApInvoiceNoTaxAmount decimal (12, 2) NOT NULL ,'+
                                         'NoApPayAmount decimal (12, 2) NOT NULL ,'+
                                         'ThisApPayAmount decimal (12, 2) default 0.00 ,'+
                                         'flag1 int default 0 ) '+
                ' insert into  #ApInvoice '+
                ' select ApInvoiceId,ApInvoiceNo,ApInvoiceDate,ApInvoiceAmount,'+
                       ' ApInvoiceTax,ApInvoiceAmount-ApInvoiceTax as ApInvoiceNoTaxAmount,'+
                       ' ApInvoiceAmount-ApPayedAmount  as NoApPayAmount,0 as ThisApPayAmount,'+
                       ' 1 as flag1 '+
                       //' 0.00 as ThisApPayAmount '+
                //' into  #ApInvoice '+
                ' from ApInvoice '+

               ' where  VendorCode='''+Trim(LEdt_VendorCode.text)+''''+
               ' and ApInvoiceAmount-ApPayedAmount<>0 '+
                //' and ApPayFlag<>0 '+
               ' Order by ApInvoiceDate '+
               ' select  * from #ApInvoice'  ;
               SetFocus_Control:=DBGridEh;
               Act_Save.Enabled :=True;
    end;
    if Status='AllEdit' then
    begin
      try
        Executesql(AdoQry_tmp,'drop table #ApInvoice',1)
      except
      end;
      dbgrideh.ReadOnly :=False;
      dbgrideh.Columns[6].ReadOnly :=False;
    end;
    Executesql(AdoQry_Body,sqltext,0 );
  end;
  Edt_PayModeName.Enabled :=False;
  Edt_VendorName.Enabled :=False;
  Edt_CurrencyName.Enabled :=False;
  flag:=1;
  if Status='AllEdit' then
    Act_Save.Enabled :=True;
  Edt_NoPayedAmount.enabled:=False;
  if status='ReadOnly' then
    dbgrideh.Columns[7].Visible :=False;
end;


procedure TFrm_Ap_Enter_PurchasePayment.SaveData;
var
  Amount:double;    //获取付款匹配总金额
begin
  dataChange:=False;
  inherited;
  //if status='Add' then
  SaveCheck;     //存盘前检查;
  dataChange:=True;
  if AdoQry_Body.state<>dsBrowse then
    AdoQry_Body.post;
  //previewPay;  //模拟付款:测试付款金额是否等于选定核销发票额;
  Amount:=0.0;
  dbconnect.beginTrans ;
  try
    if status='Add' then
    begin
       with AdoQry_tmp do
       begin
         Close;
         sql.clear;
         SQL.Add('insert into PayJournal '+
                '  (PayBillNo,'+
                '   RemArkNo,'+
                '   PayDate,'+
                '   VendorCode,'+
                '   CurrencyCode,'+
                '   EmployeeCode,'+
                '   PayInputDate,'+
                '   PayModeCode,'+
                '   ExchRate,' +
                '   PayAmountC,'+
                '   PayAmount,'+
                '   CreateDate,'+
                '   PayremArk) '+
                'Values '+
                '  ('''+edt_PayBillno.Text+''','+
                '   '''+edt_RemArkNo.Text+''','+
                '   '''+edt_Paydate.Text+''','+
                '   '''+LEdt_VendorCode.Text+''','+
                '   '''+LEdt_CurrencyCode.text+''','+
                '   '''+userCode+''','+
                '   '''+Edt_PayInputdate.Text+''','+
                '   '''+(ledt_PayModeCode.Text)+''','+
                '   '+edt_ExchRate.text+','+
                '   '+floattostr(strtofloat(Edt_ExchRate.text)* strtofloat(edt_PayAmount.Text))+','+
                '   '+edt_PayAmount.Text+','+
                '   '''+curdate+''','+
                '   '''+edt_PayremArk.Text+''')');
        execSQL;
       // Pay_Backup('A');
      end ;
      Executesql(AdoQry_tmp,'select  @@IDENTITY as id ',0);
      PayBillid:=AdoQry_tmp.fieldbyname('id').asstring;
      BackupLog('A');               //插入日志文件;
      AdoQry_Body.DisableControls ;
      try
        if PayMode=2 then
          SaveBodydataForPayMode2                      //用逐票核销法
        else
          SaveBodydataForPayMode1;                     //用余额承前核销法;
      finally
        AdoQry_Body.EnableControls ;
      end;
      //Amount:= TotalPay;
     Edt_NoPayedAmount.text:=formatfloat('0.##',strtofloat(Edt_PayAmount.text)-TotalPay);
   end;
   if Status='AllEdit' then
   begin
     BackupLog('M');                                  //插入日志文件;
     AdoQry_Body.DisableControls ;
     try
       if PayMode=2 then
         SaveBodydataForPayMode2                       //用逐票核销法
       else
         SaveBodydataForPayMode1;                      //用余额承前核销法;
     finally
       AdoQry_Body.EnableControls ;
     end;
     Edt_NoPayedAmount.text:=formatfloat('0.##',strtofloat(Edt_NoPayedAmount.text)-TotalPay);

   end;
  { with AdoQry_Head do
   begin
     edit;
     fieldbyname('PayJournalID').asstring:=PayBillid;
     post;
   end;}
   dbconnect.CommitTrans ;
 except
   dbconnect.RollBackTrans ;
   abort;
 end;
end;

procedure TFrm_Ap_Enter_PurchasePayment.SaveHeadData;
begin
  inherited;
  with AdoQry_Head do
  begin
    fieldbyname('VendorCode').asstring:=LEdt_VendorCode.text;
    fieldbyname('VendorName').asstring:=Edt_VendorName.text;
    fieldbyname('PayBillNo').asstring:=Edt_PayBillNo.text;
    fieldbyname('CurrencyCode').asstring:=LEdt_CurrencyCode.text;
    fieldbyname('CurrencyName').asstring:=edt_CurrencyName.text;
    fieldbyname('ExchRate').asstring:=Edt_ExchRate.text;
    fieldbyname('PayAmount').asstring:=Edt_PayAmount.text;
    fieldbyname('PayModeCode').asstring:=lEdt_PayModeCode.text;
    fieldbyname('PayModeName').asstring:=Edt_PayModeName.text;
    fieldbyname('RemArkNo').asstring:=Edt_RemArkNo.text;
    fieldbyname('PayDate').asstring:=Edt_PayDate.text;
    fieldbyname('PayInputdate').asstring:=Edt_PayInputdate.text;
    fieldbyname('PayRemArk').asstring:=Edt_PayRemArk.text;
    fieldbyname('CreateDate').asstring:= CurDate;
    fieldbyname('EmployeeCode').asstring:=userCode;
    fieldbyname('EmployeeName').asstring:=userName;
   
  end;
end;

procedure TFrm_Ap_Enter_PurchasePayment.LEdt_VendorCodeButtonClick(

⌨️ 快捷键说明

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