VSCode初心者の5250画面ユーザーが、RPGプログラムのソースファイルをIFSへPush、そしてコンパイルまでVSCodeでしてみました!
当記事ではその実際の手順はもちろん、コンパイルまでの過程でぶつかったトラブルやその解決方法も一緒に記載します。これからVSCodeでRPGを扱ってみようと思う方、VSCodeでIFSへのPushやコンパイルを行おうとして上手くいかない方の参考になれば嬉しいです!
0. 前提
今回は以下の環境・設定を使用しました。また、接続先IBM iはOSのバージョンがそれぞれ異なる日本語環境と英語環境の2パターンを試してみました。実際の手順を行う前に、必要に応じて確認や変更をしてください。
- 環境①【英語環境】
項目 | 設定値 |
---|---|
IBM i バージョン | V7.5 |
Primary Language | 2924 (English) |
QCCSID | 65535 |
QLANGID | ENU (US English) |
ユーザーのCCSID | *SYSVAL |
ユーザーのLANGID | *SYSVAL |
- 環境②【日本語環境】
項目 | 設定値 |
---|---|
IBM i バージョン | V7.3 |
Primary Language | 2962 (Japanese Kanji) |
QCCSID | 65535 |
QLANGID | JPN (Japanese Katakana) |
ユーザーのCCSID | 5035 (Japan English/Kanji (extended)) |
ユーザーのLANGID | *SYSVAL |
QCCSIDが65535、ユーザーのCCSIDが*SYSVAL
でVSCodeからIBM iへログインできない場合、ユーザーレベルでCCSIDを指定する必要があります。
1. IFSへソースファイルをPush
まずはVSCodeにてPC上のファイルをIFSにPushしていきます。
1-1. 【初期設定】IFSにソースファイル用のフォルダー作成
ログインユーザーでIFSにソースファイルを配置するためのフォルダーを作成します。
- 5250画面にて以下のコマンドを実行。
MKDIR DIR('/home/<ユーザー名>')
MKDIR DIR('/home/<ユーザー名>/<任意のフォルダー名>')
1-2. 【初期設定】PCのソースファイルをIFSにPushするためのSFTP設定
PCのソースファイルをIFSにPushするにはSFTPを使用します。そのため、VSCodeでSFTPを使用するためのセットアップを行います。
-
sftp.jasonの設定を以下のように更新し保存する。
-
password
を追加しておくことで、ログイン時のパスワード入力を省略できる -
uploadOnSave
をtrueにするとファイルを保存した場合に自動的にPushされる。falseの場合は手動でPushが必要。(方法は後述)
-
{
"name": "<任意で指定>",
"host": "<IPまたはホスト名を指定>",
"protocol": "sftp",
"port": 22,
"username": "<ユーザー名>",
"password": "<パスワード>",
"remotePath": "/home/<ユーザー名>/<<作成したフォルダー名>",
"uploadOnSave": true
}
1-3. 【初期設定】VSCodeとIBM i との接続設定
設定項目 | 設定内容 |
---|---|
Connection Name | 任意の接続先名 |
Host or IP Address | 接続先の区画のIPまたはHost名 |
Port (SSH) | 接続時使用ポート(特に指定がなければ22のままでOK) |
Username | ログインユーザー名 |
Password | ログインユーザーのパスワード |
1-4. VSCodeをIBM i へ接続
1-5. サンプルコードの作成とIFSへのPush
ここでは実際にVSCodeでサンプルコードを作成とIFSへのPushを行ってみます。
-
ここでは例として「Hello World!」の文字を表示するプログラムのソース
HELLOWORLD.rpgle
を作成する。
**free
ctl-opt dftactgrp(*no) main(main);
dcl-proc main;
dcl-s msg varchar(20);
msg = 'Hello World!';
dsply msg;
return ;
end-proc;
2. IFSのソースをコンパイル
2-1. 【初期設定】コンパイルリストの設定
5250画面でコンパイルを行った際にはコンパイルリストが出力されますが、VSCodeで行った際も同様に出力するよう設定が可能です。また、当項目で登場する設定画面では他にも様々なカスタマイズができるので、お好みに合わせて変更することをお勧めします。
2-2. 【初期設定】コンパイルコマンドの設定
5250画面の場合と同様に、VSCodeでもコンパイル時にはCRTBNDRPG
コマンドを使用しますが、ここではそのコマンドのデフォルト値を設定します。VSCodeでコンパイルする際はここで設定したデフォルト値を用いてコンパイルコマンドが実行されますが、適切な設定を行わないとOSのバージョンによってはエラーが起きるため注意です。
-
Work with Actions
のタブからCreate Bound RPG Program (CRTBNDRPG) with inputs
を選択。
-
Command(s) to run
にて設定されているデフォルト値を確認。ここの値をOSのバージョンによって以下のように変更しSave
を押下。
-
V7.3以前:パラメーター
TGTCCCSID(*JOB)
を削除
OSのバージョンがV7.3までの場合、CRTBNDRPG
コマンドにTGTCCSID
パラメーターが存在しないため、削除しないとエラーになる。
-
V7.4以降:【日本語環境の場合】 パラメーター
TGTCCCSID(*JOB)
をTGTCCCSID(5035)
に変更
VSCodeからIFSにPushしたソースをコンパイルするため、日本語環境ではTGTCCSID
の設定変更が必要。※英語環境の場合はデフォルト値のTGTCCSID(*JOB)
のままでOK。
参考:https://www.imagazine.co.jp/code-for-ibm-i-j-part4/
-
なお、コンパイル時に使用されるCCSIDのルールを以下に記載します。少しややこしいので、興味があれば見てみてください。
なお5250画面ではDSPJOBコマンドにて、2. Display job definition attributes
より確認できます。
コンパイル時のCCSID決定方法
- CRTBNDRPGコマンドのTGTCCSIDを参照する
1. 1-65534のCCSIDが指定されている場合はそのCCSIDを使用する。
2.*JOB
の場合はJobのCCSIDを参照する。(2番へ)
※パラメーターTGTCCSIDが存在しない場合も2番へ
- JobのCCSIDを参照する
JobのCCSIDは、CCSID, LANGIDを以下の手順で参照することで決定する。
A. CCSID
i. ユーザーのCCSIDを参照する
JobのCCSIDはユーザーのCCSIDを参照して決定する。
1. 1-65534のCCSIDが指定されている場合はそのCCSIDを使用する。
2.*SYSVAL
の場合はシステム値のQCCSIDを参照する。(A-iiへ)
ii. システム値のQCCSIDを参照する
ユーザーのCCSIDが*SYSVAL
の場合、システム値のQCCSIDを参照して決定する。
1. 1-65534のCCSIDが指定されている場合はそのCCSIDを使用する。
2. 65535の場合はLANGIDを参照する。(Bへ)
B. LANGID
i. ユーザーのLANGIDを参照する
JobのLANGIDはユーザーのLANGIDを参照する。
1. LANGIDが指定されている場合はそのLANGIDを使用する。
2.*SYSVAL
の場合はシステム値のQLANGIDを参照する。(B-iiへ)
ii. システム値のQLANGIDを参照する
ユーザーのLANGIDが*SYSVAL
の場合、システム値のQLANGIDを参照する。
1. LANGIDに対応するデフォルトのCCSIDが使用される。(一覧はこちら)
なお、上記決定手順では細部を省略して記載しているので、詳細は以下をご参照ください。
https://www.ibm.com/docs/ja/i/7.5?topic=ssw_ibm_i_75/cl/crtbndrpg.html
例:筆者の場合
①英語環境
参照項目 | 設定値 | 参照結果 |
---|---|---|
TGTCCSID | *JOB |
*JOB なのでJOBのCCSID参照(ユーザーのCCSIDから順番に参照) |
ユーザーのCCSID | *SYSVAL |
*SYSVAL なのでQCCSID参照 |
QCCSID | 65535 | 65535なのでユーザーのLANGID参照 |
ユーザーのLANGID | *SYSVAL |
*SYSVAL なのでQLANID参照 |
QLANGID | ENU (US English) | ENUに対応する37が使用される |
②日本語環境
参照項目 | 設定値 | 参照結果 |
---|---|---|
TGTCCSID | 5035 | 5035が使用される |
ユーザーのCCSID | 5035 (Japan English/Kanji (extended)) | --- |
QCCSID | 65535 | --- |
ユーザーのLANGID | *SYSVAL |
--- |
QLANGID | JPN (Japanese Katakana) | --- |
2-3. ライブラリリストの編集
コンパイルの前に、必要に応じてライブラリを追加します。ここでは例としてライブラリJGLIB
を追加します。
-
USER LIBRARY LIST
の+ (Add to library list)
を押下。
- ライブラリ名を入力して
Enter
を押下。
- 入力したライブラリが追加された。順番は
↓(Move Down)
↑(Move Up)
で調整可能。
2-4. コンパイル
IFSのファイルを参照してプログラムをコンパイルします。
2-5. プログラムの稼働確認
念のため先ほど作ったプログラムが正しく動くかを確認します。(例で作ったプログラムは「Hello World!」を表示するだけの簡単なものですが、、、)
正しく稼働しました!これでコンパイルは完了です!
3. トラブルシューティング
ここでは筆者が実際にぶつかったトラブルをご紹介します。
3-1. IBM iに接続できない(クレデンシャル)
以下のようにクレデンシャルを確認するようエラーポップアップが表示されました。筆者の場合は以下の方法で問題を解決できました。
【解決方法】
-
ログイン情報の確認
接続先を右クリックしLogin Settings
を押下。ログインユーザーのIDやパスワードが正しいか確認します。
-
ログインユーザーのパスワードが失効していないか確認
VSCode用に作成して普段使用しないユーザーの場合、見落としているかもしれません。パスワードが失効している場合は再度登録してみてください。ユーザープロファイルよりユーザーのPWDEXPITV (Password Expiration Interval)を*NOMAX
にしておくことで、当問題は予防できます。
3-2. IBM iに接続できない(CCSID)
日本語環境で発生した問題です。以下のようにCCSIDが正しくないというエラーポップアップが表示されました。
【解決方法】
- ログインユーザーのCCSIDを確認
前提でも書きましたが、QCCSIDが65535、ユーザーのCCSIDが*SYSVALの場合、上記のようなエラーが出る場合があります。エラーが出た場合はログインユーザーのCCSIDを明示的に指定してみてください。
※変更後は画面下部のボタンで一度ネットワークを切断し、再度接続する必要があります
3-3. コンパイルが通らない
コンパイルに失敗した場合、以下のようなエラーポップアップが表示されます。
【解決方法】
-
ソースを確認
これは5250画面でも同じことですが、まずはコンパイルを試みたプログラムのソースを確認しましょう。ポップアップのOpen output
を押下することでコンパイルリストを表示できます。
上記の通り、Severity 30の問題があることが分かります。なお、VSCodeはコンパイル後、問題がある箇所を教えてくれます。これは便利!
-
ユーザーのCCSIDを確認
前述の通りユーザーのCCSIDを正しく設定していない場合、エラーになる可能性があります。 -
ソースファイルのCCSIDを確認
WRKLNKコマンドにて対象のファイルを選択し、8=Display Attribute
を実行
CCSIDが1208であることを確認。異なる場合は13=Change attribute
にてCCSIDを変更。
-
コンパイルのコマンドを確認
TGTCCSID, 改行
前述の通り、バージョン7.3以前でTGTCCSIDがコマンドに含まれているとエラーになってしまいます。また、コマンドに改行が含まれていると、Code for IBM iではそれ以降のステートメントが認識されなくなってしまうようなので注意です(筆者はそれでめちゃくちゃ時間を溶かしました、、、)
3-4. その他拡張機能の不具合
設定は何度確認しても正しいはずなのに、なぜか上手くいかない、、、
そんなときは拡張機能のバグの可能性もあるので、別バージョンのインストールを試してみましょう。
ちなみに筆者は以下のように接続はできているがIFSだけ表示されないバグが起こりました。
- 拡張機能の他バージョンをインストールする
左メニューバーの拡張機能よりCode for IBM iを選択し、アンインストール
の右の∨
を押下し特定のバージョンをインストール
を選択。
インストールするバージョンを選択する。
再起動をしてバージョン変更完了。
最後に
VSCodeにてIFSへRPGのソースファイルをPushし、IFSのソースをコンパイルするまでの手順は以上となります。全手順がVSCode上で完結するのがとても便利ですね。
筆者はまだできていませんが、GitHubなどと組み合わせることでIBM iのソース管理はさらに便利になるのではないかと考えています!
最後までお付き合いいただきありがとうございました!
参考記事
https://qiita.com/KOINULIB/items/b7259d93ec772effdef7
https://qiita.com/KOINULIB/items/21c4940059b43b0e5e9d
https://qiita.com/RiSING_alpha-team/items/1254437673699179580c
https://qiita.com/RiSING_alpha-team/items/7b5c910c6df111a53ace
https://www.imagazine.co.jp/feat-visual-studio-code-part3/