Python

18. Python.400 サンプル紹介(1)

Python.400によるサンプルを紹介する。
先に紹介したPythonサンプルはPASE環境に表示するだけの
サンブルであるので実用のアプリケーションとして
使用することはできずあくまでもPythonを体験するだけのもので
あったのだがここに紹介するPython.400アプリケーションは
DSPFをインターフェースとする実用的なPython.400アプリである。
_

[ Python.400 : @SHOHIN の実行]

 商品マスター登録                               モード  . . :    変更                   
 様式  . . . . :   DSPDTA01                     ファイル  . :   @SHOHIN                 
                                                                                        
 商品コード :   NV-CF1                                                                  
 商品名 :        Cカセット編集ビデオ                                                   
 単価 :            58,000                                                               
 品種コード :   0002  ビデオデッキ                                                      
                                                                                
                                                                                        
                                                                                        
F3= 終了                F5= 最新表示             F9= 挿入             F10= 入力         
F11= 変更               F23= 削除                F12= 前画面          F13= 出力待ち行列                

[解説]

これは Python.400のWizardによって自動生成された最も簡単な
Python.400アプリケーションである。

CHGPTN @SHOHIN (=Change Python)によってPythoon.400アプリケーション: @SHOHINを
更新モードで起動して実行することができる。(=Display Python)

DFUと同じように DSPPTN @SHOHIN + [実行]すれば表示モードで
Python.400アプリを起動することができる。
_

もちろんDFUと同じように更新モードで更新すれば
監査ログが印刷出力される。

この画面はDFUのように見えるが

品種コード :   0002  ビデオデッキ

にあるように品種マスター(HINSHU)に品種コードで CHAINして
品種名: ビデオデッキ を表示していて
最大32個までのファイルを結合して表示することができる。
(=実は32個というのはRPGに合わせただけのものであって
 技術的にはもっと多くの結合も可能である。)

さてこの画面はDSPFであり Python.400アプリでは次のようなDSPFソースを
自動生成する。

[ DPSF: @SHOHIN ]

0001.00      A                                      DSPSIZ(27 132 *DS4)                   
0002.00      A  *DS4                                MSGLOC(27)                            
0003.00      A                                      PRINT                                 
0004.00      A                                      HELP                                  
0005.00      A                                      HLPSCHIDX(*LIBL/QHPW1)                
0006.00      A                                      ALTHELP(CA01)                         
0007.00      A                                      HLPTITLE(' データ入力画面 ')          
0008.00      A                                      HLPPNLGRP('DFU/DESL/GEN' QHDZDF1)     
0009.00      A          R DSPHEAD                   TEXT(' 初期画面レコード ')            
0010.00      A                                      CHANGE(01)                            
0011.00      A                                      CF03(03 ' 終了 ')                     
0012.00      A                                      CF05(05 ' 再表示 ')                   
0013.00      A                                      CF06(06 ' 様式の選択 ')               
0014.00      A                                      CF09(09 ' 挿入 ')                     
0015.00      A                                      CF10(10 ' 入力 ')                     
0016.00      A                                      CF11(11 ' 変更 ')                     
0017.00      A                                      ROLLUP(07 ' ROLLUP')                  
0018.00      A                                      ROLLDOWN(08 'ROLLDWN')                
0019.00      A                                  1  2' 商品マスター登録 '                  
0020.00      A*( 表示モード記述 )                                                         
0021.00      A                                  1 49' モード  . . :'                      
0022.00      A            DSPMOD        14A  O  1 66                                      
0023.00      A                                  2  2' 様式  . . . . :'                    
 :
  :

[解説]

このWizardによって自動生成されるのでDSPFがまだわからない人でも
作ることができる。
_

[ Pythonソース]

