最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

6.6.API基礎講座6 ユーザースペースへのデータの展開

[ Previous ] [ HOME ] [ Upper ] [ Next ]


ここで、システム資源(ていうのか、例えば、活動ジョブリストとかスプールファイルリストとか)を、ユーザー・スペースへ展開します。 ここでやっと、マニュアルがリファレンスとして機能し始めます。

まず、目次を見て

  • データベース関係なら、データベースAPIを見るし、
  • 数字編集をしたいなら、編集機能APIを見るし、
  • スプールリストがほしいならば、スプールおよび印刷APIの項

を見ます。 ではここで一緒に、(コマンドにOUTFILEがなくて、APIのサンプルとして一番役立ちそうなので)スプールリストの処理を見てみましょう。 まず、マニュアルを見ます。 スプールに関するAPIの一覧があります。(詳しくはマニュアルを見てください)

この中で以下のAPIを使います。

スプール・ファイルのリスト (QUSLSPL)

ユーザー・スペースにシステム上のスプール・ファイルのリストを生成します。リストには、すべてのスプール・ファイルか、あるいは特定のユーザー、出力待ち行列、用紙タイプ、またはユーザー指定のデータ値のスプール・ファイルを入れることができます。

ではマニュアルの、その項目を見てみましょう。

4.63.6 スプール・ファイルのリスト (QUSLSPL) API

パラメーター

必須パラメーター・グループ:
1   修飾ユーザー・スペース名 入力 CHAR(20)
2   形式名 入力 CHAR(8)
3   ユーザー名 入力 CHAR(10)
4   修飾出力待ち行列名 入力 CHAR(20)
5   用紙タイプ 入力 CHAR(10)
6   ユーザー指定データ 入力 CHAR(10)
任意指定パラメーター・グループ 1:  
7   エラー・コード 入出力 CHAR(*)
任意指定パラメーター・グループ 2:
8   修飾ジョブ名 入力 CHAR(26)
9   返されるフィールドのキー 入力 BINARY(4)のARRAY(*)
10   返されるフィールド数 入力 BINARY(4)

スプール・ファイルのリスト (QUSLSPL) API は、スプール・ファイル処理(WRKSPLF) コマンドまたはジョブ処理 (WRKJOB OPTION(*SPLF)) コマンドと類似しています。この API は、システム上のスプール・ファイルのリストを生成し、そのリストをユーザー・スペースに置きます。リストには、以下のいずれかを組み込むことができます。

  • すべてのスプール・ファイル
  • 特定のユーザーまたはすべてのユーザーのスプール・ファイル
  • 特定の出力待ち行列またはすべての出力待ち行列内のスプール・ファイル
  • すべての用紙タイプまたは標準用紙タイプのスプール・ファイル
  • 任意のユーザー指定データ値を持つスプール・ファイル
  • 特定のジョブによって生成されたスプール・ファイル
  • 生成されたリストは、ユーザー・スペース内の既存のリストに置き換えられます。

さて、ここで重要なのは、必須パラメータに「修飾ユーザー・スペース名」があることです。私は、プログラム作成前に、必須パラメータを見て、ユーザー・スペースを使うAPIか否かを判定しています。 この、スプールリストを作成するAPI(QUSLSPL)は、どかっと、ユーザー・スペースにデータをセットして、終了するタイプのAPIです。 では、どんな内容をセットしてくれるのでしょうか? ここで重要なキーワードは「形式名」です。 マニュアルを見ると、

形式名

入力;CHAR(8)

返されるスプール・ファイル情報の形式。以下のものを指定しなければなりません。

  • SPLF0100   スプール・ファイルの内部識別コード、およびスプール・ファイルを作成したジョブを含みます。
  • SPLF0200  スプール・ファイル処理 (WRKSPLF) コマンドによって選択されたスプール・ファイルのリストが表示されるときに示される情報。

と出ていますね。

