PDFSpoolFileServiceの例

LANSA Integrator

PDFSpoolFileServiceの例


このプログラム例では以下のステップを実行します。

1.   OVRPRTFコマンドとWRKJOBコマンドを実行して、ユーザー・データPDFSPLFでQGPLの出力待ち行列QPRINTにスプール・ファイルを作成します。

2.   PDFSpoolFileServiceのロードに必要な一連の呼び出しを行い、IBM i ホスト・マシンに接続します。

3.   ユーザー・データPDFSPLFでQGPLの出力待ち行列QPRINTからスプール・ファイルのリストを取得します。

4.   リストの最初のスプール・ファイルを、JSMインスタンスのルート・フォルダー内でPDFファイルPDFSPLF.PDFに変換します(これは、前のスプール・ファイルを消去せずにプログラムが以前に実行されている場合は、現在の実行で作成されるスプール・ファイルではない場合があります)。

5.   接続を解除し、サービスをアンロードしてJSMサーバーとの接続を閉じます。

詳細については、例のコメントとコードを参照してください。

このアプリケーションを機能させるには、以下の3つのステップが必要です。

1.   構造XMLを作成する

PDFSpoolFileServiceのLISTコマンドを呼び出すと、複数のオカレンス・データ構造が渡されます。このデータ構造で、指定した出力待ち行列にあるスプール・ファイルのリスト(最大50ファイル)を受け取ります。これが機能するには、LANSA Integratorサービスでこの構造の特性を把握する必要があります。そのためには、構造を記述するXMLファイルを提供します。

この例の場合、必要なXMLが以下に示されています。LANSA Integratorの最新インストールには、この構造XMLがすでに含まれています。含まれていない場合は、以下のステップを実行する必要があります。

a.   JSMサーバーのJSMインスタンス・フォルダーでstructureフォルダーを探します。

b.   PDFSpoolFileList.xmlというファイルを作成します。

c.   このファイルをテキスト・エディタで編集し、以下のxmlを貼り付けます。

構造XMLで使用されるフィールド名が、RPGプログラムで使用される変数名と一致する必要はありません(この例では一致しません)。重要なのは、注文、タイプ、長さになります。

<?xml version="1.0" encoding="UTF-8"?>

<rdml:structure xmlns:rdml="http://www.lansa.com/2000/XML/Function">

   <rdml:field name="SPFNAM" type="A" length="10" />

   <rdml:field name="SPFNUM" type="A" length="6"  />

   <rdml:field name="JOBNAM" type="A" length="10" />

   <rdml:field name="JOBUSR" type="A" length="10" />

   <rdml:field name="JOBNUM" type="A" length="6"  />

   <rdml:field name="SPFSTS" type="A" length="10" />

</rdml:structure>

2.   構造XMLをJSMサーバーに登録する

以下のプログラム例が、シンボル名PDFSPLF.SpoolFileListで上記の構造XMLを参照するには、LISTコマンドのSERVICE_STRUCTUREキーワードにそのシンボル名を指定します。

このシンボル名と、ステップ1で作成された構造XMLファイルの実際の名前および場所とのリンクをJSMサーバーに提供する必要があります。LANSA Integratorの最新インストールにはこのリンクがすでに含まれています。含まれていない場合は、以下のステップを実行する必要があります。

a.   JSMサーバーのJSMインスタンス・フォルダーでsystemフォルダーを探します。

b.   structure.propertiesファイルをテキスト・エディタで編集し、以下のエントリーを貼り付けます(新しいエントリーが単体で個別の行に記述されるようにします)。

     structure.PDFSPLF.SpoolFileList=structure/PDFSpoolFileList.xml

c.   変更内容を保存します。