#*********************************************************#  
#*                                                           
#*  プログラム名   : @SHOHIN.PY                              
#*  タイプ         : PYTHON                                  
#*  APP タイプ     : 単票入力 (*SGLCOL)                      
#*  作成日         : 2025/06/02               15:10:06       
#*  作成者         : QTR                                     
#*  ディレクトリー :  /PYTHON/PROJECT/@SHOHIN                
#*  使用ファイル   : QTRFIL/SHOHIN                           
#*                   QTRFIL/HINSHU                           
#*  監査報告書     : Y                                       
#*  数値の編集     : Y                                       
#*  画面サイズ                                               
#*    桁           : 132                                     
#*    行           : 27                                      
#*                                                           
#*********************************************************   
#*                   QTRFIL/HINSHU                                            
#*  監査報告書     : Y                                                        
#*  数値の編集     : Y                                                        
#*  画面サイズ                                                                
#*    桁           : 132                                                      
#*    行           : 27                                                       
#*                                                                            
#*********************************************************                    
import sys                                                                    
from as400 import *                                                           
                                                                              
CallType(sys.argv[1])                                                         
Open("QTROBJ/@SHOHIN", "DSPF")                  #  表示装置ファイルをオープン 
Open("QTRFIL/SHOHIN", "FILE")                       #  商品マスターファイル   
Open("QTRFIL/HINSHU", "FILE")                       #  品種マスターファイル   
                                                                              
while True:                                                                   
    DSPHEAD.Exfmt()                        #  初期画面を表示                  
                                                                               
CallType(sys.argv[1])                                                          
Open("QTROBJ/@SHOHIN", "DSPF")                  #  表示装置ファイルをオープン  
Open("QTRFIL/SHOHIN", "FILE")                       #  商品マスターファイル    
Open("QTRFIL/HINSHU", "FILE")                       #  品種マスターファイル    
                                                                               
while True:                                                                    
    DSPHEAD.Exfmt()                        #  初期画面を表示                   
    if not DSPHEAD.SHCODE.Chain(SHOHIN):                                       
        continue                                                               
    bCHG = False                                                               
    DSPDTA01.SHCODE = SHOHINR.SHCODE                                           
    DSPDTA01.SHNAME = SHOHINR.SHNAME                                           
    DSPDTA01.SHTANK = SHOHINR.SHTANK                                           
    while True:                                                                
        SHOHIN.SHSCOD.Chain(HINSHU)                                            
        DSPDTA01.HNSNAM = HINSHUR.HNSNAM                                       
        DSPDTA01.Exfmt()                     #  明細レコード画面を表示         
   bCHG = False                                                       
   DSPDTA01.SHCODE = SHOHINR.SHCODE                                   
   DSPDTA01.SHNAME = SHOHINR.SHNAME                                   
   DSPDTA01.SHTANK = SHOHINR.SHTANK                                   
   while True:                                                        
       SHOHIN.SHSCOD.Chain(HINSHU)                                    
       DSPDTA01.HNSNAM = HINSHUR.HNSNAM                               
       DSPDTA01.Exfmt()                     #  明細レコード画面を表示 
       if IN[1]:                                                      
           bCHG = True                                                
       elif bCHG:                                                     
           SHOHINR.SHCODE = DSPDTA01.SHCODE                           
           SHOHINR.SHNAME = DSPDTA01.SHNAME                           
           SHOHINR.SHTANK = DSPDTA01.SHTANK                           
           if SHOHINR.Update():                                       
               break                                                  

[解説]

■ AS400エンジンのインクルード

_

import sys                                                                    
from as400 import *                                                           

 とは AS400エンジンをインクルードすることを意味している。
AS400エンジンとは Python.400提供のサービス・モジュール(*SRVPGM)のことであり
ILE-RPGの演算命令を多くをPythonでも実行できるようにする機能を提供する。
このAS400エンジンの演算命令はILE-RPGの演算を模したものではなく
ILE-RPGが実際に内部で行っている演算と全く同じ機能を提供しているので
信頼性が高い。

■ 代行機能

_

Open("QTROBJ/@SHOHIN", "DSPF")                  #  表示装置ファイルをオープン  
Open("QTRFIL/SHOHIN", "FILE")                       #  商品マスターファイル    
Open("QTRFIL/HINSHU", "FILE")                       #  品種マスターファイル

