(入門2)RGP言語(RGP3,RPGLE,FFRPG)とエディタとgitの関係

## <u>■概略</u>
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
IBMiで使われている言語のの種類とエディタの関係、更にgitの関係をまとめました

## <u>■RGP言語の種類とエディタとgitの関係</u>
※RPGにはRPG3、RPGLE、FFRPGの3種類があります  
※これまでIBMi開発でgitはあまり使われていませんが、開発である以上必要だと思います 
　しかしRPG3のソースメンバーはIBMiネイティブ(筆者の造語・IBMiオリジナルの
　ファイルシステムのこと)上にあり直接gitで管理できません  
※RPG言語の種類別に使えるエディタとgit管理の方法をまとめます  

**◯まとめ**  
※RDiはIBM純正の有償の開発環境、VSCodeはMicrosoft製のオープンソースの開発環境
　VSCodeで開発する方法を後の記事でまとめます
 ※SEUは5250で利用可能なエディタ
 ※gitは行単位でテキストの差分を管理できるシステム
 　現在のソースコードはほぼgitで管理されている
<table border="1" style="border-collapse:collapse;width:500px">
<tr bgcolor=silver><th>言語</th><th>FS</th><th>RDi</th><th>VSCode</th><th>SEU</th><th>git</th></tr>
<tr align=center><td>RPG3</td><td>IBMi</td><td>◯</td><td>X</td><td>◯</td><td>△ *1</td></tr>
<tr align=center><td>RPGLE</td><td>IBMi</td><td>◯</td><td>X</td><td>◯</td><td>△ *1</td></tr>
<tr align=center><td>RPGLE</td><td>IFS</td><td>◯</td><td>△ *2</td><td>X</td><td>◯</td></tr>
<tr align=center><td>FFRPG</td><td>IFS</td><td>◯</td><td>◯</td><td>X</td><td>◯</td></tr>
</table>

*1 RDiでIBMiネイティブからPCにimportしてeGit(RDiのgitツール)で操作する  
*2 ソースコードに漢字があると桁がずれる  
 
**◯RPG3**  
　【特徴】IBMi発売当初から利用されている言語で、弊社のシステムのほとんどはRPG3で
　書かれています。みなさんの会社でも同様ではないでしょうか？  

<table border="1" style="border-collapse:collapse;width:500px">
<tr align=center bgcolor=silver><th>項目</th><th>内容</th></tr>
<tr align=center><td>桁位置</td><td>固定</td></tr>
<tr align=center><td>ソース</td><td>IBMiネイティブのメンバー</td></tr>
<tr align=center><td>エディタ</td><td>SEU@5250, RDi ※1</td></tr>
<tr align=center><td>git</td><td>eGitで管理 ※2</td></tr>
<tr align=center><td>表示のみ</td><td>VSCode他 ※3</td></tr>
</table>

※1 SEUは5250上のエディタ。もう更新されない  
　RDiはIBM純正のEclipseベースのエディタ。有償(約15万円/年・1ライセンス)   
※2 RDiでIBMiネイティブファイルからPCにimportしeGit(RDiのgitツール)で操作する  
※3 メンバーファイル個別にIFSにコピーすればVSCodeで表示が可能   

サンプル)  
```
    H*------------------------------------------------------------------*
    H*            売掛明細ﾃﾞｰﾀ :№ ﾌｧｲﾙ作成                        *
    H*------------------------------------------------------------------*
    H            Y/
    FXXUKMLD1IF  E           K        DISK
    FXXDLN   UF  E           K        DISK                      A
    E*
    E                    TB1     1   1 22
    C*------------------------------------------------------------------*
    C*   メイン・ルーチン                                             *
    C*------------------------------------------------------------------*
    C*
    C                     EXSR ¥INIT
    C*
    C                     DO   *HIVAL                     ¬ A
    C                     READ UKMREC                   90
    C                     EXSR ¥CHK0
    C   30                EXSR ¥OUT
    C  N90                END                             ｣ A
    C*
    C                     SETON                     LR
    C                     RETRN
```


**◯RPGLE**  
　【特徴】RPG3からRPGLEへはコマンドで自動変換が可能です
　弊社では新しいプログラムで使用されています  

<table border="1" style="border-collapse:collapse;width:500px">
<tr align=center bgcolor=silver><th>項目</th><th>内容</th></tr>
<tr align=center><td>桁位置</td><td>固定</td></tr>
<tr align=center><td>ソース</td><td>IBMiネイティブのメンバー, IFSのファイル</td></tr>
<tr align=center><td>エディタ</td><td>SEU@5250(IBMiネイティブ)<BR>RDi(IBMiネイティブ,IFS)<BR>VSCode(IFS)</td></tr>
<tr align=center><td>git</td><td>IFSならgitで管理</td></tr>
<tr align=center><td>表示のみ</td><td>-</td></tr>
</table>
  
