オープンソース 協 議 会 IBM i 2014 年 度 第 5 回 勉 強 会 PHP on IBM i 実 践 2015/4/17 株 式 会 社 オムニサイエンス 田 中 昌 宏 1
アジェンダ 会 社 紹 介 サンプルアプリの 概 要 機 能 イメージ ポイント 画 面 イメージ 前 提 となる 環 境 使 用 するライブラリー 等 サンプルソースの 解 説 処 理 詳 細 プログラム 構 成 (Web) HTML CSS Javascript PHP ストアドプロシージャ CL RPG 連 携 のポイント デバッグ 方 法 2
会 社 紹 介 ~オムニサイエンスについて~ 3
会 社 紹 介 会 社 名 創 業 所 在 地 社 員 数 : : : : 株 式 会 社 オムニサイエンス 1987 年 6 月 18 日 東 京 都 千 代 田 区 内 神 田 1-5-4 ミヤコビル7F 40 名 株 式 会 社 オムニサイエンス システム 開 発 部 部 長 田 中 昌 宏 m-tanaka@omni-s.co.jp 03-5217-2311 PHP on IBM i に 特 化 した 受 託 開 発 導 入 支 援 サービス Web (PHP) IBM iユーザーの 声 を 製 品 開 発 に 活 かした 新 しいサービス IBM i (RPG) Solution Media IBM i の 既 存 資 産 を 有 効 活 用 したモダナイゼーション 4
サンプルソースの 概 要 5
サンプルソースの 概 要 機 能 イメージ 1.ログイン ユーザーマスタ 2. 検 索 条 件 入 力 抽 出 処 理 CL(RPG) 在 庫 マスタ 各 種 マスタ 3. 結 果 一 覧 表 示 抽 出 結 果 ワーク 4. 詳 細 表 示 5.Excel 出 力 6
サンプルソースの 概 要 ポイント レスポンシブデザイン Bootstrapを 用 いて レスポンシブデザインを 実 現 単 一 のソースで 様 々な 画 面 サイズに 対 応 しています Ajax( 非 同 期 ) 通 信 JavaScriptのHTTP 通 信 機 能 を 使 って Webページのリロードを 伴 わずに サーバとデータのやり 取 りを 実 装 しています CL,RPG 連 携 抽 出 処 理 はRPGで 実 装 しており PHPからはストアドプロシージャを 用 いて 連 携 しています Excel 出 力 PHPExcelを 用 いて 抽 出 結 果 からExcelブックを 作 成 しダウンロード 可 能 7
サンプルソースの 概 要 画 面 イメージ(デモ) 8
サンプルソースの 概 要 前 提 となる 環 境 サーバー ハードウェア オペレーティングシステム Webサーバー IBM Power Systems IBM i ( System i i5 iseries ) i5/os V5R4 以 降 Zend Server for IBM i Version5.1 以 降 PHP 5.3 以 降 クライアント ブラウザ IE 8 以 降 Safari 5 以 降 Firefox 3.6 以 降 Chrome 6 以 降 9
サンプルソースの 概 要 使 用 するライブラリー 等 ライブラリ jquery 1.11.2 DataTables 1.10.6 Bootstrap 3.3.4 DataTableBootstrap PHPExcel 説 明 Javascriptを 容 易 に 記 述 できるように 設 計 されたjavascripライブラリで す HTMLのテーブルにソートやページング フィルタリングなどの 動 きをつ けるjQueryのプラグインです 見 た 目 を 整 えたり レスポンシブなWebデザインを 簡 単 に 作 成 できる CSSのフレームワークです DataTablesの 見 た 目 をBootstrapに 合 わせたデザインに 変 更 できる DataTablesのプラグインです PHPでエクセルを 作 成 するPHPライブラリーです 10
11
処 理 詳 細 ログイン 画 面 ログインクリック Ajaxリクエスト レスポンス ログインチェックPHP logincheck.php SQL ユーザーマスタ リクエスト ログインOKの 場 合 一 覧 画 面 へ 在 庫 検 索 一 覧 画 面 レスポンス ユーザーIDとパスワードを 受 け 取 り ユーザーマスタを 検 索 し 結 果 を 返 す パスワードは 復 号 してチェック 一 覧 表 示 PHP list.php 検 索 クリック Ajaxリクエスト レスポンス 検 索 条 件 入 力 チェックPHP modalcheck.php 検 索 条 件 : 倉 庫 コードが 未 入 力 の 場 合 エラーを 返 す 検 索 条 件 入 力 エラー 有 りの 場 合 エラーメッセージを 表 示 エラー 無 しの 場 合 検 索 処 理 を 実 行 12
レスポンスされたJSONデータを グリッドに 一 覧 表 示 する 検 索 処 理 実 行 Ajaxリクエスト レスポンス SQL 在 庫 検 索 処 理 listajax.php SQL ストアドプロシージャ ZAI001P 検 索 条 件 内 容 をパラメータとして ストアドプロシージャをCALL リターンコード="OK"の 場 合 在 庫 一 覧 / 詳 細 ワークから 一 覧 表 示 データ をJSON 形 式 で 返 す パラメータ 倉 庫 コード 商 品 コードFROM 商 品 コードTO 商 品 名 リターンコード 在 庫 一 覧 / 詳 細 ワーク 作 成 CL ZAI001C 在 庫 マスタ 在 庫 一 覧 / 詳 細 ワーク ZAIWRK(QTEMP) 在 庫 一 覧 / 詳 細 ワーク 抽 出 RPG ZAI001P 商 品 マスタ RPG 処 理 検 索 条 件 をもとに 在 庫 マスタ 商 品 マスタ 倉 庫 マスタから 在 庫 データを 抽 出 編 集 し 在 庫 一 覧 / 詳 細 ワークを 出 力 する 倉 庫 マスタ 13
詳 細 クリック リクエスト 詳 細 表 示 PHP detail.php レスポンス SQL 詳 細 画 面 を 表 示 在 庫 一 覧 / 詳 細 ワーク ZAIWRK(QTEMP) 14
Excel 出 力 実 行 Ajaxリクエスト レスポンス Excel 生 成 OKの 場 合 ダウンロード 要 求 Excel 出 力 処 理 excel.php SQL 在 庫 一 覧 / 詳 細 ワーク ZAIWRK(QTEMP) PHPExcelでExcelファイルを 生 成 リクエスト ダウンロードを 開 始 レスポンス ダウンロードPHP download.php 15
プログラム 構 成 (Web) ajax ajaxファイル common.php common config.php image msg.php omniwork phplib PHPExcel lib temp 画 面 PHPファイル Weblib Bootstrap DataTables DataTableBootstrap Jquery osc ajax common image lib temp ajax 通 信 で 使 用 するファイルを 格 納 しています PHPで 共 通 でインクルードするファイルを 格 納 しています システムで 使 用 する 画 像 を 格 納 しています システムで 使 用 するライブラリを 格 納 しています Excelダウンロードファイルを 一 時 的 に 格 納 しています 16
HTML CSS Javascript PHP ナビゲーションバーの 設 置 ナビゲーションはBootstrapのnavbarクラスを 使 って 作 成 しています このクラスを 使 うことによって レスポンシブでデザインの 整 ったナビゲーションを 作 成 することができます 画 面 幅 が 小 さくなるとメニューが 非 表 示 になり 右 にボタンが 表 示 されます 右 のボタンをクリックすると 非 表 示 になっていたメニューが 下 に 表 示 されます 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
詳 細 画 面 のレスポンシブ 設 計 詳 細 画 面 はBootstrapのクラスを 使 ってレスポンシブな 画 面 デザインを 実 現 しています 画 面 の 幅 の 伸 縮 に 応 じて 画 像 のサイズや 位 置 が 変 更 されるようになっています 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
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'; } } }); 21
type url Data datatype Success HTTP 通 信 の 種 類 です POSTかGETを 指 定 します 通 信 を 行 う 対 象 のファイルを 指 定 します 通 信 を 行 う 対 象 のファイルに 送 信 するデータを 指 定 します サーバーから 返 されるデータの 型 を 指 定 します Javascriptが 読 みやすいjsonの 型 を 指 定 す るのが 一 般 的 です ajax 通 信 が 成 功 した 場 合 に 呼 び 出 されるイベントを 記 述 します datatypeで 指 定 した 型 でサーバーからのレスポンスを 受 けます 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 はライブラリリストを 使 う 為 のオプションです 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 変 数 に 結 果 を 代 入 しています 24
common.php cmfetchall 関 数 function cmfetchall($con,$sql,$param){ $data = array(); $rs = ''; $stmt = db2_prepare($con,$sql); if($stmt){ db2_execute($stmt,$param); if($stmt){ } } $rs = $data; }else{ $rs = false; } }else{ $rs = false; } return $rs; db2_prepareでsqlの 実 行 準 備 をします SQL 文 に 誤 りがあった 場 合 $stmtにfalseが 入 ります db2_executeでバインドパラメータを 渡 してSQLの 実 行 をします 実 行 エラーが 出 た 場 合 $stmtに falseが 入 ります while($row = db2_fetch_assoc($stmt)){ $data[] = $row; db2_fetch_assocは 結 果 を 配 列 に 変 換 し 上 から 一 行 ずつ 読 み 取 る 関 数 です この 関 数 を 使 って$dataにデータを 代 入 します 25
SQLの 切 断 はdb2_close 関 数 を 使 います 引 数 にはdb2_connectで 得 た 結 果 を 渡 します DBの 切 断 はcommon.phpのcmDbCloseで 行 っています function cmdbclose($con){ db2_close($con); } 26
CLの 実 行 について PHPからCLを 実 行 する 場 合 もSQLの 実 行 と 同 じく db2_connectを 使 用 して 接 続 し db2 関 数 を 用 いて 実 行 db2_closeで 切 断 という 流 れになります CLの 実 行 はcommon.phpのcmCallZAI001C 関 数 で 行 っています function cmcallzai001c($con,$param){ $stmt = false; $RTCD = ''; $stmt = db2_prepare($con, "CALL ZAI001P(?,?,?,?,?)"); db2_prepareでプロシジャーの 実 行 準 備 をします SQL 文 に 誤 りがあった 場 合 $stmtにfalseが 入 り ます if($stmt!== false){ $in_param1 = $param['socd']; $in_param2 = $param['shfr']; $in_param3 = $param['shto']; $in_param4 = $param['shnm']; $return_value1 = "";? に 入 れるパラメータを 変 数 で 定 義 します ここで 定 義 した 変 数 をdb2_bind_paramで 文 字 列 として 使 用 します 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); } パラメータの 順 番 //プロシージャーの 実 行 db2_execute($stmt); //プロシージャのリターン 値 $RTCD = $return_value1; パラメータ 名 (PHPの 変 数 名 と 合 わせます) 入 出 力 定 義 DB2_PARAM_IN DB2_PARAM_OUT DB2_PARAM_INOUT バインド 時 に 定 義 したパラメータに 先 頭 $をつけた 変 数 にリターン 値 が 入 ります $rtn = array( 'RS' => $stmt, 'RTCD' => $RTCD ); return $rtn; } 28
Excelの 作 成 について Excelの 作 成 にはPHPExcelというPHPのライブラリーを 使 用 しています PHPExcelの 使 用 手 順 は 以 下 のようになります 1.ライブラリファイルの 読 み 込 み 2.ブックの 作 成 3.テンプレートファイルの 読 み 込 み 4.シートの 設 定 5.Excelセルに 値 を 代 入 6. 任 意 の 場 所 にファイルを 保 存 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'); 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(); 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/ファイル 名 となっています 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; 33
プロシージャを 削 除 するには 以 下 のSQL(DROP PROCEDURE)を 実 行 します DROP PROCEDURE OMNIWORK/ZAI001P 作 成 したストアドプロシージャの 内 容 は System i ナビゲーター で 確 認 できます 34
CL ストアドから 実 行 されるCLとして 以 下 を 作 成 PGM PARM(&SOCD &SHFR &SHTO &SHNM &RTCD) DCL DCL DCL DCL DCL CHGVAR VAR(&SOCD) TYPE(*CHAR) LEN(2) VAR(&SHFR) TYPE(*CHAR) LEN(5) VAR(&SHTO) TYPE(*CHAR) LEN(5) VAR(&SHNM) TYPE(*CHAR) LEN(42) VAR(&RTCD) TYPE(*CHAR) LEN(2) VAR(&RTCD) VALUE('OK') /* CCSID の 指 定 */ CHGJOB CCSID(5026) 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を 利 用 することはできない 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 PGM(*LIBL/ZAI001R) PARM(&SOCD &SHFR &SHTO + &SHNM &RTCD) MONMSG CHGVAR ENDDO ENDPGM MSGID(CPF0000) EXEC(DO) VAR(&RTCD) VALUE('NG') ライブラリリストはPHPからデータベース 接 続 (db2_connect)した 際 の 指 定 が 適 用 される MONMSGは 可 能 な 限 り 指 定 する 方 が 良 い MSGW 滞 留 を 防 ぐ 為 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 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 38
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 39
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 40
C*===================================================================== C* (*PSSR) 例 外 処 理 C*===================================================================== C *PSSR BEGSR C* C MOVEL 'NG' P@RTCD C* C ENDSR '*CANCL' *PSSR( 例 外 処 理 )は 可 能 な 限 り 指 定 する 方 が 良 い MSGW 滞 留 を 防 ぐ 為 41
連 携 のポイント QTEMPの 利 用 非 持 続 的 接 続 (db2_connect) 場 合 1リクエスト 内 に 対 する 処 理 であれば QTEMPを 活 用 できる MSGWにしない PHPから 実 行 されたCL,RPGでMSGWとなると レスポンス 保 留 状 態 となる 為 重 複 した 場 合 はWebサーバー 自 体 が 他 のリクエストが 受 付 られなくなる *PSSRやMONMSGで 例 外 処 理 を 記 述 しておいた 方 が 良 い 権 限 QTMHHTTPユーザーで 実 行 される 為 必 要 に 応 じて オブジェクト 権 限 の 設 定 が 必 要 (GRTOBJAUT) 実 行 時 CCSIDの 指 定 QTMHHTTPユーザーで 実 行 される 為 CCSID=5035,1399 等 で 実 行 される 環 境 に 応 じてCCSIDを 変 更 してからCL,RPGを 実 行 する 42
デバッグ 方 法 PHPから 実 行 されたCL(RPG)をデバッグする 場 合 以 下 のような 方 法 で 実 現 可 能 ( 他 にいい 方 法 があるかもしれません ) 1 実 行 するCL(RPG)にDLYJOBを 仕 込 んでデバッグオプションでコンパイルします 43
2ブラウザからリクエストが 発 生 し CLが 実 行 されると QSYSWRK 以 下 QSQSRVRのジョブが 指 定 時 間 ディレイされます 44
3ディレイされている 間 にジョブ 情 報 を 控 えて STRSRVJOBを 発 行 します 45
4STRDBGを 開 始 停 止 点 を 設 定 する ディレイ 終 了 後 に 停 止 点 よりデバッグ 開 始 されます 46