13.1.6 引用符および引用文字列

LANSAは IBM I オペレーティング・システムのコマンド定義やプロンプト機能を使用します。したがって、RDMLコマンドでは関連するパラメータに「引用文字列」を指定しなければならない場合があります。

埋め込みブランクを含むコマンド・パラメータ

例えば、#COUNTフィールドに1を加算する場合、正しい形式は以下のようになります。

          CHANGE    FIELD(#COUNT) TO('#COUNT + 1')

    または    CHANGE    #COUNT  '#COUNT + 1'

    または    CHANGE    #COUNT  ('#COUNT + 1')

    または    CHANGE    #COUNT  '(#COUNT + 1)'

 

ただし、次の形式は使えません   CHANGE    #COUNT  (#COUNT + 1)

 

これは、コマンド・パラメータに埋め込みブランクがある場合、IBM I のコマンド機能では、コマンド・パラメータを引用符で囲む必要があるためです。この場合、"#COUNT + 1"文字列には明らかに埋め込みブランクが含まれています。したがって、引用符で囲む必要があります(つまり「引用」文字列にします)。

引用文字列内の引用符

LANSAがコマンドを処理する時、オペレーティング・システムは、引用符の間のコマンドの部分だけ(引用符自体は含まず)をLANSAに渡します。

「引用」文字列の中で引用符を使う必要がある場合は、さらに複雑な状況になります。通常、IFやCASE条件をコーディングする時に、このような状況が起こります。

引用文字列の中で引用符を使うときのルールは、引用符を1つだけではなく引用符を2つ使用することで。

 

例えば、#FIELDに小文字の"a"があるかどうかをチェックする場合、次のようにコーディングする必要があります。

IF '#FIELD = ''a'''

 

IBM i コマンド・プロセッサは、このIF条件に関連した式を、実際には以下のようにしてLANSAに渡します。

#FIELD = 'a'

 

これは、オペレーティング・システムが外側の引用符を渡さず、さらに文字列内に引用符を2つ使用しているものがあれば、1つだけの引用符に置き換えるためです。

引用符に関する簡単なガイドライン

次の2つの簡単なガイドラインに従えば、LANSA内で引用符をさらに容易に処理することができます。

1.  引用文字列の中の引用符は、絶対に必要な場合にだけ使用します。

2.  複雑な引用文字列の入力には、形式化されたプロンプト機能を使用します。

1番目のポイントに関して、LANSAでは英数字リテラルを引用符で囲む必要はありません。引用符で囲まれていない英数字リテラルは大文字に変換されるため、次の例はすべて同じ条件を表します。

IF '#FIELD = A' 

IF '#FIELD = a' 

IF '#FIELD = ''A'''

 

小文字を検査する必要がある場合にだけ、英数字リテラルの両端に引用符を使用します例えば、#FIELDで小文字の"a"を検査するには次のようにします。

IF '#FIELD = ''a'''

 

さらに、2番目のポイントに関して、形式化されたプロンプト機能を使えば、必要な外側の引用符が自動的に挿入されるのがわかります。例えば、IFコマンドのプロンプトを使用して、次のように条件を入力するとします。

#FIELD = A

 

このとき、プロンプトは、この条件が有効な「引用」文字列となるように、自動で条件を再フォーマットします。

最終的にプロンプトは以下のようなコマンドを作成します。

IF COND('#FIELD = A')

 

式で引用符を使う必要がある場合も同じです。例えば、プロンプトを使用して次の条件を指定するとします。

#FIELD = 'a'

 

この時、プロンプトはコマンドを自動で再フォーマットして、内部外部に必要な引用記号を挿入します。プロンプトは以下のようなコマンドを作成します。

IF COND('#FIELD = ''a''')

 

パラメータ値としての引用文字列

RDMLのCALLコマンドでは、引用文字列をパラメータ値として使用する場合に注意が必要です。引用文字列は3重引用符で囲む必要があります。例えば、 'ABC'をパラメータ値として使用するには、'''ABC'''と入力します。

CALLが含まれるファンクションをコンパイルする時に、RPGジェネレータは、文字列の長さ(一重引用符を含む)を使用してパラメータ・フィールドを作成します。例えば、プログラムAには2個の英字パラメータがあり、それぞれ5文字の長さとします。そしてファンクションBの中で次のようにこれを呼び出します。

CALL PGM(A) PARM('ABC' '''ABC''')

 

ジェネレータは、呼び出しに3文字のパラメータ(ABC)と5文字のパラメータ('ABC')を作成します。ファンクションBが実行されると、プログラム A内では1番目のパラメータの4桁目と5桁目の文字にゴミが入れられるため、プログラムAはエラーで終了する場合があります。

最初の文字が数値のように見えるときの三重引用符

詳細については、「CHANGE についてのコメント/警告」を参照してください。

Ý 13.1 RDMLコマンドのパラメータ