6.6.API基礎講座6 ユーザースペースへのデータの展開 |
ここで、システム資源(ていうのか、例えば、活動ジョブリストとかスプールファイルリストとか)を、ユーザー・スペースへ展開します。 ここでやっと、マニュアルがリファレンスとして機能し始めます。 まず、目次を見て
を見ます。 ではここで一緒に、(コマンドにOUTFILEがなくて、APIのサンプルとして一番役立ちそうなので)スプールリストの処理を見てみましょう。 まず、マニュアルを見ます。 スプールに関するAPIの一覧があります。(詳しくはマニュアルを見てください) この中で以下のAPIを使います。 スプール・ファイルのリスト (QUSLSPL)ユーザー・スペースにシステム上のスプール・ファイルのリストを生成します。リストには、すべてのスプール・ファイルか、あるいは特定のユーザー、出力待ち行列、用紙タイプ、またはユーザー指定のデータ値のスプール・ファイルを入れることができます。 ではマニュアルの、その項目を見てみましょう。 4.63.6 スプール・ファイルのリスト (QUSLSPL) API パラメーター
スプール・ファイルのリスト (QUSLSPL) API は、スプール・ファイル処理(WRKSPLF) コマンドまたはジョブ処理 (WRKJOB OPTION(*SPLF)) コマンドと類似しています。この API は、システム上のスプール・ファイルのリストを生成し、そのリストをユーザー・スペースに置きます。リストには、以下のいずれかを組み込むことができます。
さて、ここで重要なのは、必須パラメータに「修飾ユーザー・スペース名」があることです。私は、プログラム作成前に、必須パラメータを見て、ユーザー・スペースを使うAPIか否かを判定しています。 この、スプールリストを作成するAPI(QUSLSPL)は、どかっと、ユーザー・スペースにデータをセットして、終了するタイプのAPIです。 では、どんな内容をセットしてくれるのでしょうか? ここで重要なキーワードは「形式名」です。 マニュアルを見ると、
と出ていますね。 つまり、パラメータ「形式名」に、固定情報「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 : 解説このリストの後半の、リストセクションの取り出しの部分に焦点を当ててみましょう。 以下のことが、総称見出しを参照することで分かっています。
これだけ分かれば十分ですね。ファイルのようにEOFはありませんが、予め何レコードあるか分かっているので、その件数分レコードを読み込むのと同じです。エラーを出して、EOFを識別するのはスマートではありません。 さて、QUSRTVUSは、どこから、何バイト読むのかを指定するものでしたね。 DOループの部分は、
上記のソースで、W1CNT DOWLE NOENTHを 1 DO NOENTHにしてもいいと思います。 ところで、サンプルのプログラムは、単にユーザー・スペースからデータを取り出しているだけで、何もしていません。これを有益なものにしなくては意味がありませんよね。 続く... |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||