データ・ストラクチャーの定義 (位置か長さか/System API の戻り値を例として)

System API を使用する場合はたいてい返り値を取るかユーザースペースに受け取るか、になっています。
返り値を受け取る場合には System API をプロトタイプ定義してそのパラメータの中の返り値としての変数についてデータ・ストラクチャーを定義するのが一般的なやり方だと思います。

System API

たとえば QUSRJOBI という System API は以下のような戻り値と引数を持っていますが、この中の一番上に書いてあるタイプが char(*) の Receiver variable となっているものが結果の返ってくる戻り値になっています。
この戻り値には char(8) で引数として定義されている Format name でフォーマットを指定することによってどんな内容が返ってくるかが変わってきます。その、どういうフォーマットで値が戻ってくるか、をデータ・ストラクチャーで定義しておくわけです。

Retrieve Job Information (QUSRJOBI) API


  Required Parameter Group:

1 Receiver variable Output Char(*)
2 Length of receiver variable Input Binary(4)
3 Format name Input Char(8)
4 Qualified job name Input Char(26)
5 Internal job identifier Input Char(16)

  Optional Parameter Group 1:

6 Error code I/O Char(*)

  Optional Parameter Group 2:

7 Reset performance statistics Input Char(1)

  Default Public Authority: *USE

  Threadsafe: Conditional; see Usage Notes.

The Retrieve Job Information (QUSRJOBI) API retrieves specific information about a job.

フォーマットの種類

Format name には以下のようなものが指定できます。(V5R4)

The format of the job information to be returned. The format names supported are:
JOBI0100 Basic performance information
JOBI0150 Additional performance information
JOBI0200 WRKACTJOB information
JOBI0300 Job queue and output queue information
JOBI0400 Job attribute information
JOBI0500 Message logging information
JOBI0600 Active job information
JOBI0700 Library list information
JOBI0750 Extended library list information
JOBI0800 Active job signal information
JOBI0900 Active job SQL information
JOBI1000 Elapsed performance statistics

フォーマットの内容

たとえば、↑のうち JOBI0200 というフォーマットはこんなふうになっています。

Offset Type Field
Dec Hex
0 0 BINARY(4) Number of bytes returned
4 4 BINARY(4) Number of bytes available
8 8 CHAR(10) Job name
18 12 CHAR(10) User name
28 1C CHAR(6) Job number
34 22 CHAR(16) Internal job identifier
50 32 CHAR(10) Job status
60 3C CHAR(1) Job type
61 3D CHAR(1) Job subtype
62 3E CHAR(10) Subsystem description name
72 48 BINARY(4) Run priority (job)
76 4C BINARY(4) System pool identifier
80 50 BINARY(4) Processing unit time used, if less than 2,147,483,647 milliseconds
84 54 BINARY(4) Number of auxiliary I/O requests, if less than 2,147,483,647
88 58 BINARY(4) Number of interactive transactions
92 5C BINARY(4) Response time total
96 60 CHAR(1) Function type
97 61 CHAR(10) Function name
107 6B CHAR(4) Active job status
111 6F BINARY(4) Number of database lock waits
115 73 BINARY(4) Number of internal machine lock waits
119 77 BINARY(4) Number of nondatabase lock waits
124 7C BINARY(4) Time spent on database lock waits
127 7F BINARY(4) Time spent on internal machine lock waits
131 83 BINARY(4) Time spent on nondatabase lock waits
135 87 CHAR(1) Reserved
136 88 BINARY(4) Current system pool identifier
140 8C BINARY(4) Thread count
144 90 BINARY(8), UNSIGNED Processing unit time used - total for the job
152 98 BINARY(8), UNSIGNED Number of auxiliary I/O requests
160 A0 BINARY(8), UNSIGNED Processing unit time used for database - total for the job
168 A8 BINARY(8), UNSIGNED Page faults
176 B0 CHAR(4) Active job status for jobs ending
180 B4 CHAR(10) Memory pool name
190 BE CHAR(1) Message reply

フォーマットをデータ・ストラクチャーで定義

旧来の定義 (位置指定)

