WEB一覧表: 仕入先照会(WSIRINQ)
項目数の多い仕入先マスターを一覧表で印照会する摘要業務を
作成することができます。
選択項目を入力して,実行キーを押してください。
PYTHON プログラム . . . . . . . WSIRINQ 拡張子 .py
ディレクトリー . . . . . . . *PYTHON
...
ファイル . . . . . . . . . . . SIREMT 名前
ライブラリー . . . . . . . . QTRFIL 名前 , *LIBL, *CURLIB
HTML ディレクトリー . . . . . . '/PYTHON.400/PROJECT'
生成オプション . . . . . . . . *NONE *NONE, *ADD, *REPLACE
[解説]
項目数の多いデータ・ベースも「一覧表形式」で照会することができます。
サンプル・ライブラリー(QTRFIL)の仕入先マスター(SIREMT)を使って
一覧表形式のWEB適用業務を作ることができます。
[パラメータの説明]
PYTHON プログラム. . . . . . . . . . . . . .作成するPythonプログラムの名前とそのソースを
ディレクトリー 保管するディレクトリー名を指定します。
*PYTHON = /PYTHON/PROJECT/(PYTHON名)
としてPYTHON名のディレクトリーも自動生成されます。
十分精通するまではこの指定のままで生成してください。
ファイル. . . . . . . . . . . . . . . . . . このPythonが扱う主たるデタ・ベースの名前と
ライブラリー ライブラリー名を指定してください。
HTML ディレクトリー . . . . . . . . . . . . このPythonが使用するHTMLテンプレートを保管する
ディレクトリーの名前を指定します。
生成オプション. . . . . . . . . . . . . . . *NONE以外の:ADD(=初期作成)または *REPLACE(=置換え)を
指定してください。*SADDを指定したときは既存の同じ名前の
Pythonが存在しているか検査され存在していれば
エラーとなります。
初めてこのPythonの名前で作成するときは*ADDを
指定してください。
[基本情報の定義]
基本情報の定義
ジョブ・タイトル 仕入先照会
画面様式 3 1= 単票印刷 2= 最大表示
3= 一覧表 4= 伝票型式
数値の編集 Y Y=YES, N=NO
画面サイズ
桁 132 80, 132
行 27 24, 27
[解説]
ジョブ・タイトル. . . . . . . . : この適用業務のタイトルを入力してください。
このタイトルは適用業務画面の見出しとして使われます。
画面様式. . . . . . . . . . . . : 摘要業務のタイプを指定します。
1=単票形式 : 1レコード1画面1フィールド/行のDFUのような
基本型式の画面入力の適用業務を作成します。
2=最大表示 : 単票形式ですが1画面にフィールドをできるだけ
多く表示する画面型式の適用業務を作成します。
3=一覧表形式: SFLレコードによる一覧表形式の適用業務画面を
作成します。
4=伝票型式: 日本独自の伝票入力型の適用業務を作成します。
数値の編集. . . . . . . . . . . :数値を編集するかどうかを指定します。
画面サイズ. . . . . . . . . . . :作成する印刷装置ファイル(PRTF)のサイズを指定します。
WEBの場合はこの値は無視してください。
レコード様式の処理
ファイル SIREMT ライブラリー QTRFIL
オプションを入力して、実行キーを押してください
1= 指定
OPT 様式 定義 記述
1 DSPHEAD N 初期画面レコード
1 LISTDEF N リスト項目定義
1 ENDOPT N 終了画面
解説
画面芳樹を生成するための画面レコード様式の候補がすべて
表示されますのでそれぞれの画面様式に対するフィールドの定義を
行う必要があります。
選択欄(OPT)には初期値として1が既に表示されていますので
このままで実行キーを押すと最初のレコード:DSPHEADが選択されます。
このままで実行キーを押してください。
フィールドの選択および順序付け
ファイル SIREMT ライブラリー QTRFIL
レコード様式 SIREMTR テキスト 初期画面レコード
フィールドとその順序を選択するか,すべてを選択する F21 キーを押して
実行キーを押してください。
順序 フィールド 属性 長さ タイプ 記述
10 SRCODE キー 10 文字 仕入先コード
[解説]
選択したDSPHEADレコードに表示するフィールドの選択が要求されます。
この初期画面DSPHEADでは指定したデータ・ベース:QTRFIL/SIREMTの
アクセス・パスすなわちキー・フィールドが表示されて
順序選択の欄には初期値として10が既に表示されています。
このままで実行キーを押してください。
レコード様式の処理
ファイル SIREMT ライブラリー QTRFIL
オプションを入力して、実行キーを押してください
1= 指定
OPT 様式 定義 記述
DSPHEAD Y 初期画面レコード
1 LISTDEF N リスト項目定義
1 ENDOPT N 終了画面
[解説]
表示は元のレコード選択の画面に戻りますが
今、処理したDSPHEADレコードの選択OPT=1は消えて
次の明細画面: DSPDTA に OPT=1 が残っていますので
続けてこのままで実行キーを押すと 明細画面: DSPDTAが
選択されます。
フィールドの選択および順序付け
ファイル SIREMT ライブラリー QTRFIL
レコード様式 SIREMTR テキスト 明細画面レコード
フィールドとその順序を選択するか,すべてを選択する F21 キーを押して
実行キーを押してください。
順序 フィールド 属性 長さ タイプ 記述
0 SRCODE キー 4 文字 コード
0 SRNMK 32 文字 カナ名
0 SRNMJ 32 漢字 OPEN 仕入先名 1
0 SRNMJ2 32 漢字 OPEN 仕入先名 2
0 SRNM 12 漢字 OPEN 略名
0 SRSHOT 5 文字 略号
0 SRTEL 15 文字 TEL
0 SRFAX 15 文字 FAX
0 SFAX 2 文字 FAX短縮
0 SRFORD 1 文字 FAX注文
続く ..
F3= 終了 F15= 他のデータ・ベースの結合 F12= 取消し
F21= すべての選択
[解説]
明細画面DSPDTAの選択候補としてデータ・ベース: QTRFIL/SIREMTのすべての
フィールドが表示されます。
「F21= すべての選択」キーを押してすべてのフィールドを詮索してください。
フィールドの選択および順序付け
ファイル SIREMT ライブラリー QTRFIL
レコード様式 SIREMTR テキスト 明細画面レコード
フィールドとその順序を選択するか,すべてを選択する F21 キーを押して
実行キーを押してください。
順序 フィールド 属性 長さ タイプ 記述
10 SRCODE キー 4 文字 コード
20 SRNMK 32 文字 カナ名
30 SRNMJ 32 漢字 OPEN 仕入先名 1
40 SRNMJ2 32 漢字 OPEN 仕入先名 2
50 SRNM 12 漢字 OPEN 略名
60 SRSHOT 5 文字 略号
70 SRTEL 15 文字 TEL
80 SRFAX 15 文字 FAX
90 SFAX 2 文字 FAX短縮
100 SRFORD 1 文字 FAX注文
続く ..
F3= 終了 F15= 他のデータ・ベースの結合 F12= 取消し
F21= すべての選択
[解説]
仕入先マスターには結合ファイルは必要ありませんので
このままで実行キーを押します。
レコード様式の処理
ファイル SIREMT ライブラリー QTRFIL
オプションを入力して、実行キーを押してください
1= 指定
OPT 様式 定義 記述
DSPHEAD Y 初期画面レコード
LISTDEF N リスト項目定義
1 ENDOPT N 終了画面
[解説]
最後に終了画面を定義するために実行キーを押します。
終了画面
選択項目を入力して、実行キーを押してください
終了画面を作成しますか ? Y Y=YES, N=NO
[解説]
終了画面は必要なのでこのままで実行キーを押します。
PYTHON プログラム定義の終了
選択項目を入力して、実行キーを押してください
プログラムの保管 Y Y=YES, N=NO
プログラムの実行 N Y=YES, N=NO
選択項目 Y=YES の場合
実行のタイプ 1 1= 変更 , 2= 表示
DDS ソースの保管 Y Y=YES, N=NO
PYTHON ソースの保管 Y Y=YES, N=NO
プログラムの保管 Y=YES の場合
PYTHON プログラム WSIRINQ.PY 名前 *.PY
ディレクトリー /PYTHON.400/PROJECT/PSIRINQ/PSIRINQ.PY
権限 *LIBCRTAUT
テキスト 仕入先照会
HTML ソースの保管 Y=YES の場合 名前, *LIBCRTAUT
HTML ディレクトリー /PYTHON.400/PROJECT
[解説]
最後にソースを生成する画面が表示されます。
プログラムの保管. . . . . . . . . . . .: Y=Pythonプログラムの保管を指示します。
プログラムの実行. . . . . . . . . . . .: 保管直後に実行するかどうかを指示します。
まだ慣れないうちは N としてください。
HTML ソースの保管 . . . . . . . . . . .: HTMLテンプレートを保管するディレクトリーの名前です。
PYTHON プログラム. . . . . . . . . . : 保管するPYTHONプログラムの名前を指示します。
拡張子.PYが必要です。
ディレクトリー. . . . . . . . . . . .: PYTHONを保管するIFSディリクトリーの名前を指示します。
/PYTHON.400/PROJECT/(PYTHOPN名)/(PYTHON名.PY)
の形式名にしてください。
PYTHONのプロジェクト(/PYTHON.400/PROJECT)の配下に
PYTHON名と同じ名前のプロジェトクが作成されて
その配下にPYTHONプログラム(PYTHON名.PY)が
保管されます。
プロジェクトの配下にはHTMテンプレートも保管される
場合があります。
実行キーを押すと表示装置ファイル(DSPF)のDDSソースの作成に続いて
印刷装置ファイル(DSPF)も作成され(CRTPRTF)PYTHONプログラムも指定した場所に
保管されます。
PYTHONはコンパイルは必要ありません。
「PSIREMT.PY を保管しました 」
のような完了メッセージが表示されればWizard生成は成功です。
実行は「13. PYTHON データの印刷(PRTPTN)」
によって実行することができます。
[印刷指定コマンドの追加]
印刷適用業務の作成では実行時の印刷範囲の
指定するコマンドとCLプログラムも自動生成されます。
これによって印刷の範囲を実行時に動的に
指定することができるようになります。
[生成されたPYTHONソースは?]
どのようなPYTHONソースが生成されたのか気になるところですが
ライブラリー: PYTHON.400 がライブラリー・リストに存在していれば
コマンド入力画面で
EDTPTN (PYTHON名)
だけでPYTHONソースの内容を見ることができます。
PYTHONを実行する印刷装置ファイル(PRTF)のDDSソースは
STRSEU QTRSRC/QPRTSRC.(PYTHON名)
でオープンすることができます。
DSPPTN WSIRINQ
で実行してみると
のようにプロンプト画面 が表示されるので
このままで実行すると次のように
明細画面が表示されます。
[解説]
次に EDIPTN WSIRINQ で Pythonソースを次のように表示することが
できます。
#! /usr/bin/env python3.4
import sys
import os
import re
import ibm_db2
import bottle2
import urllib.parse
dspmod = sys.argv[1]
SFLPAG = 10 # 一度の通信でクライアントに返すレコード数
add_count = 0
chg_count = 0
dlt_count = 0
#*************************************************************#
@bottle2.route('/init', method=["GET", "POST"])
def init():
#*************************************************************#
# 初期画面の HTML を表示する。
# パラメータを受け取る
params = bottle2.request.params.decode()
# パラメータがあれば初期画面の HTML にセットする。
values = [{
'SHCODE': params.get('SHCODE', ''),
}]
# ブラウザに DSPHEAD.HTM を出力する。
return bottle2.template('DSPHEAD.HTM', {
'dspmod': dspmod,
'values': values,
'msg': params.get('MSG', ''),
})
#*************************************************************#
@bottle2.route('/input', method=["GET", "POST"]) # 入力切替
def input():
#*************************************************************#
# ブラウザからの入力値を受け取る。
params = bottle2.request.query.decode()
# 白紙の明細画面の HTML を表示する
return bottle2.template('DSPTOP.HTM', {
'dspmod': 'INPPTN',
'values': [{}],
})
#*************************************************************#
# 明細画面 # データ検索
@bottle2.route('/query', method=["GET"])
def query():
#*************************************************************#
# ブラウザからの入力値を受け取る。
params = bottle2.request.query.decode()
# 明細画面の HTM を表示する。
values = [{
'SHCODE': params.get('SHCODE', ''),
}]
return bottle2.template('DSPTOP.HTM', {
'dspmod': dspmod,
'values': values,
})
#*************************************************************#
# 挿入画面用の空っぽのレコードをブラウザに返す。
@bottle2.route('/template', method=["GET", "POST"])
def template():
#*************************************************************#
return bottle2.template('LISTDEF.HTM', {
'dspmod': 'WRTPTN',
'value': {},
})
#*************************************************************#
# レコードのデータをブラウザに返す。
@bottle2.route('/record', method=["GET", "POST"])
def record():
#*************************************************************#
# DB2 に接続する。
with ibm_db2.connected() as conn:
# ブラウザからの入力値を受け取る。
params = bottle2.request.params.decode()
# SQL を組み立てる。
sql = '''
SELECT T01.SHCODE
,T01.SHNAME
,T01.SHTANK
,T01.SHSCOD
,T02.HNSNAM
FROM QTRFIL/SHOHIN T01
LEFT JOIN QTRFIL/HINSHU T02
ON T01.SHSCOD = T02.HNSCOD
WHERE T01.SHCODE >= ?
ORDER BY T01.SHCODE
OFFSET ? ROWS
FETCH NEXT ? ROWS ONLY
'''
stmt = ibm_db2.prepare(conn, sql);
ibm_db2.bind_param(stmt, 1, params['SHCODE']) # SHCODE を SQL にセットする。
ibm_db2.bind_param(stmt, 2, params['_RRN']) # RRN を SQL にセットする。
ibm_db2.bind_param(stmt, 3, SFLPAG) # SFLPAG を SQL にセットする。
# SQL を実行する。
ibm_db2.execute(stmt)
# 結果のレコードを取得する。
values = []
row = ibm_db2.fetch_assoc(stmt)
while row != False:
row['SHTANK'].edit('1')
values.append(row)
row = ibm_db2.fetch_assoc(stmt)
:
# 結果をテンプレートに埋め込む。
text = ""
for value in values:
text += bottle2.template('LISTDEF.HTM', {
'dspmod': dspmod,
'value': value,
})
# 明細画面の HTM を表示する。
bottle2.response.content_type = 'text/plain';
return text
[解説]
最初に
import sys from as400 import *
によって
Python.400フレーム・ワークが提供する「AS400エンジン」を
インクルードします。
WEB適用業務の場合のデータ・ベース・アクセスは
SQL命令によってDB2/400データ・ベースをアクセスして
結果のレコードをFetch命令によって取り出します。
SQL文の作成は
sql = '''
SELECT T01.SHCODE
,T01.SHNAME
,T01.SHTANK
,T01.SHSCOD
,T02.HNSNAM
FROM QTRFIL/SHOHIN T01
LEFT JOIN QTRFIL/HINSHU T02
ON T01.SHSCOD = T02.HNSCOD
WHERE T01.SHCODE >= ?
ORDER BY T01.SHCODE
OFFSET ? ROWS
で宣言されています。
SQL文でアクセスしていますのでIBM iのRPG命令を知らない方でも
容易にSQLによるデータ・ベース・アクセスとして
Pythonプログラムを理解することができます。
またPythonはbottleフレーム・ワークというHTTPサーバーを
持っていますので事前にApcheなどのHTTPサーバーを起動させて
準備しておく必要もありません。
# HTTP サーバーを起動する。 bottle2.run(host='', port=8080, quiet=True)
によってbottle2というフレーム・ワークによって
初期画面HTMLが表示されます。
bottle2 とは Pythonで用意されているbottleフレーム・ワークを
Python.400フレーム・ワークで拡張しはたもので
ブラウザが自動的に起動されるように機能を拡張したものです。
その他のこのPYTHONプログラムの詳細はこちらを参照してください。