サンプル)  
```
     H*------------------------------------------------------------------*
     H*            売掛明細ﾃﾞｰﾀ :№ ﾌｧｲﾙ作成                        *
     H*------------------------------------------------------------------*
     H DATEDIT(*YMD/)
     FXXUKMLD1  IF   E           K DISK
     FXXDLN     UF A E           K DISK
     D*
     D TB1             S             22    DIM(1) CTDATA PERRCD(1)
     C*------------------------------------------------------------------*
     C*   メイン・ルーチン                                             *
     C*------------------------------------------------------------------*
     C*
     C                   EXSR      ¥INIT
     C*
     C                   DO        *HIVAL
     C                   READ      UKMREC                                 90
     C                   EXSR      ¥CHK0
     C   30              EXSR      ¥OUT
     C  N90              END
     C*
     C                   SETON                                        LR
     C                   RETURN
```

**◯RPGLEのVSCodeが△の理由(SI/SOの対応ができていない)**  
日本語の入ったVSCode上の表示(コンパイルエラーになる)
![install_developenv_rdi01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/68eec3bc-e54f-5555-047f-be30e7eed7ac.png)
※縦線はRPGLEの桁位置がわかるようにVSCodeの機能で表示している  
　(次の記事で縦線の表示方法を解説します)　  

日本語の入ったVSCode上の表示(コンパイルエラーにならず動作する) 
![install_developenv_rdi02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/429c8b2f-41df-ff29-61c2-5ac12075cd8a.png)
※日本語が左に2桁(シフトイン(SI)/シフトアウト(SO)分)ずれている  

上記をRDi上で表示(RDi外とコピー&ペーストで移動)すると日本語の前後のスペースを正しく処理してくれます
RDiは桁位置がわかるようにルーラーがついている  

**◯FFRPG**  
　【特徴】VSCodeで編集可能でオープンソースエンジニアが読みやすい新しい言語  

<table border="1" style="border-collapse:collapse;width:500px">
<tr align=center bgcolor=silver><th>項目</th><th>内容</th></tr>
<tr align=center><td>桁位置</td><td>自由</td></tr>
<tr align=center><td>ソース</td><td>IFS</td></tr>
<tr align=center><td>エディタ</td><td>RDi,VSCode</td></tr>
<tr align=center><td>git</td><td>IFSならgitで管理</td></tr>
<tr align=center><td>表示のみ</td><td>-</td></tr>
</table>
  
サンプル)  
```
    **free
    ctl-opt datedit(*YMD/) main(main) text('売掛明細データ：№ ファイル作成');

    dcl-proc main;
        //売掛明細データ
        dcl-f XXUKMLD1 disk usage(*input) keyed;
        dcl-ds dsXXUKMLD1 likerec(UKMREC);
        dcl-ds keyXXUKMLD1 likerec(UKMREC:*key);
        //削除№ 管理ファイル
        dcl-f XXDLN disk usage(*input:*output) keyed;
        dcl-ds dsXXDLN likerec(XXLREC);
        dcl-ds keyXXDLN likerec(XXLREC:*key);
        //パラメータ
        dcl-pi *N EXTPGM;
            p#yym packed(6:0); //年月yyyymm
        end-pi;
        //標識
        dcl-s indCheckTarget ind; //*in30
        //システム日付・時刻
        dcl-s curSystemDate date(*jis) inz(*sys);   //システム日付
        dcl-s curSystemTime time(*jis) inz(*sys);   //システム時刻
        //固定値
        dcl-c constFileName const('売掛明細ﾃﾞｰﾀ < 10ﾈﾝ');

        exsr @ini; //初期処理
        keyXXUKMLD1.UKMSYM = p#yym;
        setgt %kds(keyXXUKMLD1:1) XXUKMLD1;
        dou %eof(XXUKMLD1);
            read XXUKMLD1 dsXXUKMLD1;
            if not %EOF;
                indCheckTarget = *off;
                exsr @chk;
                if indCheckTarget = *on;
                    exsr @out;
                endif;
            endif;
        enddo;
        exsr @end; //終了処理
```

### <u>◯結論</u>
 FFRPGならソースはIFS上において、VSCodeで編集(git可)  
 ただしディスプレイファイルはIBMiネイティブ上だし、漢字が含まれるため VSCodeで 編集不可
 FFRPG+VSCodeは外部連携(API)用の開発手法になりそう
 
 RPGLEならソースはIFS上において、ソース内で漢字を使わず、VSCodeで編集(git可) 
 もしかしたら後述のVSCode+Code for IBMiのオブジェクトブラウザでIBMiネイティブ上において編集可能かも(git不可)。漢字コードの問題は未検証
 
 RGP3ならソースはIBMiネイティブにおいて、RDiで編集(git可) または SEUで編集(git不可)  

[【目次】オープンソースエンジニアがIBMi(AS400)を勉強してみた](https://qiita.com/takami_embomajp/items/f6ddf104aaa84bbc6a15)