Python

19. Python.400サンプル紹介(2)

先の単票型のPython.400のサンプルに続いて
SFLレコード形式のサンプルを紹介しよう。
これも商品マスター(QTRFIL/SHOHIN)を表示する
シンブルなものである。
_

[Python.400:@SHOINQの実行]

商品マスター照会                               モード  . . :    表示                                  
様式  . . . . :   SFCTL01                      ファイル  . :   @SHOINQ                                
                                                                                                      
商品コード    商品名                    単価       品種コード   品種名                                
V-BS30S       目次ビデオ                 165,000  0002                                                
V-BS50S       ビデオ画王                 200,000  0002          ビデオデッキ                          
V-CF1         Cカセット編集ビデオ        58,000  0002          ビデオデッキ                          
V-CF2         薄型テレビ                  98,000  0003          ビデオデッキ                          
V-CF81        更新テスト                  58,000  0004          コンボ                                
V-CF9         漢字テスト                  19,000  0002          エレクトーン                          
V-F850        音声録画ビデオ             140,000  0002          ビデオデッキ                          
V-HK1         歌えるビデオ                90,000  0002          ビデオデッキ                          
V-H1T-S       みんなのビデオ              69,800  0002          ビデオデッキ                          
V-SX10        ビデオ画王                 115,000  0002          ビデオデッキ                          
V-W1          世界放送方式ビデオ         350,000  0002          ビデオデッキ                          
X-AZ1         液晶テレビ 80 インチ       300,000  0001          ビデオデッキ                          
X-BZ1         液晶テレビ 55 インチ       100,000  0002          カラーTV                            
X-DT75        CDラジオカセット          53,800  0003          ビデオデッキ                          
C-CH150       超ミニ・コンポ              70,000  0003          コンボ                                
C-CH505       パーソナル・ミニコンポ     100,000  0003          コンボ                                
                                                                                                      
                                                                                                      
F3= 終了                F12= 前画面                               F23= 削除          F13= 出力待ち行列 

[解説]

単純なSFLレコード照会ではあるが

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

のように品種マスター(QTRFIL/HINSHU)と結合して品種名を
表示している。このようなAPPはDFUでは作ることはできない。

[Pythonソース]

#*********************************************************# 
#*                                                          
#*  プログラム名   : @SHOINQ.PY                             
#*  タイプ         : PYTHON                                 
#*  APP タイプ     : SFL 一覧表示 (*SFL)                    
#*  作成日         : 2025/06/03               06:46:41      
#*  作成者         : QTR                                    
#*  ディレクトリー :  /PYTHON/PROJECT/@SHOINQ               
#*  使用ファイル   : QTRFIL/SHOHIN                          
#*                   QTRFIL/HINSHU                          
#*  監査報告書     : Y                                      
#*  数値の編集     : Y                                      
#*  画面サイズ                                              
#*    桁           : 132                                    
#*    行           : 27                                     
#*                                                          
#*********************************************************  
import sys                                                  
from as400 import *                                                              
                                                                                 
CallType(sys.argv[1])                                                            
Open("QTROBJ/@SHOINQ", "DSPF")                     #  表示装置ファイルをオープン 
Open("QTRFIL/SHOHIN", "FILE")                       #  商品マスターファイル      
Open("QTRFIL/HINSHU", "FILE")                       #  品種マスターファイル      
                                                                                 
while True:                                                                      
    DSPHEAD.Exfmt()                                                              
    DSPHEAD.SHCODE.SetLL(SHOHIN)                                                 
    DSPDTA = SFCTL01                                                             
    DSPEND = DSPEND01                                                            
    while True:                                                                  
        ENDRRN = TOPRRN + SFLPAG - 1                                             
        for RRN1 in range(TOPRRN, ENDRRN + 1):                                   
            if SHOHIN.Read() == EOF:                                             
                 break                                                           
            SHOHINR.SHSCOD.Chain(HINSHU)       #  品種マスターファイル           
           SHOHINR.SHSCOD.Chain(HINSHU)       #  品種マスターファイル  
           SFREC01.SHCODE = SHOHINR.SHCODE                             
           SFREC01.SHNAME = SHOHINR.SHNAME                             
           SFREC01.SHCODE = SHOHINR.SHCODE                             
           SFREC01.SHSCOD = SHOHINR.SHSCOD                             
           SFREC01.HNSNAM = HINSHUR.HNSNAM                             
           SFREC01.SFLWrite(RRN1)                                      
        DSPEND01.Write()                                                
        SFCTL01.Exfmt()             # SFL  コントロール/レコードを表示 

