Delphi生成ページ(html)レポート


ハードディスク(HDD)を整理していたら、突然この小物を見つけて、何年も前に永恩グループ(ダフニ)にPOSシステムをチェーンしていたときに作ったDELPHIでHTMLレポートを生成するテスト(私はもう5年もDELPHIを使っていません)を思い出しました.どうしてこんなに変態を要求したの?
私は当初ダフニにfastreportでレポートを作って、フォーマットとデータの展示は完全に要求を満たしていましたが、最終的に拒否されました.その理由は、oracle erpの印刷がHTMLのウェブページ形式で印刷されていたからです.私はとても崩壊して、oracleの中のreport builderも強いことを覚えています.どうして使いませんか.実は今まで私は依然としてfastreportでするのが正しいことを堅持して、しかしその時、人は取引先で、htmlを使わなければならなくて、あなたも仕方がなくて、人はブラウザの中で右ボタンをクリックして印刷するのが好きで、ああ、この年、どんな需要があります.
当時、このチームは調査研究に行かなかったので、私は夜の暇な時間を割いて、資料を見て、この問題を解決しました.実は簡単で、体力的な仕事でした.
delphiにはwebbrowserコントロールがあり、この上にhtmlコードを直接出力すればいいです.htmlでテンプレートを作ってから、中にデータを記入すればいいです.
このレポートは複雑で、グループ化、集約の要約に関連しています.分類要約、明細などは1つのレポートに記載されています.つまり、複雑な構造のhtmlページです.構造の複雑さ、はっきり言って体力の仕事で、その肝心な点:
htmlテンプレートの生成
簡単な例を挙げると、頭部:
{ ,6 }
  HTML_LZS_HEAD_ONE=
  '<TABLE cellSpacing=0 border=0> '
  +'<TBODY>   '
  +'<TR> '
  +'<TD align=right> :</TD>  '
  +'<TD align=left>%s</TD></TR> '
  +'<TR>  '
  +'<TD align=right> :</TD>  '
  +'<TD align=left>%s</TD></TR> '
  +'<TR> '
  +'<TD align=right> :</TD>  '
  +'<TD align=left>%s</TD></TR>'
  +'<TR>'
  +'<TD align=right> :</TD> '
  +'<TD align=left>%s</TD></TR> '
  +'<TR> '
  +'<TD align=right> :</TD> '
  +'<TD align=left>%s</TD></TR>  '
  +'<TR> '
  +'<TD align=right> :</TD> '
  +'<TD align=left>%s</TD></TR> '
  +'</TBODY>  '
  +'</TABLE>  ';

データベースからデータをクエリーし、結果を取得し、入力します.
F_HEAD_ONE:=Format(HTML_LZS_HEAD_ONE,
      [aqryPublic.FieldByName('SUBCOMPANY_ID').AsString,
       aqryPublic.FieldByName('WORKING_GROUP').AsString,
       aqryPublic.FieldByName('SHOP_ID').AsString,
       aqryPublic.FieldByName('REFERENCE_YEAR').AsString,
       aqryPublic.FieldByName('REFERENCE_MONTH').AsString,Fstate]);

これでhtmlコードを生成し、webbrowserにどのように表示しますか?
procedure TFrmReport.ShowHtml(content: widestring);
var
  v: Variant;
  HTMLDocument: IHTMLDocument2;
begin  
  v := VarArrayCreate([0, 0], varVariant);
  v[0] := content;
  HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
  HTMLDocument.write(PSafeArray(TVarData(v).VArray));
  HTMLDocument.close;
  HTMLDocument := nil;
end;


なお注意
initialization
  OleInitialize(nil);
finalization
  OleUninitialize;