d.   JSMサーバー・インスタンスを再起動または更新します([Java Service Managerの更新」を参照)。

3.   ILE RPGプログラム例を作成して実行する

LANSA Integratorの最新インストールには、以下のプログラム例のソースがすでに含まれています。含まれていない場合は、ソースをコピーしてソース・ファイル・メンバーに貼り付けることができます。

プログラムを作成するには、CRTRPGMODコマンドとCRTPGMコマンドを使用する必要があります。必ずソース・メンバーに指定したパラメータ値を使用します。

*************************************************                  

 * PDFSPLF: example in RPG ILE of using the LANSA Integrator        

 *          PDFSpoolFileService                                     

 *                                                                  

 * Note:    This is an example program containing only              

 *          rudimentary exception handling                          

 *                                                                  

 * To create this program you must execute the following commands,  

 * supplying the indicated parameter values and any others that are 

 * necessary in your installation:                                  

 *                                                                  

 *   CRTRPGMOD MODULE(<modlib>/PDFSPLF)                             

 *             SRCFILE(<srclib>/<srcfil>)                           

 *                                                                  

 *   CRTPGM    PGM(<pgmlib>/PDFSPLF)                                

 *             MODULE(<modlib>/PDFSPLF)                             

 *             BNDSRVPGM(<jsmpgmlib>/DCXS882X)                      

 *             ACTGRP(*CALLER)                                      

 *************************************************                  

                                                                           

 * Commands to create the spooled file used by this program                

                                                                           

d ovrprt          c                   const('OVRPRTF FILE(QPDSPJOB) +      

d                                            OUTQ(QGPL/QPRINT) HOLD(*YES) +

d                                            USRDTA(PDFSPLF)')             

d wrkjob          c                   const('WRKJOB OUTPUT(*PRINT)')       

d ovrprtlen       c                   const(%len(ovrprt))                  

d wrkjoblen       c                   const(%len(wrkjob))                  

                                                                           

 * Declare variables for the JSM calls                                     

                                                                           

d jsmsrv          s             50a   inz(*blanks)                         

d jsmsts          s             20a   inz(*blanks)                         

d jsmmsg          s            255a   inz(*blanks)                         

d jsmcmd          s            255a   inz(*blanks)                         

d bytelength      s             10i 0 inz(*zero)                           

                                                                           

 * Declare structure to receive spool file list                            

 * - the structure must contain the following fields as defined            

*   by the LIST command of the PDFSpoolFileService                  

 *   o Spool file name                                               

 *   o Spool file number                                             

 *   o Job name                                                      

 *   o Job user                                                      

 *   o Job number                                                    

 *   o Spool file status                                             

 * NB: This MUST match the structure xml provided to the JSM Server! 

                                                                     

d spoollist       ds                  occurs(spoolocur)              

d  spoolfnam                    10a                                  

d  spoolfnum                     6a                                  

d  spooljnam                    10a                                  

d  spooljusr                    10a                                  

d  spooljnum                     6a                                  

d  spoolfsts                    10a                                  

                                                                     

d spoolocur       c                   const(50)                      

d spoolsize       c                   const(%size(spoollist))        

d spoolcount      s              9p 0 inz(0)                         

                                                                        

 * Completion messages                                                  

                                                                        

d CompMsg10       c                   'JSMOPEN call completed.'         

d CompMsg20       c                   '  SERVICE_LOAD call completed.'  

d CompMsg30       c                   '  CONNECT call completed.'       

d CompMsg40       c                   '  LIST call completed.'          

d CompMsg50       c                   '  CREATE call completed.'        

d CompMsg60       c                   '  DISCONNECT call completed.'    

d CompMsg70       c                   '  SERVICE_UNLOAD call completed.'

d CompMsg99       c                   'JSMCLOSE call completed.'        

                                                                        

 * Procedure prototypes                                                 

                                                                        

d CheckResult     pr                                                    

d  crjsts                             const like(jsmsts)                

d  crjmsg                             const like(jsmmsg)                

                                                                        

d SendMessage     pr                                                    

d  smText                      512a   VALUE                             

d  smType                       10a   VALUE                          

                                                                     

 * Prototypes for the JSM calls                                      

                                                                     

 /COPY QRPGLESRC,JSM_PROC.H                                          

                                                                     

 * Create a spool file that we will convert to PDF                   

                                                                     

c                   call      'QCMDEXC'                              

c                   parm      ovrprt        command         255      

c                   parm      ovrprtlen     commandlen       15 5    

                                                                     

c                   call      'QCMDEXC'                              

c                   parm      wrkjob        command         255      

c                   parm      wrkjoblen     commandlen       15 5    

                                                                     

 * Open a connection to the default JSM server                       

 * - because the server parameter is blank, details of the default   

 *   JSM server are obtained from the data area JSMCTLDTA on IBM i 

 *   or from the file jsmctldta.txt on other supported platforms)    

                                                                           

c                   callp     p_jsmopen(jsmsrv:jsmsts:jsmmsg)              

c                   callp     CheckResult(jsmsts:jsmmsg)                   

c                   callp     SendMessage(CompMsg10:'*COMP')               

                                                                           

 * Load the PDFSpoolFileService                                            

 * - this example explicitly turns tracing on, overriding the              

 *   settings in the manager.properties file                               

                                                                           

c                   eval      jsmcmd = 'SERVICE_LOAD'                      

c                             + ' SERVICE(PDFSPOOLFILESERVICE) TRACE(*YES)'

c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)               