つまり、パラメータ「形式名」に、固定情報「SPLF0100」をセットして、QUSLSPLとCALLする場合と、「SPLF0200」をセットする場合では、ユーザー・スペースにセットされるデータが違うのです。 (というより、SPLF0100より、SPLF0200は、詳しくなると思ってください。但し、今回のこのSPLF0200はキーを指定するとその内容が帰ってくるというもので、ややこしいのです。これを最初にしてしまうと、うんざりしてしてしまうでしょう。ですので、ここではSPLF0100を取り上げます。ちなみに、SPLF0200の形式は、ほかのAPIのXXX0200と比較しても特殊です。)

また、この形式名はAPIにより違いますので、何でもかんでも、SPLF0100ではありません。別のAPIには、それ専用の「形式名」があります。マニュアルをぱらぱらと見てみてください。ただ、共通のネーミングルールらしきものがあり、XXX0100はもっともパフォーマンスはいいけど、ちょっとの情報で。XXXX0200はややパフォーマンスは悪いけど、より多い情報で、XXXX0300は、さらにパフォーマンスが悪いけど、もっと多い情報で...という感じになっています。 どれが必要なのかは、マニュアルのその取り出される項目を見て判断します。

さらにマニュアルを読み進めると、

スプール・ファイル・リストは、以下のものから構成されます。
  • ユーザー域
  • 総称見出し
  • 入力パラメーター・セクション
  • 見出しセクション
  • リスト・データ・セクション

と出ています。 「ユーザー域」は自分もなんだか知らないし、使ったこともありません。無視してください。 「総称見出し」が重要でしたよね。ここにデータの存在場所が克明に出ています。 さらに、このAPIは、「見出しセクション」も持っています。この「見出しセクション」を作成しないAPIもあるらしいです。(そのように、マニュアルに出ている。) 「リストデータセクション」こそ、われわれが一番求めている中核のデータです。これを取り出すためには、まず、ユーザー・スペースの中のどの桁からあるのかを「総称見出し」から引き出さねばなりません。

ではここまでを、RPGで表現して見ましょう。「見出しセクション」は必要ないので、無視します。リストセクションを一つずつ取り出すところをよく見てください。また、わざとサブルーチンに入っていたものを、やめてメインルーチンに入れました。この方が、いったりきたりしなくても、見れるでしょう?ご自分で作るときは、もっと奇麗なものにしてください。 尚、I仕様書のDSの部分は、QUSRTOOLのQATTRPGSというソースファイルに、ドバーと入っています(中にはないものもありますが)。ちなみに、SPLF0100は OPSPLF0100というメンバーでした。このメンバーを利用してもいいし、自分で作成してもいいし、また、ファイルにして、外部DSにしてもいいでしょう。本当は、外部DSを薦めたいのですが、このサイトで、ソース掲載しての説明に支障が出るため、ここではしていません。

