PHPonIBMi実践 - オープンソース協議会

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