c                   callp     CheckResult(jsmsts:jsmmsg)                   

c                   callp     SendMessage(CompMsg20:'*COMP')               

                                                                           

 * Connect to the IBM i host machine containing the required spool files 

 * - because no HOST parameter is specified, the service will establish    

 *   the connection to the same IBM i that the JSM Server is running on  

                                                                           

c                   eval      jsmcmd = 'CONNECT'                           

c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)               

c                   callp     CheckResult(jsmsts:jsmmsg)                   

c                   callp     SendMessage(CompMsg30:'*COMP')               

                                                                           

 * Load a list of spool files on the QGPL/QPRINT output queue              

 * - although this passes the multiple occurrence data structure           

 *   (spoollist) in which to receive the list, the data is not actually    

 *   received into the structure until the JSMBYTERECV call below          

 * - the structure is described to the PDFSpoolFileService by the          

 *   structure XML identified by the SERVICE_STRUCTURE keyword - there     

 *   must be a matching entry in the structure.properties file and a       

 *   corresponding structure XML file, usually in the JSMInstance\Structure

 *   folder                                                                

                                                                           

 * NOTE: this call uses the JSMCMDX api in order to be able to send and/or 

 *       receive variable data (in this case the list)                     

                                                                           

c                   eval      jsmcmd = 'LIST'                              

c                             + ' LIBRARY(QGPL) QUEUE(QPRINT)'             

c                             + ' USERDATA(PDFSPLF)'                       

c                             + ' SERVICE_STRUCTURE('                      

c                             +    'PDFSPLF.SpoolFileList)'                

c                             + ' OCCURS(' + %char(spoolocur) + ')'        

c                             + ' SIZE('   + %char(spoolsize) + ')'        

                                                                           

c                   eval      %occur(spoollist) = 1                        

c                   eval      bytelength = spoolocur * spoolsize           

                                                                           

c                   callp     p_jsmcmdx(jsmcmd:spoollist:bytelength:       

c                                       jsmsts:jsmmsg)                     

c                   callp     CheckResult(jsmsts:jsmmsg)                   

c                   callp     SendMessage(CompMsg40:'*COMP')               

                                                                           

 * Get the length of the received data structure                           

 * - only continue to attempt to receive it if the length is valid         

                                                                           

c                   callp     p_jsmbytelngth(bytelength)                   

c                   if            (bytelength > 0)                         

c                             and (bytelength <= spoolocur * spoolsize)    

                                                                           

 * ... receive the spool file list into                                

 *     our multiple occurrence data structure                          

 *     - don't forget to set the DS occurrence to 1 before the call    

                                                                       

c                   callp     p_jsmbyterecv(spoollist)                 

                                                                       

 * ... calculate the number of entries                                 

 *     - for illustration only, not used in this example program       

                                                                       

