トップへ(mam-mam.net/)

PowerPDFを使ってデータベースから帳票を出力 ~ pdfファイル作成Delphiコンポーネント

検索:

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を使ってつなぎます。

「ADO_Slip」のSQLは、以下です。
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に]ボタンをクリックしたときには、「しおり」もきちんと設定されます。
上記の実際のサンプル一式をダウンロード