020-050 ＦＦで許可されていない記述集１

## 本記事の内容とサンプルコード

これまでの投稿記事においても言及してきたが、自由形式（Free Form） `RPG` において、固定形式では使用可能だった幾つかの記述は使用不可となっている。ここでは、幾つかの代表的なものを取り上げる。
固定形式でよく利用され、自由形式では許可れない記述は次のリンクより参照可能。

- [ＦＦで許可されていない記述集１（ＦＦ - /QEOLFF/QRPGLESRC/@USHIDAY11.RPGLE](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QRPGLESRC/%40USHIDAY11.RPGLE)

## 前提条件

以下のリンクより、本コンテンツの **FF-RPG** サンプルコードを閲覧、実行する環境を整備する

- [010-前提条件／環境構築](https://qiita.com/ibm_knowledge_mall/items/0536889104b90990e074)

## 参考リンク

以下、リンクは OS バージョンが **V7R5** のリンク先となっているが、サイト左の **「バージョンの変更」** より、自身の環境に合ったバージョンへ変更可能。

- [IBM i - ILE RPG 解説書(V7R5)](https://www.ibm.com/docs/ja/i/7.5?topic=rpg-ile-reference)

## 1. 演算系

幾つかの演算命令は自由形式では許可されていないため、別の記述に置き換える必要がある。

- Z-ADD,ADD（加算系）
- Z-SUB,SUB（減算系）

■ＦＦで許可されない（演算命令
```RPGLE:@USHIDAY11.RPGLE
//   C***************************
//   C*加算
//   C***************************
//   C                   ADD       1             W#ZONE1
//   C*
           W#ZONE1 += 1                                          ;
～～～中略～～～
//   C***************************
//   C*減算
//   C***************************
//   C                   SUB       1             W#ZONE1
//   C*
           W#ZONE1 -= 1                                          ;
～～～中略～～～
//   C***************************
//   C*ゼロにして加算／減算
//   C***************************
//   C                   Z-ADD     *ZERO         W#ZONE1
//   C                   Z-SUB     *ZERO         W#ZONE1
//   C*
           W#ZONE1 = *ZERO                                       ;

```

## 2. 制御系

幾つかの制御系命令は自由形式では許可されていないため、別の記述に置き換える必要がある。

- GOTO ～ TAG（指定タグへジャンプ）
- CABxx ～ TAG（条件が真のとき指定タグへジャンプ）

■ＦＦで許可されない（制御
```RPGLE:@USHIDAY11.RPGLE
//   C***************************
//   C*比較＆分岐
//   C***************************
//   C     1             CABEQ     1             #CAB_1
//   C     #CAB_1        TAG
//   C*
           DOW #ON = #ON                                         ;
             IF 1 = 1                                              ;
               LEAVE                                                 ;
               //ITER                                                  ;
             ENDIF                                                 ;
           ENDDO                                                 ;
～～～中略～～～
//   C***************************
//   C*ＧＯＴＯ（スキップ
//   C***************************
//   C                   GOTO      #GOTO_1
//   C     #GOTO_1       TAG
//   C*
           DOW #ON = #ON                                         ;
             LEAVE                                                 ;
             //ITER                                                  ;
           ENDDO                                                 ;

```

## 3. 比較演算子

固定形式で使用出来た比較演算子（`IFxx`など）は自由形式では許可されていないため、別の記述に置き換える必要がある。

- EQ「=」（等しい）
- NE「<>」（等しくない）
- GT「>」（より大きい）
- GE「>=」（以上）
- LT「<」（より小さい）
- LE「<=」（以下）

■ＦＦで許可されない（比較演算子
```RPGLE:@USHIDAY11.RPGLE
//   C***************************
//   C*ＩＦｘｘ等
//   C***************************
//   C     1             IFEQ      1
//   C     1             ANDEQ     1
//   C     2             OREQ      2
//   C     3             ANDEQ     3
//   C                   ENDIF
//   C*
           IF     1 = 1
              AND 1 = 1
              OR  2 = 2
              AND 3 = 3                                          ;
           ENDIF                                                 ;
```

## 4. 組み込み関数への置き換え

また幾つかの命令は自由形式では許可されておらず、別の組み込み関数（%～で始まる）に置き換える必要がある。

- LOOKUP（配列の値探査）
- MVR（剰余の取得）
  
■ＦＦで許可されない（組み込み関数への代替
```RPGLE:@USHIDAY11.RPGLE
//   C***************************
//   C*配列探査
//   C***************************
//   C                   Z-ADD     1             W#IX1
//   C     '1'           LOOKUP    W#ARY1(W#IX1)                          01
//   C*
           W#IX1 = %LOOKUP('1' : W#ARY1 : 1)                     ;
～～～中略～～～

//   C***************************
//   C*剰余
//   C***************************
//   C     100           DIV       3             W#ZONE1
//   C                   MVR                     W#ZONE2
//   C*
           W#ZONE2 = %REM(100 : 3)                               ;
```

## 終わりに

[ＦＦで許可されていない記述集１（ＦＦ - /QEOLFF/QRPGLESRC/@USHIDAY11.RPGLE](https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples/blob/main/QRPGLESRC/%40USHIDAY11.RPGLE) から代表的な幾つかを抜粋したが、RPGの解説書には、さらに利用頻度の低いものまで含めて全て掲載されているので、参照しておくと良い。

## 編集履歴

- 作成日：IBMCJ-2023-C06 (CSC)Y.USHIDA 2023.08.29 18:30 [新規投稿]
- 更新日：IBMCJ-2023-C06 (___)_.______ 20__.__.__ __:__ []

## 資料に関する注意書き

本資料の著作権は、日本アイ・ビー・エム株式会社（IBM Corporationを含み、以下、IBMといいます。）に帰属します。
ワークショップ、セッション、および資料は、IBMまたはセッション発表者によって準備され、それぞれ独自の見解を反映したものです。それらは情報提供の目的のみで提供されており、いかなる参加者に対しても法律的またはその他の指導や助言を意図したものではなく、またそのような結果を生むものでもありません。本資料に含まれている情報については、完全性と正確性を期するよう努力しましたが、「現状のまま」提供され、明示または暗示にかかわらずいかなる保証も伴わないものとします。本資料またはその他の資料の使用によって、あるいはその他の関連によって、いかなる損害が生じた場合も、IBMまたはセッション発表者は責任を負わないものとします。 本資料に含まれている内容は、IBMまたはそのサプライヤーやライセンス交付者からいかなる保証または表明を引きだすことを意図したものでも、IBMソフトウェアの使用を規定する適用ライセンス契約の条項を変更することを意図したものでもなく、またそのような結果を生むものでもありません。

本資料でIBM製品、プログラム、またはサービスに言及していても、IBMが営業活動を行っているすべての国でそれらが使用可能であることを暗示するものではありません。本資料で言及している製品リリース日付や製品機能は、市場機会またはその他の要因に基づいてIBM独自の決定権をもっていつでも変更できるものとし、いかなる方法においても将来の製品または機能が使用可能になると確約することを意図したものではありません。本資料に含まれている内容は、参加者が開始する活動によって特定の販売、売上高の向上、またはその他の結果が生じると述べる、または暗示することを意図したものでも、またそのような結果を生むものでもありません。 パフォーマンスは、管理された環境において標準的なIBMベンチマークを使用した測定と予測に基づいています。ユーザーが経験する実際のスループットやパフォーマンスは、ユーザーのジョブ・ストリームにおけるマルチプログラミングの量、入出力構成、ストレージ構成、および処理されるワークロードなどの考慮事項を含む、数多くの要因に応じて変化します。したがって、個々のユーザーがここで述べられているものと同様の結果を得られると確約するものではありません。

記述されているすべてのお客様事例は、それらのお客様がどのようにIBM製品を使用したか、またそれらのお客様が達成した結果の実例として示されたものです。実際の環境コストおよびパフォーマンス特性は、お客様ごとに異なる場合があります。

IBM、IBM ロゴは、米国やその他の国におけるInternational Business Machines Corporationの商標または登録商標です。他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。現時点での IBM の商標リストについては、ibm.com/trademarkをご覧ください。