php on ibm i 実践 ·...
TRANSCRIPT
オープンソース協議会 – IBM i2014年度 第5回勉強会
PHP on IBM i 実践
2015/4/17株式会社オムニサイエンス 田中昌宏
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 1
アジェンダ
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 2
会社紹介
サンプルアプリの概要• 機能イメージ
• ポイント
• 画面イメージ
• 前提となる環境
• 使用するライブラリー等
サンプルソースの解説• 処理詳細
• プログラム構成(Web)
• HTML、CSS、Javascript、PHP
• ストアドプロシージャ
• CL
• RPG
• 連携のポイント
• デバッグ方法
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 3
会社紹介
~オムニサイエンスについて~
会社紹介
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 4
会社名
創業
所在地
社員数
:
:
:
:
株式会社オムニサイエンス
1987年6月18日
東京都千代田区内神田1-5-4 ミヤコビル7F
40名
IBM i(RPG)
Web (PHP)
SolutionMedia
IBM i の既存資産を有効活用したモダナイゼーション
PHP on IBM i に特化した受託開発・導入支援サービス
IBM iユーザーの声を製品開発に活かした
新しいサービス
株式会社オムニサイエンスシステム開発部 部長田中昌宏[email protected]
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 5
サンプルソースの概要
サンプルソースの概要
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 6
機能イメージ
1.ログイン
ユーザーマスタ
2.検索条件入力
抽出処理CL(RPG) 在庫マスタ 各種マスタ
抽出結果ワーク
3.結果一覧表示
4.詳細表示 5.Excel出力
サンプルソースの概要
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 7
ポイント• レスポンシブデザイン
Bootstrapを用いて、レスポンシブデザインを実現単一のソースで様々な画面サイズに対応しています
• Ajax(非同期)通信
JavaScriptのHTTP通信機能を使って、Webページのリロードを伴わずにサーバとデータのやり取りを実装しています
• CL,RPG連携
抽出処理はRPGで実装しており、 PHPからはストアドプロシージャを用いて連携しています
• Excel出力
PHPExcelを用いて、抽出結果からExcelブックを作成しダウンロード可能
サンプルソースの概要
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 8
画面イメージ(デモ)
サンプルソースの概要
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 9
前提となる環境
サーバー
クライアント
ハードウェアIBM Power SystemsIBM i ( System i、i5、iSeries )
オペレーティングシステム i5/OS V5R4 以降
WebサーバーZend Server for IBM i Version5.1 以降PHP 5.3 以降
ブラウザ IE 8以降、Safari 5以降、Firefox 3.6以降、Chrome 6以降
サンプルソースの概要
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 10
使用するライブラリー等
ライブラリ 説明
jQuery 1.11.2 Javascriptを容易に記述できるように設計されたjavascripライブラリです。
DataTables 1.10.6 HTMLのテーブルにソートやページング、フィルタリングなどの動きをつけるjQueryのプラグインです。
Bootstrap 3.3.4 見た目を整えたり、レスポンシブなWebデザインを簡単に作成できるCSSのフレームワークです。
DataTableBootstrap DataTablesの見た目をBootstrapに合わせたデザインに変更できるDataTablesのプラグインです。
PHPExcel PHPでエクセルを作成するPHPライブラリーです。
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 11
サンプルソースの解説
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 12
処理詳細
• ログイン画面
• 在庫検索一覧画面
ユーザーマスタ
ログインクリック
Ajaxリクエスト・レスポンス
ログインチェックPHP
logincheck.php
ユーザーIDとパスワードを受け取り、ユーザーマスタを検索し、結果を返す
※パスワードは復号してチェック
SQL
ログインOKの場合、一覧画面へ
検索クリック
Ajaxリクエスト・レスポンス
検索条件入力チェックPHP
modalcheck.php
検索条件:倉庫コードが未入力の場合
エラーを返す
検索条件入力エラー有りの場合、エラーメッセージを表示
エラー無しの場合、検索処理を実行
一覧表示PHP
list.php
レスポンス
リクエスト
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 13
検索処理実行
Ajaxリクエスト・レスポンス在庫検索処理
listAjax.php
検索条件内容をパラメータとして、
ストアドプロシージャをCALL
リターンコード="OK"の場合、
在庫一覧/詳細ワークから一覧表示データ
をJSON形式で返す
【パラメータ】
倉庫コード
商品コードFROM
商品コードTO
商品名
リターンコード
ストアドプロシージャ
ZAI001P
在庫一覧/詳細ワーク作成CL
ZAI001C
在庫一覧/詳細ワーク抽出RPG
ZAI001P
在庫マスタ
在庫一覧/詳細ワーク
ZAIWRK(QTEMP)
商品マスタ
倉庫マスタ
【RPG処理】
検索条件をもとに在庫マスタ、商品マスタ、
倉庫マスタから在庫データを抽出・編集し、
在庫一覧/詳細ワークを出力する
SQLSQL
レスポンスされたJSONデータを
グリッドに一覧表示する
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 14
詳細クリック リクエスト
詳細表示PHP
detail.php
在庫一覧/詳細ワーク
ZAIWRK(QTEMP)
SQL
詳細画面を表示
レスポンス
Ajaxリクエスト・レスポンス
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 15
Excel出力実行Excel出力処理
excel.php
在庫一覧/詳細ワーク
ZAIWRK(QTEMP)Excel生成OKの場合、ダウンロード要求
ダウンロードPHP
download.php
レスポンス
リクエスト
SQL
PHPExcelでExcelファイルを生成
ダウンロードを開始
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 16
プログラム構成(Web)
omniwork
ajax ajaxファイル
common
common.php
config.php
msg.phpimage
lib
phplib PHPExcel
Weblib
Bootstrap
DataTables
DataTableBootstrap
Jquery
osc
temp
画面PHPファイル
ajax ajax通信で使用するファイルを格納しています。
common PHPで共通でインクルードするファイルを格納しています。
image システムで使用する画像を格納しています。
lib システムで使用するライブラリを格納しています。
temp Excelダウンロードファイルを一時的に格納しています。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 17
HTML、CSS、Javascript、PHP
• ナビゲーションバーの設置
ナビゲーションはBootstrapのnavbarクラスを使って作成しています。このクラスを使うことによって、レスポンシブでデザインの整ったナビゲーションを作成することができます。
画面幅が小さくなるとメニューが非表示になり、右にボタンが表示されます。
右のボタンをクリックすると、非表示になっていたメニューが下に表示されます。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE18
ナビゲーションの枠組みは以下のようになっています。
・HTMLのnavタグにクラスnavbarを指定・navタグの中にdivを2つ作成・作成したdivにそれぞれ、クラスnavbar-headerとnavbar-collapseを指定します。・navbar-headerの中に画面幅が狭くなった時に表示するボタンを作成します。
divタグclass=“navbar-header“・画面幅に関係なく常に表示するものを入れる(プロジェクト名など)・画面幅が狭くなった時に表示するボタンを入れる
navタグclass=“navbar "
divタグid=“navbar-content”class=“navbar-collapse“・画面幅が広い時に表示するメニューを入れます。・ここに入れたメニューは画面幅が狭くなった時、ボタンを押すことで表示されます。
ボタンclass=“navbar-toggle collpase“ data-target=“navbar-content”・画面が狭くなった時に表示するボタンです。・Data-targetにnavbar-contentを指定します。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 19
・詳細画面のレスポンシブ設計
詳細画面はBootstrapのクラスを使ってレスポンシブな画面デザインを実現しています。画面の幅の伸縮に応じて画像のサイズや位置が変更されるようになっています。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE
20
詳細画面の枠組みは以下のようになっています。
・Bootstrapのpanelクラスを使って、panelのbody内で左右の切り分けをしています。・col-md-4とcol-md-8クラスで左右の幅の比率を設定しています。
以下のようなクラスの枠組みにすることで、画面幅が狭くなるとleft-panel内にあるコンテンツが上に移動し、right-panelにあるコンテンツが下に移動するようになります。
divタグclass="panel-heading"
divタグclass="col-md-4
left-panel“
詳細class="col-md-8 right-panel"
画像class="img-responsive"
divタグclass="panel-body"
divタグclass="panel "
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 21
・ajaxについて
ajaxはリロードをせずにサーバーとの通信を行うjavascriptの技術です。サンプルソースではjQueryの$.ajaxを使って非同期でPHPと通信を行っています。
下記はログイン画面のajax処理です。ユーザーが入力したIDとパスワードをサーバーに送信して、該当ユーザーがいればlist.phpへ画面遷移し、いなければエラーメッセージを表示しています。
$.ajax({
type:'POST', url:'ajax/logincheck.php',
data:$("#form").serializeArray(),
dataType:'json',
success:function(res){
//エラーがある場合はエラーメッセージを表示
if(res.RTN === false){
$("#errmsg").html(res.MSG);
//エラーが無ければlist.phpに画面遷移
}else{
location.href = 'list.php';
}
}
});
serializeArrayはformデータを配列に変換するメソッドです。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 22
type HTTP通信の種類です。POSTかGETを指定します。
url 通信を行う対象のファイルを指定します。
Data 通信を行う対象のファイルに送信するデータを指定します。
dataType サーバーから返されるデータの型を指定します。Javascriptが読みやすいjsonの型を指定するのが一般的です。
Success ajax通信が成功した場合に呼び出されるイベントを記述します。dataTypeで指定した型でサーバーからのレスポンスを受けます。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 23
・DBについて
PHPでデータベースを扱う時は「db2_connectで接続」→「任意のdb2関数でSQLを実行」→「db2_closeで切断」という流れになります。
function cmDbCon(){
$user = RDB_USER; //config.phpで定めた定数です。値は’’です。
$password = RDB_PASSWORD; //config.phpで定めた定数です。値は’’です。
$database = RDB; //config.phpで定めた定数です。値は’*LOCAL’です。
$option = array(
‘i5_naming’=> DB2_I5_NAMING_ON,//PHPの定数です。
‘i5_libl’ => RDB_LIBL//config.phpで定めた定数です。値は’QTEMP QGPL OMNIWORK’です。
);
$con = db2_connect($database, $user, $password,$option);
return $con;
}
DBの接続はcommon.phpのcmDbCon関数で行っています。
接続先ホスト、ユーザーID、パスワード 接続オプション
接続オプションは”i5_”からはじまります。上記の「i5_libl」はライブラリリストを指定しています。「i5_naming」はライブラリリストを使う為のオプションです。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 24
detail.php(商品詳細画面)
$con = cmDbCon(); //DB接続
$sql = '';
$sql .= ' SELECT * FROM ZAIWRK ';
$sql .= ' WHERE WKSOCD = ? ';
$sql .= ' AND WKSHCD = ? ';
$param = array($wksocd,$wkshcd);
$rs = cmFetchAll($con,$sql,$param);
if($rs === false){
$rtn = false;
}else{
$rs = umEx($rs,true);
$data = $rs[0];
}
SQLの実行、結果の取得はcommon.phpのcmFetchAllで行っています。cmFetchAll関数は(接続リソース、SQL文、バインドパラメータ)となっており、結果を配列でリターンします。SQLの実行に失敗した場合はfalseをリターンするようになっています。
SQL文で「?」にした場所に入れる値(バインドパラメータ)を配列で定義します。
SQL文を作成する時、WHERE句に入れる値は「?」で記述します。
cmFetchAllでfalseだった場合はエラー処理を行います。正常だった場合、$data変数に結果を代入しています。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 25
common.php cmFetchAll関数
function cmFetchAll($con,$sql,$param){
$data = array();
$rs = '';
$stmt = db2_prepare($con,$sql);
if($stmt){
db2_execute($stmt,$param);
if($stmt){
while($row = db2_fetch_assoc($stmt)){
$data[] = $row;
}
$rs = $data;
}else{
$rs = false;
}
}else{
$rs = false;
}
return $rs;
}
db2_prepareでSQLの実行準備をします。SQL文に誤りがあった場合、$stmtにfalseが入ります。
db2_executeでバインドパラメータを渡してSQLの実行をします。実行エラーが出た場合、$stmtにfalseが入ります。
db2_fetch_assocは結果を配列に変換し、上から一行ずつ読み取る関数です。この関数を使って$dataにデータを代入します。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 26
DBの切断はcommon.phpのcmDbCloseで行っています。
function cmDbClose($con){
db2_close($con);
}
SQLの切断はdb2_close関数を使います。引数にはdb2_connectで得た結果を渡します。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 27
・CLの実行について
PHPからCLを実行する場合もSQLの実行と同じく、db2_connectを使用して接続し、db2関数を用いて実行、db2_closeで切断という流れになります。
function cmCallZAI001C($con,$param){
$stmt = false;
$RTCD = '';
$stmt = db2_prepare($con, "CALL ZAI001P(?,?,?,?,?)");
if($stmt !== false){
$in_param1 = $param['SOCD'];
$in_param2 = $param['SHFR'];
$in_param3 = $param['SHTO'];
$in_param4 = $param['SHNM'];
$return_value1 = "";
CLの実行はcommon.phpのcmCallZAI001C関数で行っています。
db2_prepareでプロシジャーの実行準備をします。SQL文に誤りがあった場合、$stmtにfalseが入ります。
「?」に入れるパラメータを変数で定義します。ここで定義した変数をdb2_bind_paramで文字列として使用します。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 28
//プロシージャへのパラメータバインド
db2_bind_param($stmt, 1, "in_param1", DB2_PARAM_INOUT);
db2_bind_param($stmt, 2, "in_param2", DB2_PARAM_INOUT);
db2_bind_param($stmt, 3, "in_param3", DB2_PARAM_INOUT);
db2_bind_param($stmt, 4, "in_param4", DB2_PARAM_INOUT);
db2_bind_param($stmt, 5, "return_value1", DB2_PARAM_OUT);
//プロシージャーの実行
db2_execute($stmt);
//プロシージャのリターン値
$RTCD = $return_value1;
}
$rtn = array(
'RS' => $stmt,
'RTCD' => $RTCD
);
return $rtn;
}
db2_bind_paramでプロシージャにパラメータをバインドします。
パラメータの順番 パラメータ名(PHPの変数名と合わせます)
入出力定義DB2_PARAM_INDB2_PARAM_OUTDB2_PARAM_INOUT
バインド時に定義したパラメータに先頭$をつけた変数にリターン値が入ります。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 29
・Excelの作成について
Excelの作成にはPHPExcelというPHPのライブラリーを使用しています。PHPExcelの使用手順は以下のようになります。
1.ライブラリファイルの読み込み
2.ブックの作成
3.テンプレートファイルの読み込み
4.シートの設定
5.Excelセルに値を代入
6.任意の場所にファイルを保存
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 30
//PHPEXCEL_DIRはconfig.phpで定めた定数です。
//PHPExcelライブラリまでのディレクトリを記述しています。
include_once(PHPEXCEL_DIR."Classes/PHPExcel.php");
ライブラリの読み込み
PHPExcelの中にあるPHPExcel.phpをインクルードします。
//ブック設定 引数にはExcelのバージョンを指定します。
//.xlsファイルであればExcel5を指定し、.xlsxであればExcel2007を指定します。
$reader = PHPExcel_IOFactory::createReader('Excel2007');
ブックの作成
createReaderを使用してブックのオブジェクトを作成します。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 31
//テンプレート設定
//PHPEXCEL_DIRはconfig.phpで定めた定数です。PHPExcelまでのパスを記述しています。
$book = $reader->load(PHPEXCEL_DIR.'Template/template.xlsx');
テンプレートファイルの読み込み
サーバーの任意の場所にあるテンプレートファイルを読み込む設定をします。
$sheetNo = 0;
//setActiveSheetIndexに0を渡すことで1ページ目のシートを選択
$book->setActiveSheetIndex($sheetNo);
//getActiveSheetでセットされているシートのオブジェクトを取得
$sheet = $book->getActiveSheet();
シートの設定
ブックの何ページのシートを使うかを設定します。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 32
//A1セルに’倉庫コード’という文字を文字列で埋め込んでいます。
$sheet->getCell("A1")->setValueExplicit('倉庫コード',PHPExcel_Cell_DataType::TYPE_STRING);
Excelのセルに値を代入
セルの番号を指定して値を埋め込みます。埋め込むときは文字のタイプを指定します。
$writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");
$writer->save($outputf); //saveにはディレクトリ名とファイル名を指定します。
//サンプルソースの場合は$outputfに「/www/zendsvr6/
//htdocs/omniwork/temp/ファイル名」となっています。
任意の場所にファイルを保存
createWriterでExcelのオブジェクトを作成します。saveで任意の場所にファイルを保存することができます。
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 33
ストアドプロシージャ
• PHPからCL(RPG)を実行する為にDB2 for i のストアドプロシージャを利用しますストアドプロシージャはSQL(CREATE PROCEDURE)で作成します
CREATE PROCEDURE OMNIWORK/ZAI001P (
INOUT SOCD CHAR(2) ,
INOUT SHFR CHAR(5) ,
INOUT SHTO CHAR(5) ,
INOUT SHNM CHAR(42) ,
INOUT RTCD CHAR(2) )
LANGUAGE CL
SPECIFIC OMNIWORK/ZAI001C
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME 'OMNIWORK/ZAI001C'
PARAMETER STYLE GENERAL;
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 34
• プロシージャを削除するには以下のSQL(DROP PROCEDURE)を実行します
• 作成したストアドプロシージャの内容は「System i ナビゲーター」で確認できます
DROP PROCEDURE OMNIWORK/ZAI001P
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 35
PGM PARM(&SOCD &SHFR &SHTO &SHNM &RTCD)
DCL VAR(&SOCD) TYPE(*CHAR) LEN(2)
DCL VAR(&SHFR) TYPE(*CHAR) LEN(5)
DCL VAR(&SHTO) TYPE(*CHAR) LEN(5)
DCL VAR(&SHNM) TYPE(*CHAR) LEN(42)
DCL VAR(&RTCD) TYPE(*CHAR) LEN(2)
CHGVAR VAR(&RTCD) VALUE('OK')
/* CCSID の指定 */
CHGJOB CCSID(5026)
STEP1: /* 在庫一覧/詳細ワーク( ZAIWRK )作成 */
CHKOBJ OBJ(QTEMP/ZAIWRK) OBJTYPE(*FILE)
MONMSG MSGID(CPF0000) EXEC(DO)
CRTDUPOBJ OBJ(ZAIWRK) FROMLIB(*LIBL) OBJTYPE(*FILE) +
TOLIB(QTEMP) NEWOBJ(ZAIWRK)
CL• ストアドから実行されるCLとして以下を作成
PHPからはCCSID=5035,1399で実行される為、環境に合わせて実行前にCCSIDを変更しておく
QTEMPは利用可能但し、PHP処理後にジョブが終了するので持続的にQTEMPを利用することはできない
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 36
MONMSG MSGID(CPF0000) EXEC(DO)
CHGVAR VAR(&RTCD) VALUE('NG')
ENDDO
ENDDO
STEP2: /* 在庫一覧/詳細ワーク( ZAIWRK )クリア */
CLRPFM FILE(QTEMP/ZAIWRK)
MONMSG MSGID(CPF0000) EXEC(DO)
CHGVAR VAR(&RTCD) VALUE('NG')
ENDDO
STEP3: /* 抽出処理 */
CALL PGM(*LIBL/ZAI001R) PARM(&SOCD &SHFR &SHTO +
&SHNM &RTCD)
MONMSG MSGID(CPF0000) EXEC(DO)
CHGVAR VAR(&RTCD) VALUE('NG')
ENDDO
ENDPGM
MONMSGは可能な限り指定する方が良い※MSGW滞留を防ぐ為
ライブラリリストはPHPからデータベース接続(db2_connect)した際の指定が適用される
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 37
H DATEDIT(*YMD/)
***********************************************************************
** ファイル定義 **
***********************************************************************
* 在庫マスタ
FZAIMST IF E K DISK INFSR(*PSSR)
* 商品マスタ
FSHNMST IF E K DISK INFSR(*PSSR)
* 倉庫マスタ
FSOKMST IF E K DISK INFSR(*PSSR)
* 在庫一覧/詳細ワーク
FZAIWRK O E K DISK INFSR(*PSSR)
***********************************************************************
** パラメータリスト **
***********************************************************************
C *ENTRY PLIST
C*IN
C PARM P@SOCD 2
C PARM P@SHFR 5
RPG• CLから実行されるRPGとして以下を作成
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 38
C PARM P@SHTO 5
C PARM P@SHNM 42
C*OUT
C PARM P@RTCD 2
***********************************************************************
** キーリスト **
***********************************************************************
C* 在庫マスタ
C KEY001 KLIST
C KFLD P@SOCD
C KFLD P@SHFR
C KEY002 KLIST
C KFLD P@SOCD
***********************************************************************
** メイン処理 **
***********************************************************************
C* 在庫マスタ読込
C KEY001 SETLL ZAIMST
C DO *HIVAL
C KEY002 READE ZAIMST
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 39
C* 読込終了条件
C IF %EOF(ZAIMST)
C LEAVE
C ENDIF
C*
C IF P@SHTO <> *BLANK AND
C ZASHCD > P@SHTO
C LEAVE
C ENDIF
C* 商品マスタ検索
C ZASHCD CHAIN SHNMST
C IF %FOUND(SHNMST)
C* あいまい検索(商品名)
C IF P@SHNM <> *BLANK
C EXSR #FIND
C IF #FLG = *BLANK
C ITER
C ENDIF
C ENDIF
C* ワークファイル出力
C CLEAR ZAIWRKR
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 40
C EVAL WKSOCD = ZASOCD
C ZASOCD CHAIN SOKMST
C IF %FOUND(SOKMST)
C EVAL WKSONM = SOSONM
C ENDIF
C EVAL WKSHCD = ZASHCD
C EVAL WKZISU = ZAZISU
C EVAL WKSHNM = SHSHNM
C EVAL WKZIKN = SHZITK * ZAZISU
C EVAL WKZITK = SHZITK
C EVAL WKURTK = SHURTK
C EVAL WKSRTK = SHSRTK
C EVAL WKKZSU = SHKZSU
C EVAL WKBIKO = SHBIKO
C WRITE ZAIWRKR
C ENDIF
C*
C ENDDO
C*<< 終了処理 >>
C SETON LR
C RETURN
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 41
C*=====================================================================
C* (*PSSR) 例外処理
C*=====================================================================
C *PSSR BEGSR
C*
C MOVEL 'NG' P@RTCD
C*
C ENDSR '*CANCL' *PSSR(例外処理)は可能な限り指定する方が良い※MSGW滞留を防ぐ為
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 42
連携のポイント
• QTEMPの利用非持続的接続(db2_connect)場合、1リクエスト内に対する処理であればQTEMPを活用できる。
• MSGWにしないPHPから実行されたCL,RPGでMSGWとなると、レスポンス保留状態となる為、重複した場合はWebサーバー自体が他のリクエストが受付られなくなる*PSSRやMONMSGで例外処理を記述しておいた方が良い
• 権限QTMHHTTPユーザーで実行される為、必要に応じてオブジェクト権限の設定が必要(GRTOBJAUT)
• 実行時CCSIDの指定QTMHHTTPユーザーで実行される為、CCSID=5035,1399等で実行される環境に応じてCCSIDを変更してからCL,RPGを実行する
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 43
デバッグ方法• PHPから実行されたCL(RPG)をデバッグする場合、以下のような方法で
実現可能(他にいい方法があるかもしれません・・・)
①実行するCL(RPG)にDLYJOBを仕込んでデバッグオプションでコンパイルします
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 44
②ブラウザからリクエストが発生し、CLが実行されると、QSYSWRK以下QSQSRVRのジョブが指定時間ディレイされます
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 45
③ディレイされている間にジョブ情報を控えて、STRSRVJOBを発行します
サンプルソースの解説
Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 46
④STRDBGを開始、停止点を設定するディレイ終了後に停止点よりデバッグ開始されます