見出し画像

QRコード活用のための環境準備(備品保管場所情報管理)No.022

前回の記事(No.022)でQRコードを利用した備品管理機能を紹介しましたが、実際に業務で使用するには、備品情報とその備品を保管する保管場所情報をきちんと管理する環境が必要です。2種類の情報を2つのテーブル(データベース)に登録して、QRコードラベルを印刷し、保管管理が可能となります。今回は、準備段階ですが、備品を保管する場所情報を管理する業務について紹介します。保管場所は、例として、部屋、部屋内の位置、棚の上下などで、実施の保管場所を決める方法としました。例では、自宅にある備品の置き場所を保管場所にしてみました。棚の1つつづにコードを定義する方法もありますが、自宅の場合、ある程度、場所を把握している前提で、部屋と部屋内の東西南北位置とそこに設置されている棚やテーブルの上中下くらいで登録するようにしました。保管場所は、順番に採番する番号と保管場所名称で管理します。(メモ情報もデータベースには、格納しますが、QRコードは、名称の変更も考慮して管理番号だけとします)前回の記事では、QRコード内に、場所名称も含みましたが、今回から、ラベルには名称も印刷するが、QRコードには管理番号だけ組み込む方法とします。
まずは、テーブル作成です。以下の定義で作成しました。

 CREATE TABLE `locations` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ロケーションID',
  `code` varchar(16) NOT NULL DEFAULT '' COMMENT 'ロケーションコード(LC+ID)',
  `name` varchar(255) NOT NULL  COMMENT '格納場所',
  `area` varchar(64) NOT NULL COMMENT '格納棚',
  `shelf` varchar(64) NOT NULL DEFAULT ''  COMMENT '格納棚',
  `place` varchar(64) NOT NULL DEFAULT '' COMMENT '格納位置',
  `memo` varchar(255) NOT NULL DEFAULT '' COMMENT 'メモ',
  `created_userid` varchar(16) NOT NULL DEFAULT 'admin' COMMENT '作成者ID',
  `updated_userid` varchar(16) NOT NULL DEFAULT 'admin' COMMENT '更新者ID',
  `created_on` datetime DEFAULT NULL COMMENT '作成日時',
  `updated_on` datetime DEFAULT NULL COMMENT '更新日時',
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK1` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=10000 DEFAULT CHARSET=utf8mb4;

番号は、10000から開始することで、桁数を固定できます。
自動採番ですが、保管場所コードは、先頭にLCを追加した7桁の番号とします。LC100000のようになります。
保管場所は、3つの項目で記述し、nameフィールドは、area,shelf,placeを結合して作成します。

データベースを作成したら、管理するための画面と業務アプリ(データベースの作成、検索、更新など)を作成します。
今回の機能は、メニューから起動する構成になっています。また、ログインしたユーザ情報を引き継いで動作する環境にしているので、ソースコードが少しだけ複雑になっています。かつ、作成環境がローカル環境(自宅用)にしているので、デモ画面の公開ができません。イメージ画面のみの紹介となります。
作成したソースは、以下のとおりです。

/view/LC0010/LC0010_locations_lists.php                一覧画面(EXCELデータインポート機能あり)
/view/LC0010/LC0011_locations_winform.php              詳細画面(新規追加・更新・削除操作用)
/view/LC0010/LC0011_location_prompt_func_winform.php   詳細画面(補助機能1)
/view/LC0010/LC0011_location_validation_fn_winform.php 詳細画面(補助機能2)

/rest_api/LC0010/LC0012_locations_db_selectlists.php   キーを指定してデータ検索
/rest_api/LC0010/LC0013_locations_db_max_info.php      登録したidの最大値検索
/rest_api/LC0010/LC0014_location_db_delete.php         idを指定してレコード削除
/rest_api/LC0010/LC0015_location_db_select.php         idを指定して1レコード検索
/rest_api/LC0010/LC0016_location_db_update.php         キーを指定してデータ更新
/rest_api/LC0010/LC0017_location_db_create.php         新規に1レコード作成
/rest_api/LC0010/LC0018_insert_locations.php           EXCELデータで複数レコード作成

共通ライブラリやメニュー部分のソースは省略します。
一覧画面は以下のようなレイアウトです。
(データが1件も登録されていない状態の画面)

URLは、/webix01/view/LC0010/LC0010_locations_lists.phpです。
新規登録ボタンクリックで、新規作成画面が開きます。
(/webix01/view/LC0010/LC0011_locations_winform.php)

新規登録画面では、場所、棚、位置情報を入力して、登録ボタンをクリックすると、保管先ID情報を自動採番して、LC10000のような番号を採番します。格納場所を1つづつ登録する操作もありですが、実際には複数の情報を登録する必要があり、EXCELなどに一覧で作成し、インポートで登録する操作ができると、作業性が向上します。今回、以下のようなEXCELを事前に作成し、一覧画面にあるEXCELインポートボタンをクリックしてインポートしました。

実際には、65行の情報をEXCELで作成しています。

EXCELファイルを選択すると、自動的に一覧に情報を取り込みます。

その後、登録ボタンクリック(EXCEL取込ボタンを消して、登録ボタンを表示制御しています)すると、テーブルにINSERTされ、一覧表も最新データを描画します。

行をクリックすると、該当行の明細情報を表示し、編集操作や削除操作が可能です。


編集したい場合は、編集モードをクリックして、編集画面に遷移させ、編集を実施し、更新をクリックします。
編集できるのは、名称情報(場所、棚、位置)とメモのみです。

今回は、ここまでの機能を紹介します。次回は、この機能を改造して、QRコードラベルの印刷機能を実装します。(一覧から複数行をチェックして同時に印刷する機能)
EXCELインポート機能については、関連画面(一覧)と、複数作成のサーバ側のソースを以下に紹介します。
/view/LC0010/LC0010_locations_lists.php

<?php
//======================================================================
//File Name       : LC0010_locations_lists.php
//Encoding        : UTF-8
//Creation Date   : 2024-03-29
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//====================================================================== 
	$TITLE_INFO ="保管場所マスタ";
	$VER_INFO ="V01L01";
	$JOB_INFO = "LC0010";
	$myfilename = basename(__FILE__);	//自分自身のファイル名取得
    define('ROOT_PATH','/var/www/html/webix01'); //ソースを保存しているパス(動作環境に応じて記述する必要あり)
    define('SUB_FOLDER','/webix01');    //サブフォルダを指定したURL 
	$userid = '';
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
	if($_SERVER["REQUEST_METHOD"] != "GET"){
	  error_log($logheader.'  REQUEST_METHOD no GET');
	  header("HTTP/1.0 404 Not Found");
	  return;
	}
	$error_flag = -1;

//一部ソース省略

	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)

	include('../../commonlib/svr_common_lib_v2.php');	//
	$config_obj = get_config_obj();
//一部ソース省略

?>

<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="UTF-8">
		<title><?php echo $TITLE_INFO.' LC0010 ('.$VER_INFO.')' ?></title> 
		<script src="/webix-pro1021/webix.js" type="text/javascript" charset="utf-8"></script>
		<link href="/webix-pro1021/skins/compact.css?<?php echo date('Ymd-H'); ?>" rel="stylesheet" type="text/css">
		<link href="<?php  echo SUB_FOLDER; ?>/commonlib/webix_custom_css.css?<?php echo date('Ymd-H'); ?>" rel="stylesheet" type="text/css">
		<link rel="icon" href="<?php  echo SUB_FOLDER; ?>/image/webix_64.ico">
		<script src="<?php  echo SUB_FOLDER; ?>/commonlib/object-assign.js"></script>
		<script src="<?php  echo SUB_FOLDER; ?>/commonlib/moment-with-locales.js"></script>
    	<script src="<?php  echo SUB_FOLDER; ?>/commonlib/webix_common_lib.js"></script>
		<link rel="stylesheet" href="/webix-pro1021/css/materialdesignicons.min.css" type="text/css" charset="utf-8">
	<style>
	.blue .webix_el_box{
  		color: #0000ff;
	}
	.blue .webix_control.webix_el_text{
  		color: #0000ff;
	}
	.red .webix_el_box{
  		color: #ff0000;
	}
	.red  .webix_control.webix_el_text{
  		color: #ff0000;
	}
	.invalid_mess{font-size:8px}
	.red  .webix_control.webix_el_text{
  		color: #ff0000;
	}
	.orange_bgcolor button.webix_button{
		background: #FF8856;
		color:#FFFFFF;
		border:1px solid #FF8856;
	}
	.gray_bgcolor {
		background: #efefef;
		
	}
	.highlight{
        background-color:#FFAAAA;
    }
    .teal_bgcolor .webix_button {
 		background-color: #008080;
  		 color: #FFFFFF;
	}
	.green input{
		background-color:#B1FF91;
		border-color:green;
	}
	.pink input{
		background-color:#FFB6FE;
		border-color:red ;
	} 
  	</style>
  	</head>	
	<body>
		<div id="form1"></div>
		<script type="text/javascript" charset="utf-8">		
		webix.i18n.setLocale("ja-JP");
		var my_local_session = webix.storage.local.get('login');
		 // メニュー追加
<?php

//一部ソース省略

	
	if(isset($_GET['open_mode'])){
		$open_mode = $_GET['open_mode'];
		if($open_mode == '_blank'){
			echo '	var menu_btn_name = "閉じる";'."\n";
		}
		else{
			echo '	var menu_btn_name = "メニュー";'."\n";
		}
	}
	else{
			echo '	var menu_btn_name = "メニュー";'."\n";
	}
	echo '	var my_permission ='.$mypermission.";\n";
    echo "	var LC0010_backgcolor = '".$backgcolor."';\n";
?>
webix.i18n.setLocale("ja-JP");
function LC0010_select_locations_lists(limit = ""){
	$$("EXCEL_import_btn").show();
 	$$("LC0010_new_locations_btn").show();
	$$("LC0010_entry_btn").hide();
	var fl_location_code = $$("fl_location_code").getValue();
	if(fl_location_code != ""){
		if(fl_location_code.substr(0,2)!= "LC" ){
			webix.message({type:"error", text:"保管場所コードの先頭は、<BR>LCを指定してください。"});
			return;
		}
	}
	$$("LC0010_table").clearAll();			//リストを一度クリア
	CM0080_datatable_filter_clear("LC0010_table");

	var access_key = Get_AccessKey();
	var send_prm  = Prepare_send_prm(my_local_session, access_key);
	send_prm.fl_location_code = $$("fl_location_code").getValue();	//保管場所コード
	send_prm.fl_location_name = $$("fl_location_name").getValue();	//保管場所名称
	var xhr =webix.ajax().sync().get("<?php  echo SUB_FOLDER; ?>/rest_api/LC0010/LC0012_locations_db_selectlists.php",send_prm);
	var resp =  JSON.parse(xhr.responseText);
	if(resp.resp =="ok"){
		$$("LC0010_table").parse(resp.var_lists);
		var v_count =$$("LC0010_table").count();
		$$("select_count").setValue(String(v_count));
		if(v_count == 0 ){				
			$$("comment").setValue("検索結果は、0件です。");
			webix.message({type:"error", text:"検索結果は、0件です。"});
		}				
		else if(v_count >= 1000){
			$$("comment").setValue("検索結果は、1000件以上で、"+String(v_count)+"件のみ表示");
			webix.message({type:"error", text:"検索結果は、1000件を超過しました。"});
		}
		else{
			$$("comment").setValue("");
		}
	}
	else{
		webix.message({type:"error", text:"検索でエラーが発生しました。code="+resp.error_code});
	}
}
	//ファイル名から拡張子を取得する関数
	function EXCEL_getExt(filename)
	{
		var pos = filename.lastIndexOf('.');
		if (pos === -1) return '';
		return filename.slice(pos + 1);
	}
//データを登録処理する
function locations_entry_exe(insert_lists){
    var formData = new FormData();
    var access_key = Get_AccessKey();
    formData.append("accesskey",access_key);
    formData.append("userid",  my_local_session.userid);
    formData.append("job_info","LC0010");
	formData.append("insert_lists",JSON.stringify(insert_lists));
    var xhr =webix.ajax().sync().post("<?php  echo SUB_FOLDER; ?>/rest_api/LC0010/LC0018_insert_locations.php",formData);
    var resp =  JSON.parse(xhr.responseText);
    if(resp.resp =="ok"){
        LC0010_select_locations_lists();
        webix.message({type:"success",text:"保管先を登録しました。"});
        return;
    }
    else{
        webix.alert("保管先の登録処理でエラーしました。 code="+resp.error_code);
        return;
    }
}
	
	
	//検索条件フォーム構成リスト
	var form_collection = [
		{ margin:5,	cols:[
			{ view:"label", height:50, template:"<span style='font-weight:bold; font-size:180%;'>保管場所マスタ(LC0010)</span>",width:890},
		]},
		{ margin:5, 
			cols:[
				{ view:"text", label:"保管先コード",name:"fl_location_code",labelWidth:90, width: 220, value: "", id:"fl_location_code", placeholder:"LC1xxxx" ,labelAlign:"right",tooltip:"前方一致検索"},
				{ view:"text", label:"保管先名称", attributes:{ maxlength:30 }, name:"fl_location_name", width: 350, value: "", id:"fl_location_name", placeholder:"",labelAlign:"right", tooltip:"曖昧検索可"},
				{ view:"button", value: "検索", align:"center", width: 110,id:"LC0010_search_btn",name:"LC0010_search_btn",
					click:function(){
						LC0010_select_locations_lists();
					}
				},
				{ align:"top", body:{ view:"button",id:"LC0010_new_locations_btn", name:"LC0010_new_locations_btn", value: "新規登録", align:"center", width: 110, css:"webix_primary", 
					click:function(){
						$$("EXCEL_import_btn").show();
						$$("LC0010_entry_btn").hide();
						LC0011_create_data_win_show(my_permission);
					}
				}},
  		   	   	{view:"uploader", value:"EXCEL取込",width: 120,id:"EXCEL_import_btn",name:"EXCEL_import_btn",
    				on:{
      					onBeforeFileAdd: function(upload){
      					 //インポート処理を追加
      						if(EXCEL_getExt(upload.file.name) != "xlsx"){
         	 					webix.alert("指定ファイル『"+upload.file.name+"』はEXCELフォーマットでありません。<br>ファイルを再確認してください。");
      						}
      						else{
      							$$("LC0010_table").clearAll();
     							webix.DataDriver.excel.toObject(upload.file).then(function(data){
      								try{
      									const records = data.data;
    									var import_records = [];
	                                    var access_key = Get_AccessKey();
	                                    var send_prm  = Prepare_send_prm(my_local_session, access_key);
	                                    var xhr =webix.ajax().sync().get("<?php  echo SUB_FOLDER; ?>/rest_api/LC0010/LC0013_locations_db_max_info.php",send_prm);
	                                    var resp =  JSON.parse(xhr.responseText);
    	          						var num = 10000;
                                        if(resp.resp =="ok"){
                                        	num = Number(resp.next_id);
                                        }
										else{
											webix.message({type:"error", text:"最大ID検索でエラーが発生しました。code="+resp.error_code});
											return;
										}
    	          						var start_row_pos = 1;
    	          						var end_pos = records.length;
    	          						for(var i=start_row_pos; i<end_pos; i++){
    	          						    var str_tmp = records[i][0];
    	          							if(str_tmp .trim() == "") {
    	          								end_pos = i;
    	          								break;
    	          							}
										}
										var cnt = 0;
    	          						for(var i=start_row_pos; i<end_pos; i++){
    	          						    var str_tmp = records[i][0];
    	          							if(str_tmp.trim() == "") break;
				          					var record = {};
      										record["id"] = num;
											num += 1;
											cnt += 1;
    	   	   								//EXCELからのデータに対し、マッピング情報で変換を実施
    	   	   								record["code"] = "LC"+String(num);
    	   	   								record["area"] = records[i][0];
    	   	   								record["shelf"]  = records[i][1];
    	   	   								record["place"] = records[i][2];
    	   	   								record["name"] = records[i][3];
    	   	   								record["memo"] = "";
    	   	   								record["editmode"] = 3;	//1:閲覧 2:更新 3:新規 4:削除
											import_records[i-start_row_pos] = record;
    	          						}
      						    		$$("LC0010_table").parse(import_records);
      						    		$$("select_count").setValue(cnt);
 										$$("EXCEL_import_btn").hide();
 										$$("LC0010_new_locations_btn").hide();
										$$("LC0010_entry_btn").show();
      						    		webix.alert((cnt).toString()+"件、<br>EXCELから取込ました。<br>登録を押下してください。");
    	          					}catch(e){
    	          						webix.alert("EXCEL IMPPORTでエラーが発生しました。:"+ e.message);
    	          					}
								});
	 						}
       						return false;
      					}
      				}
    			},
				{ view:"button", value: "登録", align:"center", width: 110,id:"LC0010_entry_btn",name:"LC0010_entry_btn",hidden:true,
					click:function(){
            		    var insert_lists = [];
            		    var cnt = 0;
 					    $$("LC0010_table").eachRow(function(row){ 
 					    	const record = $$("LC0010_table").getItem(row);
 					    	if(record.editmode == 3){	//update
 					    		cnt += 1;
 					    		insert_lists.push(record);
 					    	}
					    });
					    if(cnt == 0){
					    	webix.alert("保管先の<br>登録対象の行がありません。");
					    	return;
					    }
					    else{
					    	webix.confirm({
   					    		title:"確認",
   					    		ok:"はい", 
   					    		cancel:"いいえ",
   					    		text:cnt+"件、<br>保管先を登録しますか?"
					    	})
					    	.then(function(result){
					    		locations_entry_exe(insert_lists);
					    	})
					    	.fail(function(){
            		    		webix.message({type:"debug",text:"登録操作をキャンセルしました。"});
					    	});
					    }
					}
				},
				// メニューに戻るボタン実装
				{ align:"top", body:{ view:"button",  value: menu_btn_name, align:"center", width: 110, css:"menu",
					click:function(){
						Goto_Menu(my_local_session["userclient"]);	//メニュー画面へ遷移
					}
				}
			}
			]
		},
	]

	var grid1 = {
		id: "LC0010_table",
		name: "LC0010_table",
		type:"clean",
		view:"datatable",
		width:800,
		resizeColumn:true,
		resizeRow: { headerOnly:true },				
		columns:[
            { id:"id",header:["id",{content:"textFilter"}],width:100,sort:"int", css:{"text-align":"right"}},
            { id:"code",header:["保管先コード",{content:"textFilter"}],width:100,sort:"int", css:{"text-align":"right"}},
            { id:"area",header:["場所",{content:"selectFilter"}],width:120,sort:"int", css:{"text-align":"right"}},
            { id:"shelf",header:["棚",{content:"selectFilter"}],width:80,sort:"int", css:{"text-align":"right"}},
            { id:"place",header:["位置",{content:"selectFilter"}],width:80,sort:"int", css:{"text-align":"right"}},
            { id:"name",header:["保管先名称",{content:"textFilter"}],width:250},
            { id:"memo",header:["メモ",{content:"textFilter"}],width:200},
            { id:"editmode",header:"editmode",width:10,hidden:true}	//1:閲覧 2:更新 3:新規 4:削除
		],
		//	選択	
		on:{
			onItemClick:function(id){
				var item = this.getItem(id);
				LC0011_disp_win_show(my_permission,my_local_session,item.code);
			}
		},
		css:"webix_data_border webix_header_border",
		resizeColumn:true, resizeRow:true,
		leftSplit:2,
		scroll:"xy",
		select:"row",
		datatype:"json",
		data:[]
	};

	function get_options_datas(table_id,column_id){
		var options_data  = $$(table_id).getColumnConfig(column_id).collection.config.data;
		return options_data;
	}
	//画面描画
	webix.ui({
		padding: 10,
		rows:[ { view:"form", id: "form1", elements : form_collection, margin:3, select:true ,height:120},
			   { margin:5,cols: [
			      { view:"text", label:"検索結果(件)", labelWidth:100,labelAlign:"right",name:"select_count",id:"select_count",value:0,width:160, inputAlign:"right",readonly:true },
		          { view:"label",label:"", width:300, name:"comment", id:"comment" }
		       ]},
		grid1,
		]
	});

$$("fl_location_code").attachEvent("onEnter",function(ev){
    var a = $$("fl_location_code").getValue();
    if(a!=''){
    	$$('LC0010_search_btn').focus();
    }
});
$$("fl_location_name").attachEvent("onEnter",function(ev){
    var a = $$("fl_location_name").getValue();
    if(a!=''){
    	$$('LC0010_search_btn').focus();
    }
});


<?php
//ボタン操作権限の設定
//bit4 新規追加者:true 以外:false
?>
//編集ボタン権限設定
if(CM0010_permission_check(my_permission,4)){
	$$("LC0010_new_locations_btn").enable();
	$$("EXCEL_import_btn").enable();
}
else{
	$$("LC0010_new_locations_btn").disable();
	$$("EXCEL_import_btn").disable();
}
<?php
	include_once('LC0011_locations_winform.php');	//保管先マスタ明細表示
?>
</script>
</body>
</html>

サーバ側のソースです。/rest_api/LC0010/LC0018_insert_locations.php

 <?php
//======================================================================
//File Name       : LC0017_location_db_create.php
//Encoding        : UTF-8
//Creation Date   : 2024-03-29
// 
//Copyright © 2024 sunsunfarm. All rights reserved.
// 
//This source code or any portion thereof must not be  
//reproduced or used in any manner whatsoever.
//====================================================================== 
	header("Content-Type: text/javascript; charset=utf-8");
	$myfilename = basename(__FILE__);	//自分自身のファイル名取得
	$userid = '';
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)
	if($_SERVER["REQUEST_METHOD"] != "POST"){
	  //POST以外ははじく
	  error_log($logheader.' not POST method');
	  header("HTTP/1.0 404 Not Found");
	  return;
	}
	//指定パラメータでユーザ新規追加(INSERT)する
    //POST情報からパラメータ取得
	$accesskey = 0;
	if(isset($_POST['accesskey'])){
		 if(is_numeric($_POST['accesskey'])){
			$accesskey = $_POST['accesskey'];
			$error_flag = 1;
		}
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  accesskey not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
	if(isset($_POST['userid'])){
		$userid = $_POST['userid'];
		$error_flag = 1;
	}
	else{
		$error_flag = -1;
	  	error_log($logheader.'  userid not found');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;
	}
	$job_info = "MS1017";
	if(isset($_POST['job_info'])){
		$job_info = $_POST['job_info'];
	}

    
	$logheader = 'userid='.$userid.', '.$myfilename.':';//ログ出力時のヘッダー情報(自ファイル名,ログインIDを付与)

	include('../../commonlib/svr_common_lib_v2.php');	//
	$config_obj = get_config_obj();
	//アクセスキーチェック
	if(Chk_AccessKey($accesskey)){
	}
	else{
		error_log($logheader.'  accesskey check error');
	  	header("HTTP/1.0 404 Not Found");
	  	exit;

	}

	$edit_mode = "1";
	if(isset($_POST['edit_mode'])){
		$edit_mode = $_POST['edit_mode'];	//1:閲覧 2:更新 3:新規 4:削除
	}
	if( $edit_mode != "3"){
		error_log($logheader.'prm error  userid='.$userid.' edit_mode='.$edit_mode);
 		$resp = "ng";
		$error_code = -1;
		$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
		echo $json_data;
   		return;
	}
	//Form data
	if(isset($_POST['data_list'])){
		$data_list_str = $_POST['data_list'];
 		$data_list = json_decode($data_list_str ,true);
	}
	//error_log($logheader.'data_list ='.var_export($data_list,true ));


    //
    //メインルーチン
    //
    
    

   	$config_obj = get_config_obj();
    //データベース接続する(MariaDB)
    $dbh = mariadb_connect($config_obj,'app01','webix-server_redmine001');
    if($dbh == false){
    	//エラー応答
    	$resp = "ng";
		$error_code = -2;
 		$json_data = json_encode(compact("resp","error_code"),JSON_UNESCAPED_UNICODE);
		echo $json_data;
		exit;
    }

  	try{
		$select_sql1 = "SELECT id from locations where name=?";
		$select_stmt =  $dbh->prepare($select_sql1);
		
		$insert_sql1 = "INSERT INTO locations(name,area,shelf,place,memo,created_userid,updated_userid,created_on,updated_on)  VALUES(?,?,?,?,?,?,?,?,?)";
		$insert_stmt =  $dbh->prepare($insert_sql1);

		$update_sql1 = "UPDATE locations SET code= ? where id= ?";
		$update_stmt =  $dbh->prepare($update_sql1);


		// 静的プレースホルダを指定
   		$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
   		// エラー発生時に例外を投げる
   		$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	
    	//トランザクション処理を開始
    	$dbh->beginTransaction();
		$resp = "ok";
		$error_code = 0;
		$select_stmt->bindValue(1,$data_list["location_name"]);
		$select_stmt->execute();
		$var_lists =  $select_stmt->fetchAll(PDO::FETCH_ASSOC);  //フィールド名だけで保存(index情報なし)
		$count = count($var_lists);
		$location_code = "";
		if($count >0){
			error_log($logheader.' location name found id='.$var_lists[0]["id"]);
			$resp = "ng";
			$error_code = -2;
			$location_code = $var_lists[0]["id"];
			$dbh = null;
			$json_data = json_encode(compact("resp","error_code","location_code"),JSON_UNESCAPED_UNICODE);
			echo $json_data;
			exit;
		}
		
		$insert_stmt->bindValue(1,$data_list["location_name"]);
		$insert_stmt->bindValue(2,$data_list["location_area"]);
		$insert_stmt->bindValue(3,$data_list["location_shelf"]);
		$insert_stmt->bindValue(4,$data_list["location_place"]);
		$insert_stmt->bindValue(5,$data_list["location_memo"]);
		$insert_stmt->bindValue(6,$userid);	//created_userid
		$insert_stmt->bindValue(7,$userid);	//updated_userid
		$insert_stmt->bindValue(8,date("Y-m-d H:i:s"));
		$insert_stmt->bindValue(9,date("Y-m-d H:i:s"));
		$insert_stmt->execute();
		error_log($logheader.' insert locations:'.$data_list["location_name"]);

		
		$select_stmt1 = $dbh->prepare("SELECT LAST_INSERT_ID() as id");
		$select_stmt1->execute();
		$insert_ids = $select_stmt1->fetchAll(PDO::FETCH_ASSOC); //フィールド名だけで保存(index情報なし)
		$location_id = $insert_ids[0]["id"];
		$location_code = 'LC'.$location_id;
		error_log($logheader.' insert locations:'.$data_list["location_name"].' id='.$location_id);
		$update_stmt->bindValue(1,"LC".$location_id);
		$update_stmt->bindValue(2,intval($location_code),PDO::PARAM_INT);
		$update_stmt->execute();
		error_log($logheader.' update locations code=:'.$location_code);
		$dbh->commit();
		error_log($logheader.' commit');
  	} catch(PDOException $e){
		error_log($logheader.'  捕捉した例外: '.$e->getMessage());	//例外発生時の処理(エラー情報をログに格納してエラー応答)
		$resp = "ng";
		$error_code = -1;
		$location_code = "0";
  	}
	$dbh = null;
	$json_data = json_encode(compact("resp","error_code","location_id","location_code"),JSON_UNESCAPED_UNICODE);
	echo $json_data;
?>


この記事が気に入ったらサポートをしてみませんか?