オープンソース協議会 – 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
© Copyright 2024 ExpyDoc