SETLL (下限の設定)

自由形式構文 SETLL{(EHMR) } 検索引数 名前
コード 演算項目 1 演算項目 2 結果フィールド 標識
SETLL (E) 検索引数 名前 (ファイルまたはレコード様式)   NR ER EQ

SETLL 命令は、ファイルをキーまたは相対レコード番号が検索引数 に指定された検索引数 (キーまたは相対レコード番号) オペランドに等しいかそれより大きい次のレコードに位置付けます。ファイルは全手順ファイルでなければなりません。

検索引数 (検索引数) は、レコードの検索に使用するキーまたは相対レコード番号でなければなりません。 アクセスがキーによる場合には、検索引数 はフィールド名、名前の付いた固定情報、 形象定数、またはリテラルの形式の単一キーにすることができます。キー・フィールドの検索 例については、図 2 を参照してください。

変更の始まりファイルが外部記述ファイルの場合、検索引数 は KLIST 名、値のリスト、または %KDS の形式の複合キーにすることもできます。KLIST を 使用して指定されたキーの場合、キー・フィールドはファイル内のキーと同じ CCSID である必要があります。データ構造内の検索引数の図については、%KDS (データ構造の検索引数)の終わりにある例を参照してください。変更の終わり

アクセスが相対レコード番号による場合には、検索引数 に整数のリテラルまたは小数点以下の桁数がゼロの数値フィールドを入れなければなりません。

名前 オペランドは必須で、ファイル名またはレコード 様式名のいずれかが可能です。レコード様式名を使用できるのは、外部記述ファイルの場合だけです。

結果の標識はこの命令の状況を反映します。 検索引数がファイルの一番大きいキーまたは相対レコード番号より大きい場合にオン に設定される標識を 71 から 72 桁目に指定することができます。 この情報は %FOUND 組み込み関数 からも入手することができます。この関数は、レコードが見付からない場合は '0' を 戻し、レコードが見付かった場合は '1' を戻します。

SETLL 例外 (ファイル状況コードが 1000 より大きい) を 処理するために、命令コード拡張 'E' またはエラー標識 ER を指定できますが、 両方を指定することはできません。 エラー処理の詳細については、ファイル例外/エラーを 参照してください。

そのキーまたは相対レコード番号が検索引数に等しいレコードが存在する場合にオン に設定される標識を 75-76 桁目に指定することができます。この情報は %EQUAL 組み込み関数からも入手することが できます。この関数は、等しい項目が見付かった場合に '1' を戻します。

75 から 76 桁目の標識または %EQUAL を指定して SETLL を使用する場合、指定されたキーとファイル内の実際のキーの比較は通常、データ管理機能により実行されます。 データ管理機能でこれを実行できない場合は、16 進数照合シーケンスを使用して比較が実行されます。 この場合、予想通りの結果が得られないことがあります。 詳しくは、Rational Development Studio for i ILE RPG プログラマーの手引きのセクション『キー付きファイルの使用による予期しない結果』を参照してください。

名前 が下限に設定されているファイル名である場合、ファイルは、指定された検索引数 (検索引数) に等しいかそれより大きいキーまたは相対レコード番号の最初のレコードに位置付けられます。

名前 に下限に設定されているレコード様式名が入っている場合、ファイルは、指定された検索引数 (検索引数) に等しいかそれより大きいキーまたは相対レコード番号の指定されたタイプの最初のレコードに位置付けられます。

変更の始まり特殊値 *START および *END を 検索引数 として指定できます。 *START はファイルの始めに位置指定し、*END はファイルの終わりに位置指定します。どちらの位置付けも、キー付きファイルに使用される照合順序とは関係なく行なわれ、 ヌル値キー・フィールドにも関係なく行われます。検索引数 に *START または *END のいずれかを指定する場合には、次のことに注意してください。
  • ファイルの名前は、名前 オペランドとして指定しなければなりません。
  • エラー標識 (73 から 74 桁目) または 'E' 拡張を 指定することができます。
