ChatGPT(担当者2)~ 最初のアウトプット/完成ソース ~
最初のアウトプット
最初の応答(ソース生成せず、前提確認を要求)
最初のアウトプット(ソース生成しなかった)
添付の詳細設計書を確認しました。設計書では、IBM i/RPG IV固定形式を前提に、TOKMSPを全件コピーして
TKMASWを作成・更新し、TKGENDを基準にABC分析する仕様になっています。
ただし、設計書だけではそのままコンパイルできる完成ソースにするために不足している情報があります。
特に、TOKMSPの実際のDDS定義・ライブラリ名・メッセージ送信方法などです。設計書上はTKMASWについて
「TOKMSPの15項目+JUNI/KOSEI/RUIKEI/KEKKA」と定義されています。
そのため、まずは設計書から確定できる範囲で、以下の構成にするのがよいです。
作成するソース
1. ABC分析RPG
* TKGEND降順、TKBANG昇順で処理
* ZGOKEIを算出
* KOSEI、RUIKEIを算出
* KEKKAをA/B/C判定
* TKMASWをCHAIN → UPDATE
* E001~E005のエラー処理
2. TKMASW DDS
* TOKMSPの15項目
* JUNI
* KOSEI
* RUIKEI
* KEKKA
* TKBANGをキー
3. 実行用CL
* TKMASWの存在確認/初期化
* TOKMSP→TKMASW全件コピー
* RPG呼出し
なお、設計書では「TKMASWが存在する場合は内容をクリア、存在しない場合は作成」となっているため、
RPGだけでなくCL側も作る方がIBM iとして自然です。
また、ABC判定については、設計書どおり表示上の丸め値ではなく内部の小数第4位で判定します。
ただ、ここでいきなり「コンパイル保証済み」としてソースを出すのは危険です。
TOKMSPの実DDSが添付資料にないため、実際のフィールド属性・キー定義・ライブラリ構成を仮定することに
なります。
もし実際にIBM iへ持っていってコンパイルするところまで考えているのであれば、TOKMSPのDDSソース
(またはDSPFFD TOKMSPの結果)を添付してください。
それを基に、RPG IV固定形式+DDS+CLの3本を、コピーして使える形でまとめます。
DDS提供後の初期出力:DDS(TKMASR)
A R TKMASR
A TKBANG 5A
A TKNAKN 20A
A TKNAKJ 20O
A TKADR1 20O
A TKADR2 20O
A TKTIKU 2A
A TKPOST 6A
A TKTELE 13A
A TKGURI 9P 0
A TKNURI 9P 0
A TKZURI 9P 0
A TKUZAN 9P 0
A TKGEND 9P 0
A TKNYUK 6P 0
A TKSIME 1A
A JUNI 5P 0
A KOSEI 7P 4
A RUIKEI 7P 4
A KEKKA 1A
A K TKBANG
DDS提供後の初期出力:CL
PGM
/*=====================================================*/
/* TKMASWの存在確認 */
/*=====================================================*/
RTVOBJ OBJ(TKMASW) OBJTYPE(*FILE) RTNLIB(&LIB)
MONMSG MSGID(CPF9801) EXEC(DO)
/*-----------------------------------------------*/
/* TKMASWが存在しない場合 */
/*-----------------------------------------------*/
SNDPGMMSG MSG('TKMASWが存在しません。')
RETURN
ENDDO
/*=====================================================*/
/* TKMASWを初期化 */
/*=====================================================*/
CLRPFM FILE(TKMASW)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSG('TKMASWの初期化に失敗しました。')
RETURN
ENDDO
/*=====================================================*/
/* TKMASP → TKMASW */
/*=====================================================*/
/* */
/* 共通項目のみをコピーし、 */
/* JUNI / KOSEI / RUIKEI / KEKKAは初期値とする。 */
/*=====================================================*/
CPYF FROMFILE(TKMASP) +
TOFILE(TKMASW) +
MBROPT(*REPLACE) +
FMTOPT(*MAP *DROP)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSG('TKMASPからTKMASWへのコピーに失敗しました。')
RETURN
ENDDO
/*=====================================================*/
/* TKMASPを信用限度額降順でオープン */
/* 同額の場合はTKBANG昇順 */
/*=====================================================*/
OPNQRYF FILE((TKMASP)) +
KEYFLD((TKGEND *DESCEND) +
(TKBANG *ASCEND))
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSG('TKMASPのソート処理に失敗しました。')
RETURN
ENDDO
/*=====================================================*/
/* ABC分析RPG呼出し */
/*=====================================================*/
CALL PGM(TKMABC)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDPGMMSG MSG('ABC分析プログラムでエラーが発生しました。')
ENDDO
/*=====================================================*/
/* OPNQRYFクローズ */
/*=====================================================*/
CLOF OPNID(TKMASP)
RETURN
ENDPGM
DDS提供後の初期出力:RPGLE
H DFTACTGRP(*NO) ACTGRP(*CALLER)
F*****************************************************************
F* 得意先マスタ
F*****************************************************************
FTOKMSP IF E DISK
F*****************************************************************
F* ABC分析結果ワークファイル
F*****************************************************************
FTKMASW UF E DISK
D*****************************************************************
D* ワーク変数
D*****************************************************************
D ZGOKEI S 15P 0
D ZKOSEI S 7P 4
D ZRUIKEI S 7P 4
D ZJUNI S 5P 0
D ZERRCT S 10P 0
D ZSTATUS S 10I 0
D*****************************************************************
D* エラー処理用
D*****************************************************************
D MSG S 256A
D MSGFILE S 10A
D MSGSTS S 10A
C*****************************************************************
C* メイン処理
C*****************************************************************
C EXSR INIT
C*---------------------------------------------------------------
C* TOKMSPが0件か確認
C*---------------------------------------------------------------
C READ TOKMSP
C IF %EOF
C EXSR ERR001
C GOTO ENDPRG
C ENDIF
C*---------------------------------------------------------------
C* 1件目を読み込んでいるため、先頭へ戻す
C*---------------------------------------------------------------
C SETLL *LOVAL TOKMSP
C*---------------------------------------------------------------
C* 信用限度額合計を算出
C*---------------------------------------------------------------
C Z-ADD 0 ZGOKEI
C READ TOKMSP
C DOW NOT %EOF
C* 信用限度額を合計
C ADD TKGEND ZGOKEI
C READ TOKMSP
C ENDDO
C*---------------------------------------------------------------
C* 信用限度額合計が0の場合
C*---------------------------------------------------------------
C IF ZGOKEI = 0
C EXSR ERR004
C GOTO ENDPRG
C ENDIF
C*---------------------------------------------------------------
C* 再度先頭からABC分析
C*---------------------------------------------------------------
C SETLL *LOVAL TOKMSP
C Z-ADD 0 ZJUNI
C Z-ADD 0 ZRUIKEI
C Z-ADD 0 ZERRCT
C*---------------------------------------------------------------
C* 全件処理
C*---------------------------------------------------------------
C READ TOKMSP
C DOW NOT %EOF
C*---------------------------------------------------------------
C* 順位
C*---------------------------------------------------------------
C ADD 1 ZJUNI
C*---------------------------------------------------------------
C* 構成比
C* TKGEND / ZGOKEI * 100
C*---------------------------------------------------------------
C Z-ADD 0 ZKOSEI
C EVAL ZKOSEI =
C (TKGEND / ZGOKEI) * 100
C*---------------------------------------------------------------
C* 累積構成比
C*---------------------------------------------------------------
C ADD ZKOSEI ZRUIKEI
C*---------------------------------------------------------------
C* ABC判定
C*---------------------------------------------------------------
C IF ZRUIKEI <= 70.0000
C MOVEL 'A' KEKKA
C ELSEIF ZRUIKEI <= 90.0000
C MOVEL 'B' KEKKA
C ELSE
C MOVEL 'C' KEKKA
C ENDIF
C*---------------------------------------------------------------
C* 順位・構成比・累積構成比をセット
C*---------------------------------------------------------------
C Z-ADD ZJUNI JUNI
C Z-ADD ZKOSEI KOSEI
C Z-ADD ZRUIKEI RUIKEI
C*---------------------------------------------------------------
C* TKMASWを得意先番号で検索
C*---------------------------------------------------------------
C CHAIN TKBANG TKMASW
C IF %FOUND
C* 分析結果を更新
C UPDATE TKMASR
C IF %ERROR
C EXSR ERR005
C GOTO ENDPRG
C ENDIF
C ELSE
C* CHAIN失敗
C ADD 1 ZERRCT
C EXSR ERR005
C ENDIF
C*---------------------------------------------------------------
C* 次レコード
C*---------------------------------------------------------------
C READ TOKMSP
C ENDDO
C*---------------------------------------------------------------
C* 正常終了
C*---------------------------------------------------------------
C EXSR NORMAL
C*****************************************************************
C* 終了
C*****************************************************************
C ENDPRG TAG
C SETON LR
C*****************************************************************
C* 初期処理
C*****************************************************************
C INIT BEGSR
C* エラー件数初期化
C Z-ADD 0 ZERRCT
C ENDSR
C*****************************************************************
C* E001:データなし
C*****************************************************************
C ERR001 BEGSR
C DSPLY
C 'E001:得意先マスタ(TOKMSP)に対象データが存在しません。'
C ENDSR
C*****************************************************************
C* E004:信用限度額合計ゼロ
C*****************************************************************
C ERR004 BEGSR
C DSPLY
C 'E004:信用限度額合計がゼロのため、構成比を算出できません。'
C ENDSR
C*****************************************************************
C* E005:システム異常
C*****************************************************************
C ERR005 BEGSR
C DSPLY
C 'E005:TKMASWの更新中にエラーが発生しました。'
C ENDSR
C*****************************************************************
C* 正常終了
C*****************************************************************
C NORMAL BEGSR
C DSPLY
C 'ABC分析処理が正常終了しました。'
C ENDSR
完成ソース
DDS(TKMASR:変更なし)
A R TKMASR
A TKBANG 5A
A TKNAKN 20A
A TKNAKJ 20O
A TKADR1 20O
A TKADR2 20O
A TKTIKU 2A
A TKPOST 6A
A TKTELE 13A
A TKGURI 9P 0
A TKNURI 9P 0
A TKZURI 9P 0
A TKUZAN 9P 0
A TKGEND 9P 0
A TKNYUK 6P 0
A TKSIME 1A
A JUNI 5P 0
A KOSEI 7P 4
A RUIKEI 7P 4
A KEKKA 1A
A K TKBANG
RPGLE(完成版:E001~E005実装、ZA/ZB定数化)
H DFTACTGRP(*NO) ACTGRP(*CALLER)
FTKMASP IF E K DISK RENAME(TKMASP:TKMASPI)
FTKMASW UF E K DISK
DZGOKEI S 15P 0
DZKOSEI S 7P 4
DZRUIKEI S 7P 4
DZJUNI S 5P 0
DZA S 7P 4 INZ(70.0000)
DZB S 7P 4 INZ(90.0000)
C EVAL ZGOKEI = 0
C EVAL ZJUNI = 0
C EVAL ZRUIKEI = 0
C READ(E) TKMASPI
C IF %ERROR
C 'E002' DSPLY
C RETURN
C ENDIF
C READ(E) TKMASPI
C IF %ERROR
C 'E003' DSPLY
C RETURN
C ENDIF
C IF %EOF(TKMASP)
C 'E001' DSPLY
C RETURN
C ENDIF
C DOU %EOF(TKMASP)
C EVAL ZGOKEI = ZGOKEI + TKGEND
C READ(E) TKMASPI
C IF %ERROR
C 'E003' DSPLY
C RETURN
C ENDIF
C ENDDO
C IF ZGOKEI = 0
C 'E004' DSPLY
C RETURN
C ENDIF
C EVAL ZJUNI = 0
C EVAL ZRUIKEI = 0
C READ(E) TKMASPI
C IF %ERROR
C 'E002' DSPLY
C RETURN
C ENDIF
C READ(E) TKMASPI
C IF %ERROR
C 'E003' DSPLY
C RETURN
C ENDIF
C DOU %EOF(TKMASP)
C EVAL ZJUNI = ZJUNI + 1
C EVAL ZKOSEI = (TKGEND * 100.0000) / ZGOKEI
C EVAL ZRUIKEI = ZRUIKEI + ZKOSEI
C IF ZRUIKEI <= ZA
C EVAL KEKKA = 'A'
C ELSE
C IF ZRUIKEI <= ZB
C EVAL KEKKA = 'B'
C ELSE
C EVAL KEKKA = 'C'
C ENDIF
C ENDIF
C TKBANG CHAIN(E) TKMASW
C IF %ERROR
C 'E005' DSPLY
C RETURN
C ENDIF
C IF %FOUND(TKMASW)
C EVAL JUNI = ZJUNI
C EVAL KOSEI = ZKOSEI
C EVAL RUIKEI = ZRUIKEI
C UPDATE(E) TKMASR
C IF %ERROR
C 'E005' DSPLY
C RETURN
C ENDIF
C ENDIF
C READ(E) TKMASPI
C IF %ERROR
C 'E003' DSPLY
C RETURN
C ENDIF
C ENDDO
C 'ABC END' DSPLY
C RETURN
C
CL(完成せず・断念)
CLプログラムは、日本語コメント・メッセージの一部が文字化けする事象が解消できず、複数回のやり取りを重ねても改善傾向が見られなかったため、最終的に完成を断念しました。
やり取りの詳細:https://chatgpt.com/share/6aa7bedb-1060-83e9-8e7c-ef48e616ad49
当記事の著作権はIBMに帰属します。詳細はこちらをご参照ください。