PowerPDFとDB連携したPDF帳票を作成する
データベースは手軽に使えるMDB(Microsoft Jet4.0)形式にします。
mdbファイルのダウンロード(ZIP圧縮12Kバイト)
| テーブル名 | フィールド名 | 型 |
|---|---|---|
| T_伝票 | 伝票番号 | オートナンバー |
| 年月日 | 日付時刻型 | |
| 取引先ID | 長整数型 | |
| TM_取引先 | 取引先ID | オートナンバー型 |
| 取引先名 | 文字型(30) | |
| 取引先郵便番号 | 文字型(8) | |
| 取引先住所 | 文字型(50) | |
| TM_商品 | 商品ID | オートナンバー型 |
| 商品番号 | 文字型(20) | |
| 商品名 | 文字型(30) | |
| 標準価格 | 通貨型 | |
| T_明細 | 伝票明細ID | オートナンバー型 |
| 伝票番号 | 長整数型 | |
| 商品ID | 長整数型 | |
| 価格 | 通貨型 | |
| 数量 | 長整数型 |
今回は間単にするため、DBGoを使ってつなぎます。
select T_伝票.伝票番号, T_伝票.年月日, T_伝票.取引先ID, TM_取引先.取引先名, TM_取引先.取引先郵便番号, TM_取引先.取引先住所 from T_伝票 LEFT JOIN TM_取引先 ON T_伝票.取引先ID=TM_取引先.取引先ID
「ADO_Slip」のSQLは、以下です。また、DataSourceプロパティはDS_Slipに設定します。(マスタ関係で、パラメータ「伝票番号」でリンク)
Select
T_明細.伝票明細ID, T_明細.伝票番号, T_明細.商品ID,
TM_商品.商品番号, TM_商品.商品名, T_明細.価格, T_明細.数量,
T_明細.価格*T_明細.数量 AS 価格数量
From T_明細
Left Join TM_商品 ON T_明細.商品ID=TM_商品.商品ID
Where T_明細.伝票番号 = :伝票番号
実行画面は以下のようになります
DBとのインターフェースはDelphiの標準機能を使っているため、ソースコードをほとんど入力せず、 プロパティ設定だけなので解説は省略します。また、明細側に[伝票番号]や[伝票明細ID]の表示は不要ですが、今回はわかりやすくするため表示しています。
不要であればVisibleプロパティをFalseにしてください。
[選択している伝票をPDFに]ボタンをクリックしたときのソースコードです。
procedure TForm1.B_MakePDFClick(Sender: TObject);
var fname:string;
begin
//選択している伝票番号の帳票をPDFにして表示する
//ランダムなファイル名を作成
fname:=path+'PDF_Files\'+IntToHex(Random(1000000000),8)+'.pdf';
//ADOQueryに現在の伝票番号をフィルタに設定して開く
DataModule1.ADOQ_Slip.Filtered:=false;
DataModule1.ADOQ_Slip.Filter:=
'伝票番号=' + DataModule1.T_伝票.FieldByName('伝票番号').AsString;
DataModule1.ADOQ_Slip.Filtered:=true;
DataModule1.ADOQ_Slip.Open;
DataModule1.ADOQ_Slip_Detail.Open;
DataModule1.ADOQ_Slip_Detail.First;
//TPRGridPanelのBefoerePrintChildを設定
F_RPT.PRGridPanel1.BeforePrintChild:=MyPRPrintChildPanel;
F_RPT.PReport1.FileName:=fname;
//「しおり」や「ページ」を表示しないようにする
F_RPT.PReport1.PageMode:=pmUseNone;
//PDF作成開始
F_RPT.PReport1.BeginDoc;
//伝票番号の設定
F_RPT.PRL_No.Caption:=
'伝票番号:'+DataModule1.ADOQ_Slip.FieldByName('伝票番号').AsString;
//取引先名の設定
F_RPT.PRL_Comp_Nm.Caption:=
DataModule1.ADOQ_Slip.FieldByName('取引先名').AsString;
//取引先郵便番号と住所の設定
F_RPT.PRL_Comp_Add.Caption:=
'〒'+DataModule1.ADOQ_Slip.FieldByName('取引先郵便番号').AsString+
' '+DataModule1.ADOQ_Slip.FieldByName('取引先住所').AsString;
//年月日の設定
F_RPT.PRL_date.Caption:=
DataModule1.ADOQ_Slip.FieldByName('年月日').AsString;
//伝票番号に対する伝票明細を設定
while not DataModule1.ADOQ_Slip_Detail.Eof do
begin
F_RPT.PRL_Page.Caption:=IntToStr(F_RPT.PReport1.PageNumber+1);
F_RPT.PReport1.Print(F_RPT.PRPage1);
end;
//PDF作成完了
F_RPT.PReport1.EndDoc;
F_RPT.PRGridPanel1.AfterPrintChild:=nil;
DataModule1.ADOQ_Slip.Close;
DataModule1.ADOQ_Slip_Detail.Close;
//PDFファイルを表示(PDFビューアーが必要)
ShellExecute(handle,'open',PChar(fname),nil,nil,SW_SHOW);
end;
procedure TForm1.MyPRPrintChildPanel(Sender: TObject; ACanvas: TPRCanvas; ACol,
ARow: integer; Rect: TRect);
begin
//伝票明細をTPRGridPanelに出力する
if not DataModule1.ADOQ_Slip_Detail.Eof then
begin
F_RPT.PRL_ItemNo.Caption:=
DataModule1.ADOQ_Slip_Detail.FieldByName('商品番号').AsString;
F_RPT.PRL_ItemName.Caption:=
DataModule1.ADOQ_Slip_Detail.FieldByName('商品名').AsString;
F_RPT.PRL_ItemPrice.Caption:=
DataModule1.ADOQ_Slip_Detail.FieldByName('価格').AsString;
F_RPT.PRL_ItemCount.Caption:=
DataModule1.ADOQ_Slip_Detail.FieldByName('数量').AsString;
F_RPT.PRL_Price.Caption:=
DataModule1.ADOQ_Slip_Detail.FieldByName('価格数量').AsString;
DataModule1.ADOQ_Slip_Detail.Next;
end
else
begin
F_RPT.PRL_ItemNo.Caption:='';
F_RPT.PRL_ItemName.Caption:='';
F_RPT.PRL_ItemPrice.Caption:='';
F_RPT.PRL_ItemCount.Caption:='';
F_RPT.PRL_Price.Caption:='';
end;
end;
ソースのほとんどは、データベースからの文字をPDFに入れているだけです。[全伝票をPDFに]ボタンをクリックしたときには、「しおり」もきちんと設定されます。