変更の終わり
変更の始まりファイルの位置付けに形象定数を使用することもできます。 ただし、*LOVAL または *HIVAL を使用してもファイルの先頭または最終レコードに 正確にファイルが位置付けされないシチュエーションがいくつかあります。 ファイル中の先頭または最終レコードに位置付けしたい場合は、*START または *END を 使用するほうが確実です。
注: 以下の形象定数の説明および使用例では、*LOVAL および *HIVAL はファイ ルの実際のキーとしては使用されないものとしています。
変更の終わり
変更の始まり複合キーを持つファイルで使用する場合には、形象定数は、キーのそれぞれ のフィールドに形象定数の値が入っているものとして処理されます。 SETLL で *LOVAL を使用すると、 ヌル可能キー・フィールドのあるレコードがファイルに含まれていない場合は、最初の読み取り操作で 取り出されるのが一番小さいキーを持つレコードになるようにファイルが位置付けられます。 ほとんどの場合 (重複キーを使用できない場合) に、*HIVAL では、ファイルは、READP でファ イルの最後のレコードが検索されるか、または READ でファイルの終わりの指示が 受け取られるように位置付けられます。 しかし、*LOVAL および *HIVAL を使用 する場合には次の事例に注意してください。
  • 変更の始まり降順のキーを持つ外部記述ファイルでは、 *HIVAL は最初の読み取り操作で取り出されるのが最も大きいキーを持つレコードになるようにファイルを位置付け、 *LOVAL は READP 命令で取り出されるのが最も小さいキーを持つレコードになるようにファイルを位置付けます。変更の終わり
  • *LOVAL または *HIVAL のどちらかを用いた SETLL 命令の後でレコードを 追加したりキー・フィールドを変更した場合には、ファイルはもはや最低また は最高のキーに位置付けることができません。
  • 数値キーの *LOVAL はキーの値 ‘99...9D’ を表し、*HIVAL は キーの値 ‘99...9F’ を表します。 キーが浮動数値の場合、*HIVAL と *LOVAL の定義は異なります。 表意定数を参照してください。ファイル仕様書でプログラム記述ファイルにパック 10 進数の指定があって、実 際のファイルのキー・フィールドに文字データが入っている場合には、レコー ドが *LOVAL より小さいかまたは *HIVAL より大きいキーを持つことがありま す。 キー・フィールドに符号のない 2 進数データが入っている場合には、*LOVAL は 最低のキーでないことがあります。
  • *LOVAL または *HIVAL が日付または時刻データ・タイプのキー・フィール ドで使用される場合には、その値は使用される日付時刻の形式によって異なり ます。 これらの値の詳細については、データ・タイプおよびデータ形式を参照してください。
  • 変更の始まりヌル可能キー・フィールドがある場合に *LOVAL や *HIVAL などの形象定数が使用され ると、ヌル値キーを持つレコードは検索で検出されません。変更の終わり
変更の終わり

図 1 に、SETGT 命令 での形象定数の使用法を示します。形象定数は、SETLL 命令で も同様に使用されます。

SETLL 命令を使用する場合には、次のことに留意してください。
  • SETLL 命令が正常に実行されなかった場合 (レコード不在条件) には、 ファイルは、ファイルの終わりに位置付けられます。
  • SETLL で処理されるファイルでファイルの終わりに達した場合には、別の SETLL を出して再度ファイルの位置決めを行うことができます。
  • SETLL 命令でファイルが正常にレコードに位置付けられた後では、このレ コードはファイルを読み取って検索します。 しかし、ファイルを読み取る前に、 レコードが別のジョブまたはユーザー・ジョブの別のファイルによってファ イルから削除されている場合があります。 このような場合には、必要なレコー ドを取り出すことができません。 %EQUAL 組み込み関数もオンに設定されているか、または 75 桁目と 76 桁目の 結果の標識がオンに設定されて、一致するレコードが見付かったことが示されている場合でも、 そのレコードを取り出せないことがあります。 ユーザー・ファイルの予期しない変更 を防止する方法については、IBM® i Information Center (URL http://www.ibm.com/systems/i/infocenter/) 「プログラミング」のトピックを参照してください。
  • SETLL でシステムがデータ・レコードにアクセスすることはありません。キーが実際に存在するかどうかを確認したいだけの場合には、多くの場合に、CHAIN 命令 を使用するよりも等しい標識 (75 から 76 桁目) または %EQUAL 組み込み関数を 指定した SETLL の方がパフォーマンスが向上します。管理レベルでキーの比較を 実行することはできません。 分散したキーを持つ複数形式論理ファイルの ような特殊な場合には、CHAIN の方が SETLL より速い場合もあります。

ヌル値可能フィールドおよびキーを持つレコードの処理については、データベースのヌル値サポートを参照してください。

詳細については、ファイル命令を参照してください。

注: 命令コード拡張 H、M、および R は、検索引数がリストまたは %KDS() である場合にのみ使用できます。

次の例では、ファイル ORDFIL に注文レコードが入っています。 キー・フィールドは注文番号 (ORDER) フィールドです。 それぞれの注文には複数のレコードがあります。 演算仕様書では、ORDFIL は次の ようになっています。

図 1. SETLL 命令
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
 *
 *  ORDFIL の中の 101 のレコードがすべて印刷されます。値 101 は前に
 *  ORDER に入れられています。SETLL 命令では、ファイルはキーの値が
 *  ORDER に入れられています。SETLL 命令では、ファイルはキーの値が
 *  %EQUAL が ’1’ を戻します。
C
C     ORDER         SETLL     ORDFIL
C
 *  次の DO ループでは、同じキーの値を持つすべてのレコードが処理
 *  されます。
C
C                   IF        %EQUAL
C                   DOU       %EOF
C     ORDER         READE     ORDFIL
C                   IF        NOT %EOF
C                   EXCEPT    DETAIL
C                   ENDIF
C                   ENDDO
C                   ENDIF
C
 *  READE 命令は、最初の 101 レコードを読み取ったのと同じ方法で
 *  2 番目、3 番目、4 番目の 101 レコードを読み取ります。
 *  4 番目の 101 レコードが読み取られた後で READE 命令が実行されます。
 *  102 レコードは同じグループのものでないために
 *  %EOF が ’1’ を戻し、EXCEPT 命令が回避され、
 *  DOU ループが終了します。
READE 命令