SVFileServiceの例

LANSA Integrator

SVFileServiceの例


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

1.   SVFileServiceのロードに必要な一連の呼び出しを行います。

2.   注文行データが入っているCSVファイルを、JSMインスタンス・フォルダーのSVFILE.CSVファイルに書き込みます。この簡単な例では、データはRPGプログラムでコード化されたコンパイル時の配列データからのものですが、同様にデータベースからでも、別のLANSA Integratorサービス呼び出しからさまざまな形式で受け取られたものでも構いません。

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

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

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

1.   構造XMLを作成する

SVFileServiceのWRITEコマンドを呼び出すと、CSVファイルに書き込まれる注文行の項目を含む複数のオカレンス・データ構造が渡されます。これが機能するには、LANSA Integratorサービスでこの構造の特性を把握する必要があります。そのためには、構造を記述するXMLファイルを提供します。

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

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

b.   SVOrderLine.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="LINENUM" type="S" length="7"  />               

   <rdml:field name="PARTNUM" type="A" length="7"  />               

   <rdml:field name="PARTDSC" type="A" length="30" />               

   <rdml:field name="PARTAMT" type="S" length="9" decimal="2" />    

   <rdml:field name="PARTQTY" type="S" length="7"  />               

                                                                    

</rdml:structure>                                                   

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

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

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

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

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

     structure.SV.SVOrderLine=structure/SVOrderLine.xml 

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

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

3.   結果のCSVのヘッダーを定義する

このサンプルで作成されるSVFILE.CSVファイルの内容は以下のようになります。

LINENUM,PARTNUM,PARTDSC,PARTAMT,PARTQTY 

1,123,Gasket Paper,9.95,10              

2,456,Gasket polymer glue,13.27,5        

最初のレコードに列名(または見出し)が含まれていることに注意してください。CSVデータを処理するプログラムでは、多くの場合、これらの列名を認識して利用できます。

SVFileServiceはこれらの列見出しを任意で作成します。列見出しを含める場合は、WRITEコマンドのSVHEADパラメータを指定する必要があります。

この例では、SVHEADパラメータのシンボル名ORDERを指定します。このシンボル名は、SVFileServiceのサービス・プロパティ・ファイルで指定される一連の列見出しを認識します。したがって、サービス・プロパティ・ファイルに定義を追加するには、以下のステップを行う必要があります(ファイルにまだ定義がない場合)。

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

b.   SVFileService.propertiesファイルをテキスト・エディタで編集し、定義がまだない場合は以下のエントリーをこのファイルに貼り付けます(新しいエントリーが単体で一行に記述されるようにします。)。

     sv.head.order=LINENUM,PARTNUM,PARTDSC,PARTAMT,PARTQTY 

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

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

使用される列見出しが、RPGプログラムまたは構造XMLで使用される変数名と一致する必要はありません(ただし、この例では一致します)。

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

以下のソースをコピーしてソース・ファイル・メンバーに貼り付けます。

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

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

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

      *          SVFileService to write a comma-separated file           

      *                                                                  

      * 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>/SVFILE)                              

      *             SRCFILE(<srclib>/<srcfil>)                           

      *                                                                  

      *   CRTPGM    PGM(<pgmlib>/SVFILE)                                 

      *             MODULE(<modlib>/SVFILE)                              

      *             BNDSRVPGM(<jsmpgmlib>/DCXS882X)                      

      *             ACTGRP(*CALLER)                                      

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

                                                                           

      * Path of the CSV file created by this program                       

      * - because no folder path is specified, the file will be created    

      *   in the JSM instance folder by default                            

                                                                           

     d svfilepath      c                   const('SVFILE.CSV')             

                                                                           

      * 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 send order line data to be written to the     

      * comma-separated file:                                              

      * - in this simple example, the data comes from the compile-time     

      *   array data, but it could equally well have come from a database  

      *   or received through another LANSA Integrator service call        

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

                                                                          

     d svlist          ds                  occurs(svocur) based(svlistptr)

     d  linenum                       7s 0                                

     d  partnum                       7a                                  

     d  partdsc                      30a                                  

     d  partamt                       9s 2                                

     d  partqty                       7s 0                                

                                                                          

     d svocur          c                   const(2)                       

     d svsize          c                   const(%size(svlist))           

                                                                          

      * Declare the compile-time array that provides the data for         

      * this simple example                                               

                                                                          

     d svdata          s             60a   dim(svocur) perrcd(1) ctdata   

                                                                          

      * Completion messages                                               

                                                                          

     d CompMsg01       c                   'JSMOPEN call completed.'      

     d CompMsg02       c                   '  SERVICE_LOAD call completed.'   

     d CompMsg10       c                   '  WRITE call completed.'          

     d CompMsg98       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                                              

                                                                              

      * 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 JSMCLTDTA on IBM i  

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

                                                                           

     c                   callp     p_jsmopen(jsmsrv:jsmsts:jsmmsg)         

     c                   callp     CheckResult(jsmsts:jsmmsg)              

     c                   callp     SendMessage(CompMsg01:'*COMP')          

                                                                           

      * Load the SVFileService                                             

      * - this example explicitly turns tracing on, overriding the         

      *   settings in the manager.properties file                          

                                                                           

     c                   eval      jsmcmd = 'SERVICE_LOAD'                 

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

     c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)          

     c                   callp     CheckResult(jsmsts:jsmmsg)              

     c                   callp     SendMessage(CompMsg02:'*COMP')          

                                                                           

      * Populate the list to be written to the CSV file                    

      * - in this simple example, the data comes from the compile-time     

      *   array data, but it could equally well have come from a database       

      *   or received through another LANSA Integrator service call             

                                                                                

     c                   eval      svlistptr = %addr(svdata)                    

                                                                                

      * Write a comma-separated list of items from the compile-time array       

      * - the SVHEAD parameter identifies headings (defined in the SVFILESERVICE

      *   service properties file) that will be written to the CSV file         

      * - this passes the multiple occurrence data structure                    

      *   (svlist) containing the items                                         

      * - the structure is described to the SVFileService 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 <instance>\Structure

      *   folder                                                                

                                                                                

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

      *       variable data (in this case the structure/list)                   

                                                                                

     c                   eval      jsmcmd = 'WRITE'                             

     c                             + ' FILE(' + %trim(svfilepath) + ')'   

     c                             + ' SVHEAD(ORDER)'                     

     c                             + ' SERVICE_STRUCTURE(SV.SVOrderLine)' 

     c                             + ' COUNT('  + %char(svocur) + ')'     

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

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

                                                                          

     c                   eval      bytelength = svocur * svsize           

                                                                          

     c                   callp     p_jsmcmdx(jsmcmd:svlist:bytelength:    

     c                                       jsmsts:jsmmsg)               

     c                   callp     CheckResult(jsmsts:jsmmsg)             

     c                   callp     SendMessage(CompMsg10:'*COMP')         

                                                                          

      * Unload the SVFileService                                          

                                                                          

     c                   eval      jsmcmd = 'SERVICE_UNLOAD'              

     c                   callp     p_jsmcmd(jsmcmd:jsmsts:jsmmsg)         

     c                   callp     CheckResult(jsmsts:jsmmsg)             

     c                   callp     SendMessage(CompMsg98:'*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                   eval      *inlr = *on                            

     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                                      

**CTDATA svdata                                               

0000001123    Gasket Paper                  0000009950000010  

0000002456    Gasket polymer glue           0000013270000005