先に「RPG から Pythonへの進化」で示したように
PythonとはILE-RPGのフリー・フォーマットをさらに
簡略化したようなイメージであり、簡単そうであることを
漢字てもらえたと思う。
しかし実際のPython となるとからり難しいのではないかと
身構えてしまう人もいるかもしれない。
_
5250アプリケーションのサンプルの実行画面を
ここで紹介する。
商品マスター登録 モード . . : 変更
様式 . . . . : DSPDTA01 ファイル . : @SHOHIN
商品コード : NV-CF1
商品名 : Cカセット編集ビデオ
単価 : 58,000
品種コード : 0002 ビデオデッキ
F3= 終了 F5= 最新表示 F9= 挿入 F10= 入力
F11= 変更 F23= 削除 F12= 前画面
[解説]
DFUのように1レコードを保守するプログラムであるが
機能キーを見てもわかるようにDFUと同じようにモードを
切り替えることもできるようになっている。
このプログラムは Pythonで動作している。
[@SHOHIN: Pythonソース]
#*********************************************************#
#*
#* プログラム名 : @SHOHIN.PY
#* タイプ : PYTHON
#* APP タイプ : 単票入力 (*SGLCOL)
#* 作成日 : 2024/11/11 14:28:01
#* 作成者 : QTR
#* ディレクトリー : /PYTHON/PROJECT
#* 使用ファイル : QTRFIL/SHOHIN
#* QTRFIL/HINSHU
#*
#*********************************************************
import sys
from as400 import *
CALLTYPE(sys.argv[1])
OPEN("QTROBJ/@SHOHIN") # 表示装置ファイルをオープン
OPEN("QTRFIL/SHOHIN") # 商品マスターファイル
OPEN("QTRFIL/SHOHIN") # 商品マスターファイル
OPEN("QTRFIL/HINSHU") # 品種マスターファイル
while True:
EXFMT("DSPHEAD") # 初期画面を表示
CHAIN("SHCODE", "SHOHIN") # 商品マスター登録を CHAIN
while True:
CHAIN("SHSCOD", "HINSHU") # 品種マスターファイル
EXFMT("DSPDTA01") # 明細レコード画面を表示
[解説]
_
これがPythonソースのすべてであり驚くほど簡単である。
参考までにこの処理をRPGで記述したソースを後で示す。
さて
OPEN("QTROBJ/@SHOHIN") # 表示装置ファイルをオープン
OPEN("QTRFIL/SHOHIN") # 商品マスターファイル
OPEN("QTRFIL/SHOHIN") # 商品マスターファイル
OPEN("QTRFIL/HINSHU") # 品種マスターファイル
であるが DSPF: @SHOHIN のオープンも
データ・ベース: QTRFIL/SHOHIN, …などのオープンも同じ openという命令だけである。
これは
from as400 import *
で示されているように㈱オフィスクアトロが開発したAS400エンジンというPythonに提供するための
サービス・プログラムで提供されているメソッド(=関数)である。
DSPFなのかPFなのか LFなのかはオープンすればわかることだから
いちいち装置タイプ(WORKSTN, DISK)を宣言する必要はないというのが
弊社のPythonに対する考え方である。
できるだけコーディングを簡素化するために無駄なコーディグは避けて
多くをAS400エンジンに任せればよいという考え方である。
_
同じようにして
EXFMT("DSPHEAD") # 初期画面を表示
には F3=終了やF10=入力, …などの記述も必要ない。
EXFMT メソッド(=プロシージャー)の内部で F3=終了の処理を行っているからである。
読者はRPGプログラムで EXFMT DSPRCD のような記述の直後には必ず F3=終了の処理を
毎回記述していることだと思う。
毎回、書かねばならないのであれば内部でやらせてしまえばよいことである。
CHAIN("SHCODE", "SHOHIN") # 商品マスター登録を CHAIN
などの処理にしてもCHAINが失敗したときのエラー処理なども毎度のように
書かなくてもよい。AS400エンジンにやらせればよいのである。
こうしていくとSFLレコードの表示やロール・アップ/ダウンの処理も毎回同じような
記述をしてはバグを発生させてバグつぶしに追われていたのである。
必要な基本動作はAS400エンジンに任せておけばバグも発生しないし
短時間で必要な処理だけを記述すればよいのである。
実はこの短い16ステップばかりのPythonソースも人手によってコーディングしたものではなく
Wizardによって自動生成したものである。
Wizardの利用によってとにもかくにも正確に動作するPythonが生成されるわけであるから
慣れないうちはそこから少しずつ修正を加えていけば短期間でPythonの動作を
学習することができる。
_
最後に参考までに上記のプログラムのILE-RPGソースを以下に紹介する。
[@SHOHIN: ILE-RPGソース]
0001.00 H DFTNAME(@SHOHIN) DATEDIT(*YMD/)BNDDIR('QC2LE')
0002.00 H COPYRIGHT('*DFUATR=YYYYNYYY80 241321 ')
0003.00 F******** 商品マスター登録 **************************************
0004.00 F@SHOHIN CF E WORKSTN
0005.00 F INFDS(INFDS)
0006.00 FSHOHIN UF A E K DISK
0007.00 F INFDS(INFDSF)
0008.00 F EXTFILE(SHOHIN_LIB)
0009.00 FQPDFULOG O E DISK USROPN
0010.00 F EXTFILE(DFULOG_LIB)
0011.00 FHINSHU IF E K DISK
0012.00 F*****************************************************************
0013.00 * ラSRCINFOン
0014.00 * 使用目的 : 単票入力 (*SGLCOL)
0015.00 * 作成日 : 2024/09/19 14:24:41
0016.00 * 作成者 : QTR
0017.00
0018.00 * ラ コンパイル ン
0019.00 * CRTBNDRPG OBJLIB/@SHOHIN SRCFILE(QTRSRC/QRPGLESRC )
0020.00 * DFTACTGRP(*NO) ACTGRP(*NEW) DBGVIEW(*SOURCE) AUT(*ALL)
0021.00
0022.00 D INFDS DS
0023.00 D NUM_ROWS 152 153B 0 DSPF の行数
0024.00 D NUM_COLS 154 155B 0 DSPF の桁数
0025.00 D NUM_RCDS 156 159I 0 レコード数
0026.00 D RECNAM 261 270 現在のレコード名
0027.00 D LINE 370 371B 0 カーソル行と桁
0028.00 D TOPRRN_ 378 379B 0 SFL 先頭の RRN
0029.00 D BRRN 376 377B 0 入出力レコード RRN
0030.00
0031.00 D INFDSF DS QUALIFIED
0032.00 * オープン・フィードバック域 160 BYTES 81-240
0033.00 D OPNFBK 81 240 ファイル名
0034.00 D ODP_TYPE 81 82 ODP タイプ
0035.00 D FILE_NAME 83 92 ODP タイプ
0036.00 D LIBRARY 93 102 ODP タイプ
0037.00 D MEMBER 129 138 メンバー名
0038.00 D FILRCDS 156 159I 0 OPEN 時レコード数
0039.00
0040.00 *( 一般標識の再定義 )
0041.00 D INDPTR S * INZ(%ADDR(*IN))
0042.00 D INDICATORS DS BASED(INDPTR)
0043.00 D FGR 31 40 DIM(10)
0044.00
0045.00 *( 作業変数 )
0046.00 D SHOHIN_LIB S 13 INZ('QTRFIL/SHOHIN')
0047.00 D DFULOG_LIB S 16 INZ('QTEMP/QPDFULOG')
0048.00 D FILE S 10A INZ('SHOHIN ')
0049.00 D RECORD S 10A INZ('SHOHINR ')
0050.00 D AR S 1A DIM(256)
0051.00 D N S 4S 0
0052.00 D TRUE S 1A DIM(256)
0053.00 D TRUE# S 4B 0 INZ(0)
0054.00 D FALSE# S 4B 0 INZ(-1)
0055.00 D QUOT C CONST(X'7D')
0056.00 D OE C CONST(X'0E')
0057.00 D OF C CONST(X'0F')
0058.00 D NULL C CONST(X'00')
0059.00 D MSGKEY S 4A
0060.00 D MSGFILLIB S 20A INZ('QCDFUSG QSYS ')
0061.00 D ERRN S 4S 0
0062.00 D CUR S 2S 0 INZ(1) 現在の画面標識
0063.00 D LST S 2S 0 INZ(1) 最後の画面標識
0064.00
0065.00 *( QMHSNDPM : プログラム・メッセージの送信 )
0066.00 D QMHSNDPM PR EXTPGM('QMHSNDPM')
0067.00 D MSGID 7A CONST
0068.00 D MSGFILE 20A CONST
0069.00 D MSGDATA 6000A CONST OPTIONS(*VARSIZE)
0070.00 D MSGDATALEN 10I 0 CONST
0071.00 D MSGTYPE 10A CONST
0072.00 D CALLSTACKE 10A CONST
0073.00 D CALLSTACKC 10I 0 CONST
0074.00 D RTNMSGKEY 4A
0075.00 D APIERR LIKEDS(QUSEC)
0076.00 D OPTIONS(*VARSIZE)
0077.00 *
0078.00 D*( プログラム状況データ構造 )
0079.00 D INFDS_THIS SDS
0080.00 D PROC_NAM *PROC
0081.00 D ROUTINE *ROUTINE
0082.00 D 512A
0083.00 D PGMINFO 1 512
0084.00 D LINE_NUM 21 28
0085.00 D CPFID 40 46
0086.00 D CPFDTA 91 170
0087.00 D ERRMSGID 46 51
0088.00 D JOB 244 253
0089.00 D USER 254 263
0090.00 D JOBNBR 264 269 0
0091.00 D CURUSR 358 367
0092.00
0093.00 D*( WORK 日付 YYMMDD ゴーn 構造 )
0094.00 D DATEDS DS
0095.00 D SRY 1 2 0
0096.00 D SRYMD 1 8 0
0097.00 D YYMMDD 3 8 0
0098.00 D YYMM 3 6 0
0099.00 D MMDD 5 8 0
0100.00 D YY 3 4 0
0101.00 D MM 5 6 0
0102.00 D DD 7 8 0
0103.00
0104.00 D SAVEDS E DS EXTNAME(SHOHIN)
0105.00 D FILDTA 1 1024
0106.00
0107.00 *( DFU 属性 )
0108.00 D DFUATR DS
0109.00 D ATTR_BUF 1 18
0110.00 D PRINT 1 1 INZ('Y')
0111.00 D ADDPRT 2 2 INZ('Y')
0112.00 D CHGPRT 3 3 INZ('Y')
0113.00 D DLTPRT 4 4 INZ('Y')
0114.00 D IGCERR 5 5 INZ('N')
0115.00 D EDTDEC 6 6 INZ('Y')
0116.00 D UPDADV 7 7 INZ('Y')
0117.00 D CHGKEY 8 8 INZ('Y')
0118.00 D DSPWID 9 11 INZ('80 ')
0119.00 D DSPDEP 12 13 INZ('24')
0120.00 D PRTWID 14 16 INZ('132')
0121.00 D PRTSEP 17 18 INZ('1 ')
0122.00
0123.00 D APIERR DS
0124.00 D GETBYT 1 4B 0 INZ(160)
0125.00 D AVLBYT 5 8B 0 INZ(0)
0126.00 D MSGID 9 15
0127.00 D MSGDTA 17 160
0128.00
0129.00 D APIDS DS
0130.00 D INZSIZE 1 4B 0 INZ(1000)
0131.00 D MSGDTALEN 5 8B 0 INZ(100) 小数
0132.00 D PGMSTKCNT 9 12B 0 INZ(1) 小数
0133.00
0134.00 DQUSEC DS
0135.00 D QUSBPRV 1 4B 0 INZ(8)
0136.00 D QUSBAVL 5 8B 0 INZ(0)
0137.00
0138.00 D DSPMSG S 6A
0139.00 C*-------------------------------------------------------------------------+
0140.00 C *ENTRY PLIST |
0141.00 C PARM CMD 10 |
0142.00 C PARM ERR 1 |
0143.00 C PARM MSG 132 |
0144.00 C*-------------------------------------------------------------------------+
0145.00 C*-------------------------------------------------------------------------+
0146.00 C RECKEY KLIST |
0147.00 C KFLD SHCODE |
0148.00 C*-------------------------------------------------------------------------+
0149.00
0150.00 C*( 初期画面 )
0151.00 C*-------------------------------------------------------------------------+
0152.00 C START TAG |
0153.00 C EXFMT DSPHEAD |
0154.00 C*-------------------------------------------------------------------------+
0155.00 C SETOFF 99
0156.00 C*( CF03 )- 終了
0157.00 C *IN03 IFEQ *ON CF03
0158.00 C SETON LR
0159.00 C RETURN
0160.00 C ENDIF
0161.00 C*( ROLLUP )
0162.00 C *IN07 IFEQ *ON CF03
0163.00 C EXSR ROLLUP
0164.00 C GOTO DSPLY
0165.00 C ENDIF
0166.00 C*( ROLLDWN )
0167.00 C *IN08 IFEQ *ON CF03
0168.00 C EXSR ROLLDWN
0169.00 C GOTO DSPLY
0170.00 C ENDIF
0171.00 C*( CF09 )- 入力
0172.00 C *IN09 IFEQ *ON CF09
0173.00 C MOVEL ' 入力 ' DSPMSG
0174.00 C GOTO DSPLY
0175.00 C ENDIF
0176.00 C*( 実行キー )
0177.00 C *NOKEY CLEAR SHOHINR
0178.00 C SETOFF 90
0179.00 C RECKEY CHAIN SHOHIN 90
0180.00 C N90 MOVEL ' 照会 ' DSPMSG
0181.00 C *IN90 IFEQ *ON
0182.00 C SETON 6299
0183.00 C GOTO START
0184.00 C ENDIF
0185.00 C EXSR CHECK
0186.00 C 99 GOTO START
0187.00 C*( 明細画面 )
0188.00 C*-------------------------------------------------------------------------+
0189.00 C DSPLY TAG |
0190.00 C 31 EXFMT DSPDTA01 |
0191.00 C*-------------------------------------------------------------------------+
0192.00 C SETOFF 99
0193.00 C*( CF03 )- 終了
0194.00 C *IN03 IFEQ *ON CF03
0195.00 C SETON LR
0196.00 C EXSR LRRTN
0197.00 C LR RETURN
0198.00 C GOTO DSPLY
0199.00 C ENDIF CF03
0200.00 C*( CF12 )- 前画面
0201.00 C *IN12 IFEQ *ON CF12
0202.00 C SETOFF 12
0203.00 C GOTO START
0204.00 C ENDIF CF12
0205.00 C*( CF23 )- 削除
0206.00 C *IN23 IFEQ *ON CF23
0207.00 C SETOFF 23
0208.00 C *IN43 IFEQ *OFF NOT 43
0209.00 C SETON 43
0210.00 C EVAL MSGID = 'DFU0736'
0211.00 C EXSR SNDPGMMSG
0212.00 C GOTO DSPLY
0213.00 C ENDIF NOT 43
0214.00 C ENDIF CF23
0215.00 C*( ROLLUP )
0216.00 C *IN07 IFEQ *ON CF03
0217.00 C EXSR ROLLUP
0218.00 C GOTO DSPLY
0219.00 C ENDIF CF12
0220.00 C*( ROLLDWN )
0221.00 C *IN08 IFEQ *ON CF03
0222.00 C EXSR ROLLDWN
0223.00 C GOTO DSPLY
0224.00 C ENDIF
0225.00 C*( 実行キー )
0226.00 * ( 何も修正がなければ ROLLUP と見なします )
0227.00 C *IN01 IFEQ *OFF NOT CHANGED
0228.00 C EXSR ROLLUP
0229.00 C GOTO DSPLY
0230.00 C ENDIF NOT CHANGED
0231.00 * ( 修正があったときのみレコードを更新する )
0232.00 C EXSR CHECK
0233.00 C 99 GOTO DSPLY
0234.00 C MOVE FILDTA SAVDTA
0235.00 C *LIKE DEFINE FILDTA SAVDTA
0236.00 C SETOFF 90
0237.00 C RECKEY CHAIN SHOHIN 90
0238.00 C 30 UNLOCK SHOHIN
0239.00 C 30 GOTO DSPLY
0240.00 C MOVE SAVDTA FILDTA
0241.00 C*-------------------------------------------------------------------------+
0242.00 C 90 WRITE SHOHINR |
0243.00 C N23 |
0244.00 CANN90 UPDATE SHOHINR |
0245.00 C 23 |
0246.00 CANN90 DELETE SHOHINR |
0247.00 C*-------------------------------------------------------------------------+
0248.00 C 90 ADD 1 ADDRCD
0249.00 C N23
0250.00 CANN90 ADD 1 CHGRCD 5 0
0251.00 C 23
0252.00 CANN90 ADD 1 DLTRCD 5 0
0253.00 C SETOFF 2343
0254.00 C EXSR WRTLOG
0255.00 C GOTO DSPLY
0256.00 C END TAG
0257.00 C******************************************************
0258.00 C *INZSR BEGSR
0259.00 C******************************************************
0260.00 C* 初期サイクルのみの実行
0261.00 C CLEAR SHOHINR
0262.00 C CMD COMP 'DSPDTA ' 30 表示のみ
0263.00 C 30 MOVE ' 表示 ' DSPMOD
0264.00 C N30 EVAL DSPMOD = ' 変更 '
0265.00 C N30 OPEN QPDFULOG 91
0266.00 /FREE
0267.00 MSGDTA = INFDSF.MEMBER + INFDSF.FILE_NAME + INFDSF.LIBRARY;
0268.00 /END-FREE
0269.00 C SETON 31 DSPDTA 最初
0270.00 C SETOFF 32
0271.00 C ENDSR
0272.00 C******************************************************
0273.00 C CHECK BEGSR
0274.00 C******************************************************
0275.00 C*( 明細チエック )
0276.00 C*-------------------------------------------------------------------------+
0277.00 C HINSHUKEY KLIST |
0278.00 C KFLD HNSCOD |
0279.00 C*-------------------------------------------------------------------------+
0280.00 C EVAL HNSCOD = SHSCOD
0281.00 C SETOFF 99
0282.00 C HINSHUKEY CHAIN HINSHU 99
0283.00 /FREE
0284.00 IF *IN99 = *ON;
0285.00 *IN71 = *ON;
0286.00 ERRMSG = ' 品種コード の誤りです。 ';
0287.00 LEAVESR;
0288.00 ENDIF;
0289.00 /END-FREE
0290.00 /END-FREE
0291.00 C CHKEND ENDSR
0292.00 C******************************************************
0293.00 C ROLLUP BEGSR
0294.00 C******************************************************
0295.00 C SETOFF 07
0296.00 C CUR IFLT LST =LSTFLG
0304.00 /FREE
0305.00 FGR(CUR) = *OFF;
0306.00 CUR = 1;
0307.00 FGR(CUR) = *ON; // 標識 31 を ON にセットして戻す
0308.00 IF *IN30 = *OFF AND *IN01 = *ON AND UPDADV = 'Y';
0309.00 UPDATE SHOHINR ; // レコード前進で更新
0310.00 UPDATE SHOHINR ; // レコード前進で更新
0311.00 CHGRCD = CHGRCD + 1;
0312.00 EXSR WRTLOG;
0313.00 ENDIF;
0314.00 /END-FREE
0315.00 C SETOFF 07
0316.00 C RECKEY SETGT SHOHIN
0317.00 C READ SHOHIN 61
0318.00 C *IN61 IFEQ *ON
0319.00 C SETON 99
0320.00 C ELSE
0321.00 C 30 UNLOCK SHOHIN
0322.00 C EXSR CHECK
0323.00 C ENDIF
0324.00 C ENDIF >=LSTFLG
0325.00 C ENDSR
0326.00 C******************************************************
0327.00 C ROLLDWN BEGSR
0328.00 C******************************************************
0329.00 C SETOFF 08
0330.00 C IF CUR > 1 CUR>1
0331.00 /FREE
0332.00 FGR(CUR) = *OFF;
0333.00 CUR = CUR - 1;
0334.00 FGR(CUR) = *ON; // 前の標識を ON にセット
0335.00 /END-FREE
0336.00 C ELSE CUR>1
0337.00 C RECKEY SETLL SHOHIN
0338.00 C READP SHOHIN 61
0339.00 C *IN61 IFEQ *ON
0340.00 C SETON 99
0341.00 C ELSE
0342.00 C 30 UNLOCK SHOHIN
0343.00 C EXSR CHECK
0344.00 C ENDIF
0345.00 C ENDIF CUR>1
0346.00 C ENDSR
0347.00 C******************************************************
0348.00 C WRTLOG BEGSR
0349.00 C******************************************************
0350.00 C IF PRINT = 'Y' AND *IN91 = *OFF AND
0351.00 C CMD = 'CHGDTA '
0352.00 /FREE
0353.00 IF ADDPRT = 'Y' AND *IN90 = *ON;
0354.00 LOGMSG = ' 追加 ';
0355.00 WRITE QPDFULOGR;
0356.00 ENDIF;
0357.00 IF CHGPRT = 'Y' AND *IN90 = *OFF AND *IN23 = *OFF;
0358.00 LOGMSG = ' 変更後 ';
0359.00 WRITE QPDFULOGR;
0360.00 ENDIF;
0361.00 IF DLTPRT = 'Y' AND *IN90 = *OFF AND *IN23 = *ON;
0362.00 LOGMSG = ' 削除済み ';
0363.00 WRITE QPDFULOGR;
0364.00 ENDIF;
0365.00 /END-FREE
0366.00 C ENDIF CHKLIST
0367.00 C ENDSR
0368.00 C******************************************************
0369.00 C SNDPGMMSG BEGSR
0370.00 C******************************************************
0371.00 /FREE
0372.00 QMHSNDPM(MSGID: MSGFILLIB: MSGDTA : MSGDTALEN: '*COMP':
0373.00 '*PGMBDY': PGMSTKCNT:MSGKEY:APIERR);
0374.00 /END-FREE
0375.00 C ENDSR
0376.00 C******************************************************
0377.00 C LRRTN BEGSR
0378.00 C******************************************************
0379.00 C EVAL ANS = 'Y'
0380.00 C*-------------------------------------------------------------------------+
0381.00 C ENDDSP TAG |
0382.00 C EXFMT ENDOPT |
0383.00 C*-------------------------------------------------------------------------+
0384.00 C IF ANS = 'Y'
0385.00 C N30 CLOSE QPDFULOG
0386.00 C ELSE
0387.00 C SETOFF LR
0388.00 C ENDIF
0389.00 C ENDSR
[解説]
ILE-RPG で約390ステップ数のプログラムが Pythonで書くと1/10以下の20ステップ弱で
書けてしまう。
これはPythonという開発言語だから簡単になったというのではなく
Python自体には5250アプリケーションを作る機能はないのだが
次期製品: Python.400 のAS00エンジンというサービス・プログラムが
5250アプリケーションの開発を可能にするだけでなく多くの機能を代替しているので
これほどに簡単になってしまうのである。
_
