php on ibm i 実践 ·...

46
オープンソース協議会 – IBM i 2014年度 5回勉強会 PHP on IBM i 実践 2015/4/17 株式会社オムニサイエンス 田中昌宏 Copyright(C)20 Co.,Ltd. All Rights Reserved. 15 OMNISCIENCE 1

Upload: others

Post on 03-Nov-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

オープンソース協議会 – IBM i2014年度 第5回勉強会

PHP on IBM i 実践

2015/4/17株式会社オムニサイエンス 田中昌宏

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 1

Page 2: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

アジェンダ

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 2

会社紹介

サンプルアプリの概要• 機能イメージ

• ポイント

• 画面イメージ

• 前提となる環境

• 使用するライブラリー等

サンプルソースの解説• 処理詳細

• プログラム構成(Web)

• HTML、CSS、Javascript、PHP

• ストアドプロシージャ

• CL

• RPG

• 連携のポイント

• デバッグ方法

Page 3: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 3

会社紹介

~オムニサイエンスについて~

Page 4: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

会社紹介

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]

Page 5: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 5

サンプルソースの概要

Page 6: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの概要

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 6

機能イメージ

1.ログイン

ユーザーマスタ

2.検索条件入力

抽出処理CL(RPG) 在庫マスタ 各種マスタ

抽出結果ワーク

3.結果一覧表示

4.詳細表示 5.Excel出力

Page 7: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの概要

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 7

ポイント• レスポンシブデザイン

Bootstrapを用いて、レスポンシブデザインを実現単一のソースで様々な画面サイズに対応しています

• Ajax(非同期)通信

JavaScriptのHTTP通信機能を使って、Webページのリロードを伴わずにサーバとデータのやり取りを実装しています

• CL,RPG連携

抽出処理はRPGで実装しており、 PHPからはストアドプロシージャを用いて連携しています

• Excel出力

PHPExcelを用いて、抽出結果からExcelブックを作成しダウンロード可能

Page 8: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの概要

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 8

画面イメージ(デモ)

Page 9: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの概要

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以降

Page 10: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの概要

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ライブラリーです。

Page 11: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 11

サンプルソースの解説

Page 12: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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

レスポンス

リクエスト

Page 13: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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データを

グリッドに一覧表示する

Page 14: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 14

詳細クリック リクエスト

詳細表示PHP

detail.php

在庫一覧/詳細ワーク

ZAIWRK(QTEMP)

SQL

詳細画面を表示

レスポンス

Page 15: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

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ファイルを生成

ダウンロードを開始

Page 16: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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ダウンロードファイルを一時的に格納しています。

Page 17: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 17

HTML、CSS、Javascript、PHP

• ナビゲーションバーの設置

ナビゲーションはBootstrapのnavbarクラスを使って作成しています。このクラスを使うことによって、レスポンシブでデザインの整ったナビゲーションを作成することができます。

画面幅が小さくなるとメニューが非表示になり、右にボタンが表示されます。

右のボタンをクリックすると、非表示になっていたメニューが下に表示されます。

Page 18: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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を指定します。

Page 19: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 19

・詳細画面のレスポンシブ設計

詳細画面はBootstrapのクラスを使ってレスポンシブな画面デザインを実現しています。画面の幅の伸縮に応じて画像のサイズや位置が変更されるようになっています。

Page 20: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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 "

Page 21: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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データを配列に変換するメソッドです。

Page 22: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 22

type HTTP通信の種類です。POSTかGETを指定します。

url 通信を行う対象のファイルを指定します。

Data 通信を行う対象のファイルに送信するデータを指定します。

dataType サーバーから返されるデータの型を指定します。Javascriptが読みやすいjsonの型を指定するのが一般的です。

Success ajax通信が成功した場合に呼び出されるイベントを記述します。dataTypeで指定した型でサーバーからのレスポンスを受けます。

Page 23: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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」はライブラリリストを使う為のオプションです。

Page 24: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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変数に結果を代入しています。

Page 25: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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にデータを代入します。

Page 26: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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で得た結果を渡します。

Page 27: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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で文字列として使用します。

Page 28: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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

バインド時に定義したパラメータに先頭$をつけた変数にリターン値が入ります。

Page 29: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 29

・Excelの作成について

Excelの作成にはPHPExcelというPHPのライブラリーを使用しています。PHPExcelの使用手順は以下のようになります。

1.ライブラリファイルの読み込み

2.ブックの作成

3.テンプレートファイルの読み込み

4.シートの設定

5.Excelセルに値を代入

6.任意の場所にファイルを保存

Page 30: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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を使用してブックのオブジェクトを作成します。

Page 31: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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();

シートの設定

ブックの何ページのシートを使うかを設定します。

Page 32: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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で任意の場所にファイルを保存することができます。

Page 33: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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;

Page 34: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 34

• プロシージャを削除するには以下のSQL(DROP PROCEDURE)を実行します

• 作成したストアドプロシージャの内容は「System i ナビゲーター」で確認できます

DROP PROCEDURE OMNIWORK/ZAI001P

Page 35: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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を利用することはできない

Page 36: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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)した際の指定が適用される

Page 37: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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として以下を作成

Page 38: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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

Page 39: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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

Page 40: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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

Page 41: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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滞留を防ぐ為

Page 42: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

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を実行する

Page 43: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 43

デバッグ方法• PHPから実行されたCL(RPG)をデバッグする場合、以下のような方法で

実現可能(他にいい方法があるかもしれません・・・)

①実行するCL(RPG)にDLYJOBを仕込んでデバッグオプションでコンパイルします

Page 44: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 44

②ブラウザからリクエストが発生し、CLが実行されると、QSYSWRK以下QSQSRVRのジョブが指定時間ディレイされます

Page 45: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 45

③ディレイされている間にジョブ情報を控えて、STRSRVJOBを発行します

Page 46: PHP on IBM i 実践 · phpから実行されたcl,rpgでmsgwとなると、レスポンス保留状態となる為、 重複した場合はwebサーバー自体が他のリクエストが受付られなくなる

サンプルソースの解説

Copyright(C)20 Co.,Ltd. All Rights Reserved.15 OMNISCIENCE 46

④STRDBGを開始、停止点を設定するディレイ終了後に停止点よりデバッグ開始されます