プログラムでABAPでPDFフォームを生成するか、SPOOLの問題を取り除く方法

それがすべて始まった方法



私が働いている会社の詳細は、顧客との密接な接触と協力を意味します。 これらのビジネスプロセスの1つは、封筒に入れた最愛の郵便で、郵便と紙の両方でさまざまな文書を配布することです。 PDF印刷フォームを生成して印刷したり、バイナリ形式でどこかに公開したりできる標準機能は、バックグラウンドタスクとSPOOL印刷データを使用します。

最初は、すべてが完璧で、データが形成され、顧客は満足していました。 しかし、ある時点ですべてが「銅製の盆地」で覆われ、生成された印刷フォームの量が大幅に増加し、SPOOLが「ひどく詰まる」ようになり、サーバー部分全体のひどいブレーキがかかりました。 この記事では、この問題を解決する方法の1つについて説明します。



行こう



通常、最初に、サーバー側と構成ファイルのさまざまな設定の最適化を担当するベースエンジニアと同様の問題を抱えて全員が実行されます。 結果は次のとおりです。多数のSAPノートが読まれ、フォーラムが調査され、その後パラメーターの変更が開始され、何かがパフォーマンスを少し向上させました。 しかし、最終結果では、彼らは望ましい効果を得られませんでした。 もちろん、文書の作成に時間がかかり、顧客重視に疑問がなく、会社の名声に悪影響を及ぼしたため、管理の圧力と顧客の不満が高まりました。 その結果、ソフトウェアレベルで問題に対処することが決定されました。

プレリュードはこれで十分です。問題の技術的な側面に移りましょう。



ベースラインコード分析



最初に、標準のPDFフォーム生成機能がどのように機能するかを把握することにしました。ドリルダウンの結果、 SAFPパッケージに遭遇し、 発生しているすべてのことに目を向けました。問題のフロアはすでに決定されているようです。 プログラムの例を分析した結果、次の主なタスクに直面していることがわかりました。

  1. XFTフォームファイルを作成します。
  2. データを含むXFDファイルを生成します。
  3. プリンターが理解できるバイナリファイルとPDLファイルを取得します。


XFTフォームファイルを作成する



このファイルを自分で作成して、アプリケーションサーバー上のどこかに保存するという2つの解決策がありました。これは、サポートと更新の観点からは不合理でした。トランザクションSFPを使用してテストします。 最小の抵抗のパスを取りましょう:

DATA: l_xdp TYPE fpwbformname VALUE 'ZTEST', "   l_xft TYPE string, "       l_except TYPE REF TO cx_fp_api_repository. "    TRY. cl_fp_wb_helper=>form_layout_exists( i_name = l_xdp ). CATCH cx_fp_api_usage. "#EC NO_HANDLER CATCH cx_fp_api_repository INTO l_except. IF l_except->textid = cx_fp_api_repository=>object_already_exists. l_xft = cl_fp_wb_helper=>form_layout_url( i_name = l_xdp i_dest_path = 'X' ). ELSE. MESSAGE ID 'FPRUNX' TYPE 'E' NUMBER '050' WITH sy-langu. ENDIF. ENDTRY.
      
      





ここで、フォームが指定された名前でシステムに存在するかどうかを確認し、肯定的な回答が得られたら、このフォームへのパスを読み取ります。



データを含むXFDファイルを生成します



PDFファイルの生成は、戦いの半分です。 これを行うには、通常のxmlファイルであるXFDデータを含むファイルを生成する必要があります。 私にとって最善の解決策は、変換を使用することでした。 それでは始めましょう。

フォームに正常に適用されるように、変換後にファイルがどのように見えるかをどのように見つけるのでしょうか? これを行うのは非常に簡単です。次の図に示すように、SFPトランザクションに進み、必要なフォームを開いてデバッグを有効にします。

フォームデバッグモード
フォームで設定を選択します





次に、デバッグモードを設定します。これにより、印刷されたフォームの出力後に添付ファイルを受け取ることができます。





テスト用の印刷フォームを開始し、PDF添付ファイルに必要なファイルを取得します。XFD.xmlに興味があります





そのため、印刷されたフォームのデータ表現ファイルを取得しました。これで、将来、変換を作成して呼び出すことは難しくありません。

 CALL TRANSFORMATION ztest_trans SOURCE is_data = it_data RESULT XML xstr.
      
      





プリンターが理解できるバイナリファイルとPDLファイルを取得する



そのため、印刷フォームを作成するために必要なものはすべて揃っています。 確かに、1つの警告があります。 結局のところ、判明したように、さまざまなタイプのプリンターがあり、一部の色はそうではありません。 プリンターの特定のグループでは、いわゆるXSDテンプレートが使用され、PDFファイルの生成に使用されます。 それらのタイプと分類に関する詳細は、 ここに書かれています

hppcl5c.xdcを使用します。これは、カラープリンターで印刷する機能など、タスクに最適です。 私たちが得たもの:

いくつかのコード
 DATA: l_fp TYPE REF TO if_fp, l_pdfobj TYPE REF TO if_fp_pdf_object, pdfresult TYPE xstring, pdlresult TYPE xstring. *  ADS- MOVE cl_fp=>get_ads_connection( ) TO l_dest. *  FP reference l_fp = cl_fp=>get_reference( ). TRY. *   PDF l_pdfobj = l_fp->create_pdf_object( connection = l_dest ). *   ,     l_pdfobj->set_template( xftfile = l_xft ). *     l_pdfobj->set_data( formdata = l_xfd ). *   PDF  PDF *       ,       l_pdfobj->set_task_renderpdf( ). *   PDF  PDL  CALL METHOD l_pdfobj->set_task_renderpdl EXPORTING pdltype = 'pcl' pdlfile = '' xdcname = 'hppcl5c.xdc'. DATA: form TYPE string. form = i_fpwbformname. l_pdfobj->set_application_form_identity( application = 'SAFP' form = form ). *   ,  ADS TRY. l_pdfobj->execute( ). CATCH cx_fp_runtime_internal cx_fp_runtime_system cx_fp_runtime_usage. "#EC NO_HANDLER ENDTRY. *     XSTRING l_pdfobj->get_pdf( IMPORTING pdfdata = pdfresult ). CALL METHOD l_pdfobj->get_pdl IMPORTING pdldata = pdlresult. ENDTRY.
      
      







まとめ



その結果、このアプローチを適用した後、SPOOL自体をチェーンから完全に除外することができました。 これにより、サーバーをロードせずにバックグラウンドで非常に大量の印刷フォームを作成することができました。現在は3時間で約5000文書です。 このアプローチでは、サーバー側でのデジタル署名など、PDFを使用した他の操作も実行できることに注意してください。 SAFPの記事で前に説明したパッケージで、サンプルをさらに詳しく調べることができます。



All Articles