エラーに関しては、後で詳述します。

     H            Y/                                    1
     I******************************************************
     I*     D E F I N E    D A T A  - S T R U C T U R E    *
     I******************************************************
     IUSRSPC      DS
     I                                        1  10 USNAME
     I                                       11  20 USLIB
     IGENHED      DS
     I                                    B   1   40DTLOFS
     I                                    B   5   80LSTSIZ
     I                                    B   9  120NOENTH
     I                                    B  13  160DTLSIZ
     ISF0100      DS
     I                                        1  10 USRNML  
     I                                       11  30 OUTQL   
     I                                       11  20 OUTQNL  
     I                                       21  30 OUTQLL  
     I                                       31  40 FRMTYL  
     I                                       41  50 USRDTL  
     I                                       51  66 JOBID   
     I                                       67  82 SPLFID  
     I ここは、バイナリを定義しているだけ。
     I            DS
     I                                    B   1   40USSIZE
     I                                    B   5   80LENDTA
     I                                    B   9  120STRPOS
     C******************************************************
     C*             M A I N -  R O U T I N E               :
     C******************************************************
     C*                                                    :
     C*ユーザー・スペースの作成                            :
     C*                                                    :
     C                     Z-ADD100       USSIZE           
     C                     MOVEL'SPLINF'  USNAME           :
     C                     MOVEL'QTEMP'   USLIB            :
     C*                                                    :
     C                     CALL 'QUSCRTUS'             95  :
     C                     PARM           USRSPC           :
     C                     PARM 'SPL'     EXTATR 10        :
     C                     PARM           USSIZE           :
     C                     PARM ' '       USINIT  1        :
     C                     PARM '*ALL'    USAUTH 10        :
     C                     PARM           USTEXT 50        :
     C*
     C*ユーザー・スペースにデータを展開                    :
     C*                                                    :
     C                     CALL 'QUSLSPL'              95  :
     C                     PARM           USRSPC           :
     C                     PARM 'SPLF0100'FMTRCD  8        :
     C                     PARM '*CURRENT'USER   10        :
     C                     PARM '*ALL'    OUTQ   20        :
     C                     PARM '*ALL'    FRMTYP 10        :
     C                     PARM '*ALL'    USRDTA 10        :
     C*                                                    :
     C           *IN95     CABEQ*ON       \END             :
     C*                                                    :
     C*総称見出しからデータを取り出す                      :
     C*                                                    :
     C* 「124 7C BINARY(4) リストデータセクションのオフセット」から
     C* 「136 88 BINARY(4) 各項目のサイズ」までを取り出す。
     C* 
     C                     CALL 'QUSRTVUS'             95  :
     C                     PARM           USRSPC           :
     C                     PARM 125       STRPOS           :=124 + 1
     C                     PARM 16        LENDTA           := 4 * 4
     C                     PARM           GENHED           :
     C*                                                    :
     C           *IN95     CABEQ*ON       \END             :
     C           NOENTH    CABEQ0         \END             :項目がない
     C*                                                    :
     C*リストセクション読み込みの初期値                    :
     C*                                                    :
     C                     Z-ADD1         W1CNT   50       :カウンター
     C*                                                    :
     C                     Z-ADDDTLOFS    STRPOS           :
     C                     ADD  1         STRPOS           :リスト開始桁
     C                     Z-ADDDTLSIZ    LENDTA           :リストデータ長
     C*                                                    :
     C* リストセクションの各項目取り出し                   :
     C*                                                    :
B001 C           W1CNT     DOWLENOENTH                     :項目の数分実行
 001 C*                                                    :
 001 C                     CALL 'QUSRTVUS'             95  :リスト部分RTV
 001 C                     PARM           USRSPC           :
 001 C                     PARM           STRPOS           :
 001 C                     PARM           LENDTA           :
 001 C                     PARM           SF0100           :
 001 C*                                                    :
 001 C                     ADD  1         W1CNT            :
 001 C                     ADD  DTLSIZ    STRPOS           :
 001 C*                                                    :
E001 C                     ENDDO                           :
     C*                                                    :
     C           \END      TAG                             :
     C*                                                    :
     C                     MOVE *ON       *INLR            :
     C                     RETRN                           :       

解説

このリストの後半の、リストセクションの取り出しの部分に焦点を当ててみましょう。 以下のことが、総称見出しを参照することで分かっています。

  1. リストセクションの開始桁 (リストセクションのオフセット + 1)
  2. リストセクションの1項目(1明細)の長さ
  3. リストセクション内の項目の数

これだけ分かれば十分ですね。ファイルのようにEOFはありませんが、予め何レコードあるか分かっているので、その件数分レコードを読み込むのと同じです。エラーを出して、EOFを識別するのはスマートではありません。

さて、QUSRTVUSは、どこから、何バイト読むのかを指定するものでしたね。

DOループの部分は、

  1. カウンターを利用して、項目の数分繰り返す
  2. QUSRTVUSで、読み取り開始位置と長さを指定して、一項目取り出す。
  3. 読み取り開始位置を、項目の長さ分、ずらす。
  4. カウンターをカウントアップする。

上記のソースで、W1CNT  DOWLE  NOENTHを 1 DO NOENTHにしてもいいと思います。

ところで、サンプルのプログラムは、単にユーザー・スペースからデータを取り出しているだけで、何もしていません。これを有益なものにしなくては意味がありませんよね。

続く...


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送