上記のフォーマットをデータ・ストラクチャーで定義すると、今までの OPM/ILE RPG だとこんなかんじになると思います。
(ちなみにこちらのコードは http://www.code400.com/viewsamples.php?lang_id=10 から取ってきました。ですので、それなりに普通のやり方だと思います。ちなみに全文を Free-Format RPG に書き換えてみたものがこちらにありますので、それも参照してみてください)

D Job_Inf         DS           256    Qualified
d  JobName                9     18            
d  JobUser               19     28            
d  JobNumber             29     34            
d  InternalId            35     50            
d  Status                51     60            
D  JobType               61     61            
D  JobSubType            62     62            
D  Subsystem             63     72            
D  JobRunPty             73     76b 0         
D  SystemPool            77     80b 0         
D  ProcessUnit           81     84b 0         
D  AuxRequests           85     88b 0         
D  InteractTrans         89     92b 0         
D  TotRespTime           93     96b 0         
d  FunctionType          97     97            
D  FunctionName          98    107            
D  ActJobStatus         108    111        
D  DBLockWait           112    115b 0     
D  MchLockWait          116    119b 0     
D  NDBLockWait          120    123b 0     
D  TimeDBLckW           124    127b 0     
D  TimeNDBLckW          128    131b 0     
D  TimeMchLckW          132    135b 0

ILE RPG らしいやり方 (タイプと長さ)

データ・ストラクチャーの定義は、ILE RPG になって今までのような開始位置と終了位置の指定によるものだけでなく、それぞれのサブフィールドの長さとデータ・タイプの指定を行うことによっても定義できるようになっています。

やはりタイプと長さというのはフィールドの定義の基本ですから、開始/終了位置による定義よりは可読性、ドキュメンテーションという観点からはこちらの方が望ましいと言えるでしょう。("Top 10 Bad Programming Practices in RPG IV" にも同様なことが書いてありました) C の構造体のようなかんじでしょうか。
まぁ、何にせよ新しいものは以前の不都合を修正するために出てきているわけなので、素直に利用できるものは利用した方がいい、ということは言えるとは思います。

実際に書き直してみると、こんなかんじです。

D Job_Inf         DS           256    Qualified   
D  ByteReturned                 10i 0             
D  ByteAvailable                10i 0             
d  JobName                      10a               
d  JobUser                      10a          
d  JobNumber                     6a          
d  InternalId                   16a          
d  Status                       10a          
D  JobType                       1a          
D  JobSubType                    1a          
D  Subsystem                    10a          
D  JobRunPty                    10i 0        
D  SystemPool                   10i 0        
D  ProcessUnit                  10i 0        
D  AuxRequests                  10i 0           
D  InteractTrans                10i 0           
D  TotRespTime                  10i 0           
d  FunctionType                  1a             
D  FunctionName                 10a             
D  ActJobStatus                  4a             
D  DBLockWait                   10i 0           
D  MchLockWait                  10i 0           
D  NDBLockWait                  10i 0           
D  TimeDBLckW                   10i 0     
D  TimeNDBLckW                  10i 0     
D  TimeMchLckW                  10i 0     

"Top 10 Bad Programming Practices in RPG IV" に以下のようなデータ・タイプについての対照表がありましたので、これを参考にしています。

RPG IV
Designation
C and Java
API Manuals
Alternate API
Manuals
3I 0
char
Bin(1)
char
5I 0
short
Bin(2)
Int2
10I 0
int or long
Bin(4)
Int4
20I 0
long
Bin(8)
Int8

位置指定のものと、タイプ/長さによるもののそれぞれを並べてみたものです。

D Job_Inf         DS           256    Qualified   
D  ByteReturned                 10i 0             
D  ByteAvailable                10i 0             
d* JobName                9     18                
d  JobName                      10a               
d* JobUser               19     28                
d  JobUser                      10a               
d* JobNumber             29     34           
d  JobNumber                     6a          
d* InternalId            35     50           
d  InternalId                   16a          
d* Status                51     60           
d  Status                       10a          
D* JobType               61     61           
D  JobType                       1a          
D* JobSubType            62     62           
D  JobSubType                    1a          
D* Subsystem             63     72           
D  Subsystem                    10a          
D* JobRunPty             73     76b 0        
D  JobRunPty                    10i 0        
D* SystemPool            77     80b 0        
D  SystemPool                   10i 0        
D* ProcessUnit           81     84b 0        
D  ProcessUnit                  10i 0        
D* AuxRequests           85     88b 0        
D  AuxRequests                  10i 0           
D* InteractTrans         89     92b 0           
D  InteractTrans                10i 0           
D* TotRespTime           93     96b 0           
D  TotRespTime                  10i 0           
d* FunctionType          97     97              
d  FunctionType                  1a             
D* FunctionName          98    107              
D  FunctionName                 10a             
D* ActJobStatus         108    111              
D  ActJobStatus                  4a             
D* DBLockWait           112    115b 0           
D  DBLockWait                   10i 0           
D* MchLockWait          116    119b 0           
D  MchLockWait                  10i 0           
D* NDBLockWait          120    123b 0           
D  NDBLockWait                  10i 0           
D* TimeDBLckW           124    127b 0           
D  TimeDBLckW                   10i 0           
D* TimeNDBLckW          128    131b 0     
D  TimeNDBLckW                  10i 0     
D* TimeMchLckW          132    135b 0     
D  TimeMchLckW                  10i 0

デバッグ

実はデバッグする時にも違いがあります。

こちらが位置指定による「変数の表示」の結果です。
BINARY(4) のサブフィールドが 8桁の先行ゼロつきで表示されています。

こちらがタイプと長さの指定による「変数の表示」の結果です。
BINARY(4) のサブフィールドが数字として表示されているのがわかりますね。

[Top Pageに戻る]

Ads by TOK2