[解説]
_

DSPHEAD.Exfmt() 

は初期画面の開始キーの入力であるが
F3=終了の処理は定義されていない。
先に説明したように Exfmtの代行処理に任せるので
F3=終了は記述する必要はない。
次に

DSPHEAD.SHCODE.SetLL(SHOHIN)

は ILE-RPGのSETLL命令を実行している。
表示画面レコード: DSPHEAD の変数(=フィールド) SHCODE で
SETLLを実行している。

while True: 

は無限LOOPの実行を示していて

ENDRRN = TOPRRN + SFLPAG - 1

として数字の変数: ENDRRN が代入によって定義される。
TOPRRN は SFLの最初のRRNであって初期は自動的に値は1に
セットされるPython.400の予約語である。
SFLPAG もPython.400のSFLベージ数を示す予約語である。
ILE-RPGではRPGプログラムの中からSFLページ数を読むことは
できないが Python.400では AS400エンジン(*SRVPGM)によって
SFLページ数を予約語として読むことができる。
_

そこで

for RRN1 in range(TOPRRN, ENDRRN + 1):

によって TOPRRN~ENDRRN + 1までをLOOPして商品マスター・レコード(SHOHINR)を
読み取る。

 if SHOHIN.Read() == EOF:                                             
                 break 

が商品マスター(SHOHIN)の読み取りであって EOF(=End of File)になると
LOOPから抜ける(break)

読取りが成功すると

 SFREC01.SHCODE = SHOHINR.SHCODE                             
  SFREC01.SHNAME = SHOHINR.SHNAME 
  :

によって商品マスター・レコード(SHOHINR)の各変数(=フィールド)の値を
SFLレコード(SFREC01)の各変数(=フィールド)に埋め込む。
このようにオブジェクトの変数をビリオドを使って所属変数を
表すのはオブジェクト指向であってオープン系の人にとっては
極めてわかりやすい表現となる。
_

ILE-RPGの場合は単にフィールド名だけの記述になるので
そのフィールドがどのオブジェクト(=レコード)のものなのか
自分で調べなければなない。
ところが (オブジェクト).(プロパティ)形式の記述であれば
ひと目でどのオブジェクトのものなのかわかるので
非常にわかりやすい表現方法となるのである。
このようにオブジェクト指向の言語では
オブジェクトに対して

プロパティ(=オブジェクトに属する変数)
メソッド(=オブジェクトに定義されている関数)

のふたつの要素から成っている。
これはMicrosoft の VC++ やJavaのクラス(=Class)とも
同じ概念である。
さて

SFREC01.SFLWrite(RRN1)

でSFLレコードをLOOPして繰り返し出力した後は 

SFCTL01.Exfmt()

で表示画面レコード SFCTL01 のメソッド: Exfmtによって
画面を入出力している。
ところがその後には

・F3=終了
・F12=前画面
・ROLL UP/DOWN

の記述は一切見られない。これもExfmtの代行処理に含まれているので
記述する必要はなくAS400エンジンによってそれらの処理は行われる。

このようにSFLレコード形式の処理でもAS400の代行処理によって
多くの記述を割愛することができる。
もちろん手動でそれらの記述を明示的に記述するのであれば
記述した処理が代行処理より優先されて実行されるのは
言うまでもない。

いずれにせよSFLレコード形式の適用業務も
Python.400であれば驚くほど簡単になる。