📄 arinvoicesprintform.pas
字号:
unit ARInvoicesPrintForm;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, ComCtrls, DB, DBTables, Mask, DBCtrls, Dialogs, BDE, Printers, qrprntr;
type
TfrmARInvoicesPrint = class(TForm)
btnOK: TButton;
btnCancel: TButton;
qryARInv: TQuery;
lblRecordCount: TLabel;
ProgressBar1: TProgressBar;
qryARInvInvoiceNo: TStringField;
qryARInvInvoiceAmount: TCurrencyField;
tblARInvDet: TTable;
dsARInv: TDataSource;
tblARInvDetSeq: TIntegerField;
qryARInvCurrencyID: TIntegerField;
tblARInv: TTable;
tblCurrency: TTable;
tblCurrencyCurrencyID: TAutoIncField;
qryARInvARInvoiceID: TIntegerField;
qryARInvBillToID: TIntegerField;
tblARInvARInvoiceID: TIntegerField;
tblARInvDetARInvoiceID: TIntegerField;
tblARInvDetQuantity: TFloatField;
tblARInvDetItemNo: TStringField;
tblARInvDetUnitPrice: TCurrencyField;
tblARInvDetExtAmount: TCurrencyField;
tblItem: TTable;
tblItemItemNo: TStringField;
qryARInvTax1Code: TStringField;
qryARInvTax2Code: TStringField;
qryARInvTax1Rate: TFloatField;
qryARInvTax2Rate: TFloatField;
qryARInvTaxableAmount1: TCurrencyField;
qryARInvTaxableAmount2: TCurrencyField;
qryARInvTaxableAmount3: TCurrencyField;
qryARInvTaxableAmtCode1: TStringField;
qryARInvTaxableAmtCode2: TStringField;
qryARInvTaxableAmtCode3: TStringField;
tblARInvPrinted: TBooleanField;
tblCurrencyCurrencyName: TStringField;
qryARInvCurrencyName: TStringField;
tblItemItemDescription: TStringField;
tblARInvDetItemDescription: TStringField;
tblARInvDetTaxCodes: TStringField;
qryARInvTax1Description: TStringField;
qryARInvTax2Description: TStringField;
qryARInvCustomerID: TIntegerField;
qryARInvOriginalInvNo: TStringField;
qryARInvDescription: TStringField;
qryARInvInvoiceDate: TDateField;
qryARInvDiscPC: TFloatField;
qryARInvDiscDays: TSmallintField;
qryARInvNetDays: TSmallintField;
qryARInvCOD: TBooleanField;
qryARInvPurchaseOrderNo: TStringField;
qryARInvTerms: TStringField;
qryARInvBillToNo: TStringField;
qryARInvBillToName: TStringField;
qryARInvBAddressLine1: TStringField;
qryARInvBAddressLine2: TStringField;
qryARInvBCity: TStringField;
qryARInvBStateProv: TStringField;
qryARInvBZipCode: TStringField;
qryARInvBCountry: TStringField;
qryARInvCustomerNo: TStringField;
qryARInvCustomerName: TStringField;
qryARInvAddressLine1: TStringField;
qryARInvAddressLine2: TStringField;
qryARInvCity: TStringField;
qryARInvStateProv: TStringField;
qryARInvZipCode: TStringField;
qryARInvCountry: TStringField;
qryARInvTax1Amount: TCurrencyField;
qryARInvTax2Amount: TCurrencyField;
dsARInvDet: TDataSource;
qryARInvSubtotal: TCurrencyField;
qryARInvCustomerMessage: TMemoField;
qryARInvTax1ID: TIntegerField;
qryARInvTax2ID: TIntegerField;
tblARInvDetApplicableTaxCodes: TStringField;
qryARInvCityStateZip: TStringField;
qryARInvBCityStateZip: TStringField;
qryARInvTax1DescriptionRate: TStringField;
qryARInvTax2DescriptionRate: TStringField;
PrintDialog1: TPrintDialog;
tblARInvDetItemOvDesc: TStringField;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure tblARInvDetCalcFields(DataSet: TDataSet);
procedure qryARInvCalcFields(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
procedure OpenQuery;
end;
var
frmARInvoicesPrint: TfrmARInvoicesPrint;
implementation
uses BS1Form, ARInvoiceReport;
var
RecordCount: integer;
{$R *.DFM}
procedure TfrmARInvoicesPrint.OpenQuery;
begin
qryARInv.Active := true;
RecordCount := qryARInv.RecordCount;
lblRecordCount.caption := IntToStr(RecordCount) + ' invoice(s) to be printed';
end;
procedure TfrmARInvoicesPrint.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TfrmARInvoicesPrint.FormCreate(Sender: TObject);
begin
qryARInv.DatabaseName := strDatabaseName;
tblARInv.DatabaseName := strDatabaseName;
tblCurrency.DatabaseName := strDatabaseName;
tblARInvDet.DatabaseName := strDatabaseName;
tblItem.DatabaseName := strDatabaseName;
if qryARInv.SQL[6] = 'WHERE I.Printed = false' then OpenQuery; //If batch (not single): open regular batch query. Single version sets SQL[6] to point to selected invoice, then calls OpenQuery.
end;
procedure TfrmARInvoicesPrint.btnOKClick(Sender: TObject);
var
aComponent: TComponent;
x: integer;
begin
ModalResult := mrCancel; //Set to mrCancel to prevent subsequent requery in case job can't be started.
if RecordCount = 0 then exit;
aComponent := Application.FindComponent('frmARInvoice');
if Assigned (aComponent) then raise(Exception.Create('A conflicting program is running...' + #13 + 'Please close ' + '''' + 'AR Invoice' + '''' + ' form'));
PrintDialog1.options := [];
PrintDialog1.Copies := 2;
PrintDialog1.Collate := true;
if PrintDialog1.execute = false then begin ModalResult := mrNone; exit; end;
repaint;
repeat //Exclusive open to prevent locking Delphi 2 locking bug.
try
tblARInv.Active := True;
Break; //If no error, exit the loop.
except
on EDatabaseError do if MessageDlg('Unable to open Invoices table exclusively.', mtError, [mbRetry, mbCancel], 0) <> mrRetry then raise;
end;
until False;
ModalResult := mrOK;
screen.cursor := crHourglass;
tblARInvDet.Active := true;
tblCurrency.Active := true;
tblItem.Active := true;
ProgressBar1.max := qryARInv.RecordCount;
ProgressBar1.step := 1;
application.createform (TrptARInvoice,rptARInvoice);
screen.cursor := crDefault;
rptARInvoice.QuickReport.PrinterSettings.PrinterIndex := Printer.PrinterIndex; //Required for Delphi 3.
if (PrintDialog1.Collate = true) and (PrintDialog1.Copies > 1) then begin //collate multiple copies.
QRPrinter.Copies := 1;
for x := 1 to PrintDialog1.Copies do begin rptARInvoice.QuickReport.Print; repaint; end;
end else if PrintDialog1.Copies > QRPrinter.Copies then begin //Printer doesn't support multiple copies.
for x := 1 to PrintDialog1.Copies do begin rptARInvoice.QuickReport.Print; repaint; end;
end else rptARInvoice.QuickReport.print;
if copy(caption,0,7) = 'Reprint' then begin //Bypass updating if reprinting single invoice.
ModalResult := mrCancel;
tblARInv.Close;
screen.cursor := crDefault;
exit;
end;
lblRecordCount.caption := IntToStr(RecordCount) + ' invoice(s) to be updated';
try
if MessageDlg('Did invoice(s) print OK?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then ModalResult := mrCancel
else begin
lblRecordCount.caption := 'Updating invoice(s)';
qryARInv.First;
progressbar1.position := 0;
while not qryARInv.EOF do begin
with tblARInv do begin
try
Edit;
FieldValues['Printed'] := true;
Post;
except raise; end;
end;
ProgressBar1.StepIt;
qryARInv.next;
end;
end;
finally
DbiSaveChanges(tblARInv.handle);
tblARInv.Close;
screen.cursor := crDefault;
end;
end;
procedure TfrmARInvoicesPrint.tblARInvDetCalcFields(DataSet: TDataSet);
begin
tblARInvDetApplicableTaxCodes.value := '';
if (Copy(tblARInvDetTaxCodes.value,1,1) = qryARInvTax1Code.value) or (Copy(tblARInvDetTaxCodes.value,1,1) = qryARInvTax2Code.value) then tblARInvDetApplicableTaxCodes.value := tblARInvDetApplicableTaxCodes.value + Copy(tblARInvDetTaxCodes.value,1,1);
if (Copy(tblARInvDetTaxCodes.value,2,1) = qryARInvTax1Code.value) or (Copy(tblARInvDetTaxCodes.value,2,1) = qryARInvTax2Code.value) then tblARInvDetApplicableTaxCodes.value := tblARInvDetApplicableTaxCodes.value + Copy(tblARInvDetTaxCodes.value,2,1);
if (Copy(tblARInvDetTaxCodes.value,3,1) = qryARInvTax1Code.value) or (Copy(tblARInvDetTaxCodes.value,3,1) = qryARInvTax2Code.value) then tblARInvDetApplicableTaxCodes.value := tblARInvDetApplicableTaxCodes.value + Copy(tblARInvDetTaxCodes.value,3,1);
tblARInvDetExtAmount.value := frmBS1.RoundIt(tblARInvDetQuantity.value * tblARInvDetUnitPrice.value * 100)/100;
end;
procedure TfrmARInvoicesPrint.qryARInvCalcFields(DataSet: TDataSet);
begin
qryARInvCityStateZip.value := qryARInvCity.value;
if qryARInvStateProv.value <> '' then qryARInvCityStateZip.value := qryARInvCityStateZip.value + ', ' + qryARInvStateProv.value;
if qryARInvZipCode.value <> '' then qryARInvCityStateZip.value := qryARInvCityStateZip.value + ' ' + qryARInvZipCode.value;
qryARInvBCityStateZip.value := qryARInvBCity.value;
if qryARInvBStateProv.value <> '' then qryARInvBCityStateZip.value := qryARInvBCityStateZip.value + ', ' + qryARInvBStateProv.value;
if qryARInvBZipCode.value <> '' then qryARInvBCityStateZip.value := qryARInvBCityStateZip.value + ' ' + qryARInvBZipCode.value;
qryARInvTerms.AsString := 'Terms: ';
if qryARInvCOD.value = true then qryARInvTerms.AsString := qryARInvTerms.AsString + 'C.O.D.'
else begin
if qryARInvDiscPC.value >0 then
if qryARInvDiscDays.AsVariant = null then qryARInvTerms.AsString := qryARInvTerms.AsString + qryARInvDiscPC.AsString + '% ' + '0' + ' '
else qryARInvTerms.AsString := qryARInvTerms.AsString + qryARInvDiscPC.AsString + '% ' + qryARInvDiscDays.AsString + ' ';
//if qryARInvNetDays.AsVariant = null then qryARInvTerms.AsString := qryARInvTerms.AsString + 'Net 0'
if qryARInvNetDays.value = 0 then qryARInvTerms.AsString := qryARInvTerms.AsString + 'Payable on Receipt'
else qryARInvTerms.AsString := qryARInvTerms.AsString + 'Net ' + qryARInvNetDays.AsString;
end;
if qryARInvTax1Rate.value >0 then qryARInvTax1DescriptionRate.value := qryARInvTax1Description.value + ' @ ' + qryARInvTax1Rate.AsString + '%'
else qryARInvTax1DescriptionRate.value := qryARInvTax1Description.value;
if qryARInvTax2Rate.value >0 then qryARInvTax2DescriptionRate.value := qryARInvTax2Description.value + ' @ ' + qryARInvTax2Rate.AsString + '%'
else qryARInvTax2DescriptionRate.value := qryARInvTax2Description.value;
if qryARInvTax1Code.value = qryARInvTaxableAmtCode1.value then qryARInvTax1Amount.AsCurrency := frmBS1.RoundIt(qryARInvTaxableAmount1.value * qryARInvTax1Rate.value)/100
else if qryARInvTax1Code.value = qryARInvTaxableAmtCode2.value then qryARInvTax1Amount.AsCurrency := frmBS1.RoundIt(qryARInvTaxableAmount2.value * qryARInvTax1Rate.value)/100
else if qryARInvTax1Code.value = qryARInvTaxableAmtCode3.value then qryARInvTax1Amount.AsCurrency := frmBS1.RoundIt(qryARInvTaxableAmount3.value * qryARInvTax1Rate.value)/100
else qryARInvTax1Amount.AsCurrency := 0;
if qryARInvTax2Code.value = qryARInvTaxableAmtCode1.value then qryARInvTax2Amount.AsCurrency := frmBS1.RoundIt(qryARInvTaxableAmount1.value * qryARInvTax2Rate.value)/100
else if qryARInvTax2Code.value = qryARInvTaxableAmtCode2.value then qryARInvTax2Amount.AsCurrency := frmBS1.RoundIt(qryARInvTaxableAmount2.value * qryARInvTax2Rate.value)/100
else if qryARInvTax2Code.value = qryARInvTaxableAmtCode3.value then qryARInvTax2Amount.AsCurrency := frmBS1.RoundIt(qryARInvTaxableAmount3.value * qryARInvTax2Rate.value)/100
else qryARInvTax2Amount.AsCurrency := 0;
qryARInvSubtotal.AsCurrency := qryARInvInvoiceAmount.value - qryARInvTax1Amount.value - qryARInvTax2Amount.value;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -