NEWS
IBM i 技術解説 IBM i 技術解説
2024.11.22
SHARE
  • twitter
  • facebook
  • hatena

【IBM Power Salon】株式会社 電業 様が語る
「根っからのエンジニアが語る IBM i 内製化のリアル」実践編
~サンプルプログラムの流れ(見易くする仕組み及び事前作業)

【IBM Power Salon】株式会社 電業 様が語る<br /> 「根っからのエンジニアが語る IBM i 内製化のリアル」実践編<br />~サンプルプログラムの流れ(見易くする仕組み及び事前作業)
【IBM Power Salon】株式会社 電業 様が語る<br /> 「根っからのエンジニアが語る IBM i 内製化のリアル」実践編<br /> ~サンプルプログラムの流れ(見易くする仕組み及び事前作業)

日本アイ・ビー・エム株式会社が毎月開催しているIBM Powerユーザーのための自由な語り場「IBM Power Salon」(月1回、第二水曜日の朝9時から開催)をご存じでしょうか?
https://www.ibm.com/blogs/systems/jp-ja/ibm-power-salon/

2023年1月11日に開催された第14回の、株式会社 電業様による「惜しみなく共有しちゃいます、根っからのエンジニアが語る、IBM i 内製化のリアル。」では、既存IBM i環境を見事に活用し、自作でIBM i と自動倉庫をつなげDXを実現された素晴らしい事例が披露されました。
https://video.ibm.com/recorded/132452956

とはいえ、1時間の講演時間では語りきれなかった詳細は、きっと他のIBM i ユーザーの方にも参考になるはず!ということで、株式会社電業 総務部 竹本伸明様に“内製DX”について具体的にご説明いただきます。読めばきっと、「IBM i でここまでできるんだ!」と目から鱗が落ちるはずです!

サンプルプログラムはこちらから!

3回目では、生成するEXCELファイルを見やすくする仕組みを説明します。
ソース・プログラムは当連載第1回でご案内したサンプル・ライブラリーに格納してありますので、全容はそちらでご確認ください。

PCOMMやACSでもEXCELにデータ変換可能ですが下記の理由により変換されたデータは見易くありません。

  • 数字がカンマ編集されていない。
  • カラム数が多いデータだと行を見分けにくい。
  • 日付(IBMiでは日付を数字フィールドにしている事が多い)は、数字だけでは見にくい。
  • 企業によっては、番号を特殊な編集表示を使用している
    (弊社では、9桁の数字は頭3桁―後ろ6桁と表示しています)
  • 変換された列幅では、データの一部が隠れる。
  • データを欲しい人により列の並びを変えたい・不必要な列がある。

弊社ではテータ変換後にEXCELで表示形式を設定・列幅設定・列並び変更・1行毎に色分けするためにテーブル設定するなどを行っていました。
これらをデータ要求される度に行うのはベターではない(面倒)と思い自動化できないかと考えました。
上記のEXCELに設定する表示編集情報を別ファイル出力する事にしました。このファイルがDEFファイルです。
DEFファイルはXML形式ファイルです。XMLファイルを採用した理由は、データを抽出するのは面倒ですが拡張性に優れ可読性が高いためです。
またXML整形ツールやDTDを作成する事でデータの検証が行える点もあります。サンプルではDTDを作成していません。

(コラム)
今回XMLを採用した理由は、CSVはセパレータ文字や制御文字のエスケープ処理はローカル・ルールが多く明確に規定されていないからです。
また最近ではJSONフォーマットを好まれる人もいますが、JSONは可読性が低く構文に誤りがあった時に見つけにくい問題があります。

1. セル表示形式設定の仕組み

前述した通り、通常データ以外にEXCELの表示編集情報を持つのがDEFファイルです。
表示編集情報は(異なるデータをEXCEL化する時)再利用するものが多く、共通利用可能な形で情報を持つ必要があります。
また通常データ出力のヘッダー情報や出力するカラム情報(出力順序)も持つ必要があります。これらは2つのファイル情報で実現します。

上記の2つの情報からDEFファイルを生成します。
尚サンプルで用意しているファイルのデータ保守プログラムは用意していません。UPDDTAコマンド(DFU)でデータ保守して下さい。

1.1. 表示編集情報(CSVEDT)

このファイルはEXCELの表示形式を設定するのに使用する共通情報です。

① CSVEDTのDDSソース (主要なフィールドのみ記載)

CSVEDTの登録データ

上記の登録データは弊社で使用しているものです。企業により使用する編集方法は異なると思います。
登録データ画面の編集方法はEXCELにセットする情報です。(セルの書式設定→表示形式→ユーザー定義にセットする情報)

1.2. フィールド選択ファイル(CSVCOL, CSVCOLL1)

このファイルはCSVファイルのカラムヘッダー及びカラムの出力順序とEXCELの表示編集方法を持ちます。
選択IDは出力するデータの種類で設定します。

①CSVCOL物理ファイルのDDSソース

②CSVCOLL1 論理ファイルのDDSソース

論理ファイルのキーは選択IDの次に表示順序をキーとしています(並び替え)。これにより表示順序で出力するフィールドが取得できます。
ユーザー毎に異なるフィールドや異なるフィールドの並びを設定したい場合はこのファイルを拡張する事で実装できます。
※上記の内容は企業によって内容が異なるかと思いますのでサンプルでは実装していません。

※サンプルプログラムでセットされているデータは下記画面になります。

1.3. 生成されたDEFファイル

下記が生成されたサンプルのDEFファイルです。(※ピボット集計・グラフ描画の記述を除いたもの)
このファイルをpythonスクリプトで読込み.xlsxファイルにOpenpyxlライブラリーで設定します。

設定時は、xmlのcolNo属性で指定されるEXCELのカラム位置で表示形式を設定します。

2. XML文字エスケープ処理(UTLXMLESC)

DEFファイルはXML形式です。当然XMLで使用する文字がデータに含まれる場合は文字の置換処理が必要です。
このプログラムはRPGⅢからCVTRPGSRCコマンドでILERPGに変換したものです。
本来テーブルを使用せずDSで定義するほうが分かり易くなりますが、時間の関係でリメイクはしていません。

【変換テーブル】

【UTLXMLESCを呼び出す処理】
XML文字エスケープはILERPGからは左記の様にCALLで呼び出します。
W_INTXTに変換する文字列をセット
W_OTTXTに変換された文字が返されます。

3. 3 CSV文字エスケープ処理(UTLCSVESC)

CSVファイルを使用する時、文字列であればダブルクォート(“”)で囲みます。サンプルプログラムSAMPLE01CSも行っています。今回のサンプルではデータにダブルクォートが存在する事を想定していません。本来文字列をダブルクォートで囲む時に、データにあるダブルクォート文字のエスケープ処理が必要です。(※このエスケープ処理方法はソフトによって異なるケースがありますので注意して下さい。)
データ中にダブルクォート文字が存在した場合は、ダブルクォート文字の前にエスケープ文字を挿入するソフトを作成しています。
この処理はpythonで使用しているCSVファイルを読込むpandasライブラリーでダブルクォート文字をエスケープする文字に合わせています。
エスケープする文字はパラメータで渡していますので、変更する場合はパラメータに渡す値を変更して下さい。漢字文字(X’0E’とX’0F’に囲まれた文字列)は変換しません。必要に応じてCLやILERPGで使用して下さい。変換後の最大文字列長は228バイトです。CLで使用する場合はコマンドを作成しています。

【変換前】AAA”BB”

【変換後】AAA””BB””

【使用方法】

No. パラメータ 入力/出力 補足
1 PX_CHR 入力 ブランクの時、ダブルクォート文字に設定される
2 PX_ESC 入力 ブランクの時、ダブルクォート文字に設定される
3 PX_IN 入力 変換する文字列 最大228文字
4 PX_OT 出力 変換した文字列 最大228文字

【使用するソース】

4. パラメータ取得処理

4.1. パラメータ取得
(EXCEL以外:UTLGETPRM、EXCEL用:UTLGETEXCL)

英小文字の5026>-<5035間のコード変換問題を避けるため、パラメータ関連はファイルに保存する事にしています。
この手法であれば、DBには必ずCCSIDがセットされ、適切に実行しているジョブのCCSIDに変換されるからです。SEUで5026か5035のどちらで編集したか、また誤ったCCSIDで編集する事はありません。このファイル必要時にIDを指定して取得します。IDはCCSIDの問題を回避する為、全て英大文字でセットします。DEBUGする際に一時的に値を変更しテストするのも便利でした。(ソースを修正するとケアレミ・ミスの可能性が発生します。)また下記特殊文字列を用意しています。特殊文字列を設定すると内容値に変更されます。

No. 特殊文字列 セットされる値 備考
1 %USER% IBM iにサインインしたユーザーID 英大文字 最大10文字
2 %PGM% 実行しているプログラムID 英大文字 最大10文字
3 %WSID% ワークステーションID(ジョブ名) 英大文字 最大10文字
4 %DATE% 実行日付8桁 編集表示はしません
5 %TIME% 実行時間6桁 編集表示はしません

▼サンプルプログラムでセットしているパラメータ

上記のようにID毎に最大5個まで(もっと増やしてもよかったかも知れません)設定できます。IDは英小文字問題を避ける為全て大文字です。パラメータ取得プログラム(UTLGETPRM)を作成しCLで使えるようにしました。このプログラムは5026<->5035のコード変換プログラム(UTLCVTEBC)を必要時にCALLしています。

4.1.1. CLでパラメータ取得 変数定義

4.1.2. パラメータ取得処理

CALL UTLGETPRMがパラメータ取得のプログラムです。2番目のパラメータは5026<->5035のコード変換指定です。※ *NOは変換しない。
取得したP_PRM1~P_PRM5の5つのパラメータを実際の変数にセットします。
上記の画面はFTP関連情報を取得しています。本来はコマンド化すべきですが、時間の関係で実装には至りませんでした。
※RTVxxxxコマンドのようなものを作成すればもっと便利だったと思います。
またパラメータ取得はEXCEL用があります。情報の持つ意味合いとユーザー変更可能パラメータとしたかった為、あえて分けています。

(参考:EXCEL用パラメータファイルの一部)

5. 準備作業

DEFファイル・CSVファイル・BNDファイルはCRTPFコマンドで事前にライブラリーリストにあるライブラリーに作成します。
BNDファイルに関して今回は説明しません。(※複数のCSVを纏めて1つのEXCELにする定義ファイルです。)

DEFファイルDDSソース

DEFファイル(XMLファイル)を格納する為の物理ファイルです。
QTEMPに作成します。
単純にレコードが長いファイルになります。
CRTPFで作成すると弊社の環境ではCCSID=5026で作成されます。
「CRTPF FILE(EXCELLIB/CSVTXT) SRCFILE(EXCELLIB/QDDSSRC)」

CSVファイルのDDSソース

CSVファイル(CSVファイル)を格納する為の物理ファイルです。
QTEMPに作成します。
単純にレコードがより長いファイルになります。
CRTPFで作成すると弊社の環境ではCCSID=5026で作成されます。
「CRTPF FILE(EXCELLIB/CSVTXT2) SRCFILE(EXCELLIB/QDDSSRC)」

BNDファイルのDDSソース

BNDファイル(XMLファイル)を格納する為の物理ファイルです。
QTEMPに作成します。
単純にレコードが長いファイルになります。
CRTPFで作成すると弊社の環境ではCCSID=5026で作成されます。
「CRTPF FILE(EXCELLIB/CSVTXT3) SRCFILE(EXCELLIB/QDDSSRC)」

SQL作成プログラムから、下記ILECLPプログラムが起動されます。

いいねと思ったらシェア
twitter
facebook
hatena
関連記事
【IBM Power Salon】株式会社 電業様<br /> 「根っからのエンジニアが語る IBM i 内製化のリアル」実践編~IBM i CSVファイルからExcelファイルへの変換 その1
【IBM Power Salon】株式会社 電業様
「根っからのエンジニアが語る IBM i 内製化のリアル」実践編~IBM i CSVファイルからExcelファイルへの変換 その1
【IBM Power Salon】株式会社 電業 様が語る<br />「根っからのエンジニアが語る IBM i 内製化のリアル」実践編<br />~サンプルプログラムの流れ(5250画面からSQL文の作成)
【IBM Power Salon】株式会社 電業 様が語る
「根っからのエンジニアが語る IBM i 内製化のリアル」実践編
~サンプルプログラムの流れ(5250画面からSQL文の作成)
IBM i 用の新しいODBCドライバー
IBM i 用の新しいODBCドライバー
あなたにオススメの連載
できるIBM i 温故知新編
9記事
できるIBM i 温故知新編
IBM i の”新”必須言語 〜FFRPG入門〜
14記事
IBM i の”新”必須言語 〜FFRPG入門〜
IBM i アプリの第二の柱 OSS
15記事
IBM i アプリの第二の柱 OSS
PAGE TOP