先の単票型の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であれば驚くほど簡単になる。
