先に「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アプリケーションの開発を可能にするだけでなく多くの機能を代替しているので
これほどに簡単になってしまうのである。
_