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

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

よく使うマニュアルです

Wiki

updated on 2004.06.23

6.4.API基礎講座4 ユーザー・スペースに対する操作

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


ユーザー・スペースに対する操作は、以下のAPIで行います。但し、QUSDLTUSの代わりに、DLTUSRSPC(コマンド)でも可能です。 API名は、覚えやすいように、ハイフネーションをつけてみました。

ユーザー・スペースの作成API QUS-CRT-US
ユーザー・スペースの検索API QUS-RTV-US
ユーザー・スペースの削除API QUS-DLT-US
ユーザー・スペースの変更API QUS-CHG-US
ユーザー・スペース属性の変更API QUS-C-US-AT
ユーザー・スペースを指すポインターの検索API QUS-PTR-US
ユーザー・スペース属性の検索API QUS-R-US-AT

正直に言って、私が使ったことがあるのは、作成(CRT)と削除(DLT)と検索(RTV)だけです。そのほかは使うチャンスはありませんでした。

ユーザー・スペースの作成

ユーザー・スペースを使うAPIは、その実行前に、予め自分でユーザー・スペースを作成しなくてはなりません。RPGからでも、CLPからでも可能です。またV3.1では、REPLACEパラメータが増えました。前はなかったと思います。どのシステムでも使えるようにするなら、「CHKOBJして、CPF9800のモニターしてから作成」のほうがいいでしょう。(もし、replaceパラメータをサポートすることがないときのため。関係なければ、replaceしていいと思います。)

作成するライブラリーはQTEMPに作成した方がいいでしょう。通常のライブラリーにするならば、ロックをして他のユーザーから排他したほうが無難です。

作成してくれるプログラム(これもAPI)は、QUSCRTUSです。

必須パラメーター・グループ:

1 ユーザー・スペース修飾名 入力 Char(20)
2 拡張属性 入力 Char(10)
3 初期サイズ 入力 Binary(4)
4 初期値 入力 Char(1)
5 共通権限 入力 Char(10)
6 テキスト記述 入力 Char(50)

任意指定パラメーター・グループ 1:

7 Replace 入力 Char(10)
8 エラー・コード 入出力 Char(*)

任意指定パラメーター・グループ 2:

9 定義域 入力 Char(10)

 

  • パラメータ中の「入力」とは、APIに渡すデータです。「出力」(ここにはないが)は、APIから受け取るデータです。APIを中心に考えれば、「入力」と「出力」の意味がはっきりすると思います。
  • ユーザー・スペース修飾名には、ユーザー・スペース名とそのライブラリの順番でセットします。
  • 拡張属性は、どうやら意味はほとんど無く、コメントくらいなものでしょう。 初期サイズ。バイナリで初期のユーザー・スペースのサイズを指定します。データは自動拡張されますので、初期サイズです。(自動拡張をしないようにするには、ユーザー・スペースの属性変更をしなくてはなりません)。1〜 16,776,704までです。 初期値は、X'00'がもっともパフォーマンスがいいらしいです。
  • 共通権限。どうせ、QTEMPに作成するので、*ALLにしています。
  • テキスト記述は、通常のテキストです。

実際に作成しているプログラムを見てみましょう。 例)

RPGの場合

      IUSRSPC      DS                                        
      I                                        1  10 USNAME  
      I                                       11  20 USLIB   
      I*                                                     
      I            DS                                        
      I I            0                     B   1   40USSIZE  
      C*                                                    :
      C                     Z-ADD1024      USSIZE           :
      C                     MOVEL'XXXXXX'  USNAME           :
      C                     MOVEL'QTEMP'   USLIB            :
      C*                                                    :
      C                     CALL 'QUSCRTUS'             95  :
      C                     PARM           USRSPC           :
      C                     PARM 'EEEE'    EXTATR 10        :
      C                     PARM           USSIZE           :
      C                     PARM ' '       USINIT  1        :
      C                     PARM '*ALL'    USAUTH 10        :
      C                     PARM           USTEXT 50        :
      C*                                                    :
      C                     MOVE *ON       *INLR            :
      C                     RETRN                           :                

CLPの場合

PGM  
                             /* 12345678901234567890 */   
 DCL &US_SPACE    *CHAR    20  'XXXXXXX   QTEMP     '
 DCL &US_SIZE     *CHAR    4  X'00000000' 
   
 CHGVAR %BIN(&US_SIZE) 1024   
  
 CALL QUSCRTUS +    
   (&US_SPACE 'WRK       ' &US_SIZE ' ' '*ALL' 'WORK USER SPACE')
 
RETURN
ENDPGM                  

マニュアルに出ていた定義方法

CALL QUSCRTUS (&USRSPC  'CHGACTJOB ' X'00000100' ' ' +
             '*ALL      ' 'CHGACTJOB TEMPORARY USER SPACE')                

※このプログラムと、マニュアルのCLPのサンプルは、サイズの指定が違いますよね。 マニュアルでは、バイナリフィールドに16進数を直接書いていたのです。

上の例(x'0100')だと、10進数256のユーザー・スペースを作ろうとしています。16進数100は(FFの次なので)256です。これだと、出来るユーザー・スペースのサイズが分かりづらいので、上記の%BINをお勧めします。これだと10進数で指定するので、わかりやすいと思います。 前は、組み込み関数%BINがなかったのですが、これからは自分もこのやり方にしようと思います。ここで、指定されたユーザー・スペースのサイズが、そのままオブジェクトサイズにあるわけではなく、DMPOBJで作成されるスプールQSRVDMPにある、空間-と出ている部分です。

例えば、

空間 - 000000 40404040 40404040 40404040 40404040 40404040 40404040 40404040 40404040

LINES 000020 TO 0003FF SAME AS ABOVE

と出ていたら、つまり 000000 から 0003FFまですべてX'40'なので1024のスペースがあることになります。(X'3FF'=1023で、0から開始しているので1024バイト) 。面白いことに、サイズを1000にしても1024にしても1024になり、1025にすると1536(1024+512)になりますので、2の累乗の数字を指定したほうがいいでしょう。

ちなみに、QUSCRTUSに手渡すパラメータの初期値をX'00'にすると

空間 - 000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

LINES 000020 TO 0003FF SAME AS ABOVE

となり、スペース X'40'が X'00'になっていることが分かりますね。この方がパフォーマンスが最高になると、マニュアルでいっています。

それからILE RPGでデータ定義仕様フィールドでバイナリを指定する場合注意が必要です。

      D  KKKKKK                 1      4B 0 

      D  XXXXXX                        4B 0  
      D  YYYYYY                        9B 0                

KKKKKKは、4バイトのバイナリであることを、バイト長を指定して、宣言していますよね。これだと、KKKKKKはプログラム内部では、9.0のパックになります。コンパイルリストで確認できます。B(9,0)と出ています。

ところが、XXXXXX は、バイナリ2バイトを意味します。なぜなら、バイナリで数字4桁を表現したいと指定しているからです。また、下のYYYYYYは4バイトのバイナリになります。なぜなら、9桁の数字を扱いたいと指示したからです。この辺を注意しないと、いけません。

開始終了を指定するパターンでは、フィールドのバイト数を直接指定しているので問題が無いのですが、ILEでできる指定方法ではやや頭を使うことになります。

 


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

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

 

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