はDSPFやデータ・ベースをオープンする命令であるが
クローズする命令はどこにも記述されていない。
プログラムを終了するときにオープン済みのファイルをクローズすることは
当たり前なのでいちいち記述しなくてもAS400エンジンがプログラマーに代わって
オープン済みのファイルをクローズして終了する。
このように当たり前の作業はプログラマーに代わって行うことを
代行機能と呼ぶ。

Python.400ではプログラマーに代わって多くのことをAS400エンジンが
代行して実行する。
これによってPythonソースの記述は大幅に少なくなる。
F3=終了やF12=前画面などはもちらんROLL UP/DOWNや横スクロールなど
従来のRPGプログラマーが苦手としていた処理の大半をAS400エンジンが
替わって行うので

 ・ソース記述が大幅に少なくなる。
・無駄なソース記述がなく見やすいソースとなる。
・余計なバグの発生がなくなる。
・短期間で高信頼性のプログラムの開発ができる

の利点がある。

■ 代行機能の拡張

 それでは独自にF3=終了のときの記述を変更したいときは
 どのようにすればよいか?
その記述を明示的に記述するだけでよい。
記述あればそれが優先して実行されるし
なければ代行機能によって処理される。
このように代行機能は柔軟に処理される仕組みである。

■ オブジェクト指向の記述

_

 最もPython.400ソースを特徴づけられているのは

 DSPHEAD.SHCODE.Chain(SHOHIN): 

 や

  DSPDTA01.SHCODE = SHOHINR.SHCODE 

に示されている。

表示画面レコード: DSPHEAD に含まれてといる項目としての
SHCODEはプロパティ(=属性)である。

 DSPDTA01.SHCODE = SHOHINR.SHCODE

は商品マスター・レコード SHOHINR の 商品コード: SHCODEの値を
表示画面レコード: DSPDTA01 の商品コード: SHCODEに 移す(=)と
いう命令である。

RPGのように MOVE や MOVEL ではなく = で示しているので
代入という処理がわかりやすい。
また RPGでは商品レコードのSHCODEが同じ名前のSHCODEが
DSPFに定義されていれば同じメモリを意味するが
Python.400では 同じ名前であっても商品レコードのSHCODE(SHOHINR.SHCODE)と
DSPFのSHCODE(DSPDTA01.SHCODE)は別物として管理される。
このようにオブジェクト別のプロパティ(=フィールド)は別物として
オブジェクトとともに

 DSPDTA01.SHCODE = SHOHINR.SHCODE

として表示することによってひと目で演算の内容を理解することができる。
オブジェクトには

SHOHIN.SHSCOD.Chain(HINSHU)

のようにChainというメソッド(=命令)も併せて指定することができる。
このようにオブジェクトにはプロパティ(=属性)とメソッド(=動作)の
二つの要素を持っている。
これはVC++やC#, Javaなどのオープン系言語の共通する概念である。

このようにオブジェクト指向の記述によって
ソースの内容が読み手に伝わりやすくなる。
Python.400はRPGプログラマーにとってわかりやすくなることを
指向しているのではなくむしろ全くの未経験者を初めとする
オープン系の特にPython経験者にとってわかりやすく
なるように指向している。
PythonプログラマーがIBM iの開発に違和感なく取り組めるように
指向している。

■ 洗練されたオープン系のソース

このようにPython.400のソースは

・ILE-RPGの演算をPython.400で行える。
・DB2/400にレコード・レベルでアクセスできる。

… 数十万件や数百万件のデータ・ベースにも
Python.400で一瞬でアクセス更新することができます。
( ibm-dbのようなSQLアクセスではできません)

・堅牢なPowerSystemのDB2/400データ・ベースと
長年によって蓄積されてきたソフトウェア資産を
そのまま生かして新しくPython.400で開発できる。

・Pythonプログラマーがオブジェクト指向で
IBM iの開発ができる

ことを目指している。

Python.400はオブジェクト指向の洗練されたソースでの
開発を可能にするフレーム・ワークである。

さらに他のパターンのPython.400によるソースを紹介する予定である。

※ 技術ショト・セミナーではPythonを実際に使って体験するセミナーを
予定している。