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に]ボタンをクリックしたときには、「しおり」もきちんと設定されます。