7.1 での変更点

この節では、7.1 で ILE RPG に対して行われた機能強化について説明します。

データ構造配列のソートと検索

サブフィールドの 1 つをキーとして使用して、データ構造配列のソートと検索を行うことができます。

     // Sort the custDs array by the amount_owing subfield
     SORTA custDs(*).amount_owing;

     // Search for an element in the custDs array where the
     // account_status subfield is "K"
     elem = %LOOKUP("K" : custDs(*).account_status);
配列のソート (昇順または降順)

配列を昇順にソートするには SORTA(A) を、降順にソートするには SORTA(D) を、それぞれ使用します。 順次配列 (ASCEND キーワードまたは DESCEND キーワード) はソートできません。

     // Sort the salary array in descending order
     SORTA(D) salary;
新しい組み込み関数 %SCANRPL (スキャンして置き換え)

%SCANRPL 組み込み関数は、ストリング内に存在する特定の値をすべてスキャンし、その値を別の値で置き換えます。

     // Replace NAME with 'Tom'
     string1 = 'See NAME. See NAME run. Run NAME run.';
     string2 = %ScanRpl('NAME' : 'Tom' : string1);
     // string2 = 'See Tom. See Tom run. Run Tom run.'
%LEN(varying : *MAX)

%LEN 組み込み関数を使用して、可変長の文字フィールド、UCS-2 フィールド、または図形フィールドの最大文字数を確認することができます。

外部記述データ構造での ALIAS 名の使用

定義仕様書で ALIAS キーワードを使用して、外部記述データ構造のサブフィールドに代替名を使用する旨を示すことができます。 ファイル仕様書で ALIAS キーワードを使用して、当該ファイルのレコードで定義された LIKEREC データ構造に代替名を使用する旨を示すことができます。

     A          R CUSTREC
     A            CUSTNM        25A         ALIAS(CUSTOMER_NAME)
     A            CUSTAD        25A         ALIAS(CUSTOMER_ADDRESS)
     A            ID            10P 0

     D custDs        e ds                  ALIAS
     D                                     QUALIFIED EXTNAME(custFile)
      /free
        custDs.customer_name = 'John Smith';
        custDs.customer_address = '123 Mockingbird Lane';
        custDs.id = 12345;
速くなった戻り値

RTNPARM キーワードで定義されたプロシージャーは、戻り値を隠しパラメーターとして処理します。 プロシージャーが非常に大きな値、特に非常に大きな可変値を戻すようにプロトタイプ化されていると、そのプロシージャーを RTNPARM キーワードで定義することにより、そのプロシージャーの呼び出しパフォーマンスを大幅に向上させることができます。

     D getFileData     pr              a   varying len(1000000)
     D                                     rtnparm
     D   file                          a   const varying len(500)
     D data            S               a   varying len(1000)
      /free
         data = getFileData ('/home/mydir/myfile.txt');
%PARMNUM 組み込み関数

%PARMNUM(parameter_name) 組み込み関数は、パラメーター・リスト内における当該パラメーターの順序数を戻します。 プロシージャーが RTNPARM キーワードと一緒にコーディングされているときは、この組み込み関数を使用することが特に重要となります。

     D                 pi
     D   name                       100a   const varying
     D   id                          10i 0 value
     D   errorInfo                         likeds(errs_t)
     D                                     options(*nopass)
      /free
        // Check if the "errorInfo" parameter was passed
        if %parms >= %parmnum(errorInfo);
任意指定のプロトタイプ
プログラムまたはプロシージャーが別の RPG モジュールによって呼び出されない場合は、プロトタイプの指定は任意です。 以下のタイプのプログラムとプロシージャーの場合は、プロトタイプを省略することができます。
  • 出口プログラムまたはコマンドのコマンド処理プログラムとして使用されるようにのみ意図されているプログラム
  • 別のプログラミング言語から呼び出されるようにのみ意図されているプログラム
  • モジュールからエクスポートされないプロシージャー
  • モジュールからエクスポートされるが、別のプログラミング言語から呼び出されるようにのみ意図されているプロシージャー
任意のタイプのストリング・パラメーターの受け渡し
値または読み取り専用参照によって渡されたストリング・パラメーターに対しては、暗黙的な変換が実行されます。 例えば、CONST UCS-2 パラメーターを持つようにプロシージャーをプロトタイプ化することができ、そのプロシージャーの呼び出し時に文字式をパラメーターとして渡すことができます。 これにより、UCS-2 タイプでプロトタイプ化されたパラメーターと戻り値を持つ単一のプロシージャーを作成できるようになります。 このプロシージャーを呼び出すために、任意のタイプのストリング・パラメーターを渡し、戻り値を任意のタイプのストリング変数に割り当てることができます。
     // The makeTitle procedure upper-cases the value
     // and centers it within the provided length
     alphaTitle = makeTitle(alphaValue : 50);
     ucs2Title = makeTitle(ucs2Value : 50);
     dbcsTitle = makeTitle(dbcsValue : 50);
XML-INTO 用の 2 つの新しいオプション
  • datasubf オプションを使用すると、属性も指定された XML 要素のテキスト・データを受け取るサブフィールドを指定することができます。
  • countprefix オプションにより、allowmissing=yes オプションを指定する必要性が減少します。 このオプションは、RPG 配列要素の数を受け取る追加サブフィールドの名前または XML-INTO 命令によって設定される非配列サブフィールドの名前の接頭部を指定します。