c                   eval      spoolcount = bytelength / spoolsize      

                                                                       

 * ... create a PDF file in the root of the IFS for the first          

 *     spool file (if any)                                             

                                                                       

c                   eval      jsmcmd = 'CREATE'                        

c                             + ' DOCUMENT(PDFSPLF.PDF)'               

c                             + ' NAME(' + %trim(spoolfnam) + ')'      

c                             + ' JOBNAME(' + %trim(spooljnam) + ')'   

c                             + ' JOBUSER(' + %trim(spooljusr) + ')'   

c                             + ' JOBNUMBER(' + %trim(spooljnum) + ')'

c                             + ' NUMBER(' + %trim(spoolfnum) + ')' 

c                             + ' FONTSIZE(8) LEADING(8.5)'         

c                             + ' ORIENTATION(*LANDSCAPE)'          

c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)        

c                   callp     CheckResult(jsmsts:jsmmsg)            

c                   callp     SendMessage(CompMsg50:'*COMP')        

                                                                    

c                   endif                                           

                                                                    

 * Close the current IBM i host machine connection                

                                                                    

c                   eval      jsmcmd = 'DISCONNECT'                 

c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)        

c                   callp     CheckResult(jsmsts:jsmmsg)            

c                   callp     SendMessage(CompMsg60:'*COMP')        

                                                                    

 * Unload the PDFSpoolFileService                                   

                                                                    

c                   eval      jsmcmd = 'SERVICE_UNLOAD'             

c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)        

c                   callp     CheckResult(jsmsts:jsmmsg)              

c                   callp     SendMessage(CompMsg70:'*COMP')          

                                                                      

 * Close the connection to the JSM server and finish                  

                                                                      

c                   callp     p_jsmclose(jsmsts:jsmmsg)               

c                   callp     CheckResult(jsmsts:jsmmsg)              

c                   callp     SendMessage(CompMsg99:'*COMP')          

c                   seton                                        LR   

c                   return                                            

                                                                      

 *************************************************                    

 * Procedure to check the result of a Java Service Manager call       

 *************************************************                    

p CheckResult     b                                                   

d CheckResult     pi                                                  

d  crjsts                             const like(jsmsts)              

d  crjmsg                             const like(jsmmsg)              

d  crText         s            512a                                   

d  crMsg1         c                   const('JSM Status : ')          

d  crMsg2         c                   const('JSM Message: ')        

d  crMsg3         c                   const('JSM Service error has +

d                                            occurred')             

c                   if        crjsts <> 'OK'                        

c                   eval      crText = crMsg1 + crjsts              

c                   callp     SendMessage(crText:'*DIAG')           

c                   eval      crText = crMsg2 + crjmsg              

c                   callp     SendMessage(crText:'*DIAG')           

c                   callp     SendMessage(crMsg3:'*ESCAPE')         

c                   endif                                           

p CheckResult     e                                                 

                                                                    

 *************************************************                  

 * Procedure to send a program message                              

 *************************************************                  

p SendMessage     b                                                 

                                                                    

d SendMessage     pi                                                

d smText                       512a   VALUE                         

d smMsgT                        10a   VALUE                         

                                                                  

d smMsgI          s              7a   inz('CPF9897')              

d smMsgF          s             20a   inz('QCPFMSG   *LIBL     ') 

d smDtaL          s             10i 0 inz(%size(smText))          

d smStkE          s             10a   inz('*')                    

d smStkC          s             10i 0 inz(1)                      

d smMsgK          s              4a                               

d smErrC          s             10i 0 inz(0)                      

                                                                  

c                   if        smMsgT = '*ESCAPE'                  

c                   eval      smMsgI = 'CPF9898'                  

c                   endif                                         

                                                                  

c                   call      'QMHSNDPM'                          

c                   parm                    smMsgI                

c                   parm                    smMsgF                

c                   parm                    smText                

c                   parm                    smDtaL                

c                   parm                    smMsgT                

c                   parm                    smStkE                

c                   parm                    smStkC 

c                   parm                    smMsgK 

c                   parm                    smErrC 

                                                   

p                 e