これらのオプションは 6.1 用の PTF によっても使用可能となります。

テラスペース記憶域モデル

変更の始まりテラスペース記憶域モデルを使用したり、呼び出し元の記憶域モデルを継承したりする目的で、RPG モジュールや RPG プログラムを作成することができます。 テラスペース記憶域モデルを使用すると、自動記憶域に関するシステムしきい値が単一レベル記憶域モデルの場合と比べて大幅に高くなります。 単一プロシージャーの自動記憶域の量に関する限度と、呼び出しスタック上の全プロシージャーの自動記憶域の合計に関する限度があります。変更の終わり

CRTRPGMOD または CRTBNDRPG コマンドでは記憶域モデル (STGMDL) パラメーターを使用し、制御仕様書では STGMDL キーワードを使用します。
*TERASPACE
プログラムまたはモジュールはテラスペース記憶域モデルを使用します。
*SNGLVL
プログラムまたはモジュールは単一レベル記憶域モデルを使用します。
*INHERIT
プログラムまたはモジュールは呼び出し元の記憶域モデルを継承します。
CRTBNDRPG コマンドの ACTGRP パラメーターと制御仕様書の ACTGRP キーワードの変更

ACTGRP パラメーターと ACTGRP キーワードのデフォルト値が QILE から *STGMDL に変更されました。

ACTGRP(*STGMDL) は、活動化グループがプログラムの記憶域モデルによって決まることを指定します。 記憶域モデルが *TERASPACE のときは、ACTGRP(*STGMDL) と ACTGRP(QILETS) が同じです。 その他の場合は、ACTGRP(*STGMDL) と ACTGRP(QILE) が同じです。

注: ACTGRP パラメーターと ACTGRP キーワードに対する変更は、活動化グループをプログラムに割り当てるデフォルト方法には影響しません。 STGMDL パラメーターと STGMDL キーワードのデフォルト値は *SNGLVL であるため、ACTGRP パラメーターまたはキーワードが指定されていないと、プログラムの活動化グループは以前のリリースの場合と同じようにデフォルトの QILE となります。
テラスペース記憶域の割り振り

制御仕様書で ALLOC キーワードを使用して、モジュール内の RPG 記憶域管理命令がテラスペース記憶域を使用するか単一レベル記憶域を使用するかを指定することができます。 テラスペース記憶域割り振りの最大サイズは、単一レベル記憶域割り振りの最大サイズより大幅に大きくなりました。

暗号化されたリスト・デバッグ・ビュー

モジュールのリスト・デバッグ・ビューが暗号化されていると、デバッグ担当者が暗号鍵を知っているときは、リスト・ビューを表示できるのはデバッグ・セッションの間だけとなります。 このため、お客様がリスト・ビューによってソース・コードを確認できるようにしなくても、お客様にデバッグ可能プログラムを送信することができます。 CRTRPGMOD コマンド、CRTBNDRPG コマンド、または CRTSQLRPGI コマンドで DBGENCKEY パラメーターを使用します。

表 1. 6.1 以降に変更された言語要素
言語単位 要素 説明
制御仕様書キーワード ACTGRP(*STGMDL) *STGMDL は ACTGRP キーワードおよびコマンド・パラメーターの新しいデフォルトです。 プログラムがテラスペース記憶域モジュールを使用している場合は、活動化グループが QILETS となります。 その他の場合は QILE となります。
組み込み関数 %LEN(varying-field : *MAX) これを使用して、可変長フィールドの最大文字数を確認できるようになりました。
命令コード SORTA(A | D) SORTA 命令コードで、配列を昇順 (A) にソートするか降順 (D) にソートするかを示す A 命令拡張および D 命令拡張を使用できるようになりました。
表 2. 6.1 以降の新しい言語要素
言語単位 要素 説明
制御仕様書キーワード STGMDL(*INHERIT | *TERASPACE | *SNGLVL) モジュールまたはプログラムの記憶域モデルを制御します。
ALLOC(*STGMDL | *TERASPACE | *SNGLVL) 記憶域管理命令 %ALLOC、%REALLOC、DEALLOC、
ALLOC、REALLOC の記憶域モデルを制御します。
ファイル仕様書のキーワード ALIAS LIKEREC キーワードで定義されたデータ構造のサブフィールドに代替フィールド名を使用します。
定義仕様書キーワード ALIAS 外部記述データ構造のサブフィールドに代替フィールド名を使用します。
RTNPARM プロシージャーの戻り値を隠しパラメーターとして処理するように指定します。
組み込み関数 %PARMNUM パラメーター・リスト内におけるパラメーターの順序数を戻します。
%SCANRPL ストリング内に存在する特定の値をすべてスキャンし、その値を別の値で置き換えます。
XML-INTO のオプション datasubf 属性も持つ XML 要素のテキスト・データを受け取るサブフィールドに名前を付けます。
countprefix RPG 配列要素の数を受け取る追加サブフィールドの名前または XML-INTO 命令によって設定される非配列サブフィールドの名前の接頭部を指定します。