ddsat_change
- DDSAT changeコマンドは、DDSATに対して、データベース内のデータや、あるいはプログラム内の任意のデータを更新したことを知らせるためのコマンドです。
- 弊社のR3Dでは、トリガー機能はMSSQL Server内のDBMSの中に埋め込まれましたが、DDSATでは、データを変更したならば、DDSATに通知する必要があります。
- これは、R3Dから比べますと短所でもありますが、そのおかげで、全てのDBMSや、プログラム内のデータの変更をもトリガープログラムの起動のきっかけとすることを可能となりました。
- R3Dから比べますと、DDSATへの通知は面倒にはなりますが、DDSATの応用は格段に向上したと言えます。
- さらに、R3Dでは、データの更新は終了するまで待ち合わせが行われる同期型のみ提供されましたが、DDSATでは、no waitモードである非同期型でのデータ駆動型も提供されています。
- 従って、このchangeコマンドにおいて、modeに「nowait」と指定すると、トリガープログラム起動だけを行うことになります。ただ、「nowait」モードの場合、ddsat監視画面から表示されるログのsysoutが表示されませんので、トリガープログラムのdebug時点ではwaitモードとし、debug終了時点でnowaitモードとすることをお勧めします。
さて、それでは、まず、利用例を以下に示します。あらかじめ、ddsat_triggerにて、T001personのデータベースが更新されたときのトリガー定義が登録されているものとします。
let pno="0";
let keyno="";
//---ddsat_beginの実行
let json0=""; //---ddsat_beginにはパラメータ不要。
try {
const response = await fetch("http://ddsat_svr:8081/ddsat_begin", {
method: "POST",
headers: {"Content-Type": "application/json",},
body: JSON.stringify(json0)});
const result = await response.json();
pno=result.pno; //---会話番号が返る。
keyno=result.key; //---keynoに16文字暗号コードが返る。
alert(" ddsat_begin おわり。 pno="+pno+" key="+keyno);
} catch (error) {
alert("ddsat_begin error");
}
//----ddsat_changeで、データベースの修正した内容をddsatに知らせる。
let json1={
pno: pno,
key: keyno,
mode: "wait",
db_id: "my_db1",
table:"T001person",
field:{
T001_empno: 77,
T001_name: "大谷選手",
T001_birthday: "2000-07-07",
}
};
try {
const response = await fetch("https://ddsat_svr:8081/ddsat_change", {
method: "POST",
headers: {"Content-Type": "application/json",},
body: JSON.stringify(json1)});
const result = await response.json();
let pno=result.pno; //---会話番号---渡した値と同じ値が返る。
let mess1=result.message; //---ddsatからのメッセージ。エラーなしの場合は"OK"。
if(mess1!="OK"){
alert(" ddsat_trigger error message="+mess1);
}
} catch (error) {
alert(" ddsat post error :"+ error);
}
//------ddsat_changeを実行することによって、ddsatモニターが、そのデータ変更によって起動されるプログラムを探し出して、自動的に起動する。
以上の例は、DDSATに対して、ddsat_beinコマンドの実行によって受け取ったpnoの会話番号と、keynoの16桁の暗号コードを指定し、そして、DDSATのchangeコマンドへの指示内容であるjson1の文字列を渡しています。
その内容は、以下のとおりパラメータがあり、そのパラメータに対してjson形式にて値を記述することによってDDSATに渡します。
Jsonキー | 意味 | 例 | 備考 |
pno | 会話番号 | 5 | ddsat_beginで受け取った値を指定する。 |
key | 16桁暗号キー | abcdefghijklmnop | ddsat_beginで受け取った16文字を指定する。 |
mode | wait/nowait指定。 | wait | 非同期の場合は、nowaitと指定する。 その場合、ddsat logのsysoutには情報が出されない。 |
db_id | データベース別名 | my_db1 | tiggerコマンドで定義したdb_idを利用。 |
table | このDBのtable名 | T001person | jinji_db内に定義したtableを指定する。 |
field | |||
フィールド名 | Key又は修正したfield | “T001_empno” “T001_birthday” |
keyフィールド,修正フィールド。 |
修正値 | Key値又は修正した値 | “T001_empno”:77, “T001_birthday”:2000-07-07″ |
keyフィールドと値、そして変更するフィールドと値を指定する。 |
さらに、起動されるトリガープログラムの例も示しましょう。上記の例で、以下のjsonデータがddsat_changeコマンドにて渡されたとします。
ddsat_changeコマンドのjson形式で渡されるパラメータの内容:
{"pno": "7",
"key":"abcdefghijklmnop",
"mode":"wait",
"db_id":"my_db1",
"table":"T001person",
"field":{
"T001_empno": 77,
"T001_name": "大谷選手",
"T001_birthday": "2000-07-07",
}
};
上記の例で、社員番号「77」番の名前を、「大谷選手」、誕生日を「2000-07-07」に変更したという通知が出されたとします。その場合、このデータベース、このテーブル、このフィールドが更新されたときに起動させるトリガープログラム「tr_prog:”http://domain.jp/myprg.php”」が、ddsat_triggerコマンドにてあらかじめ登録されていると仮定します。
では、起動されるdomain.jp/myprg.phpのプログラム内では、どうすればいいのでしょうか。changeコマンドのjson形式で渡した内容がそのまま[json]と言うpost項目名でトリガープログラムに受け渡されますので、そのデータ内容によって必要な処理を行うことができるのです。例えば社員マスターの変更履歴を自動的に登録するトリガープログラム例を以下に示します。
<?php
//-----http://domain.jp/myprg.php の記述内容。
$jsonpara=$_POST['json'];
//---ddsat_changeで要求したjsonデータが、jsonという項目でpostで返されます。
$jsonvec=json_decode($jsonpara, true); //--連想配列に入れます。
var_dump($jsonvec); //---debug-----postされたjsonデータの連想配列をダンプ表示します。
$proc_no=$jsonvec['pno']; //-----会話process noを取得。
$key_no=$jsonvec['key']; //-----16文字暗号文字を取得。
$emp_no=$jsonvec['field']['T001_empno']; //---社員番号
$emp_name=$jsonvec['field']['T001_name']; //---社員名
$birthday=$jsonvec['field']['T001_birthday']; //---生年月日
$mysqli = new mysqli("localhost:3306", "jinji", "pass1", "jinji_db");
//-----MySQLデータベースに接続-----
if (mysqli_connect_errno()) {
die("データベースに接続できません:" . mysqli_connect_error() . "\n");
} else {
echo "データベースの接続に成功しました。\n";
}
//----変更履歴のデータログをinsertします----
$objtime = new DateTime();
$uptime = $objtime->format('Y-m-d H:i:s.u');
$query="insert into T109log(T109_uptime,T109_empno,T109_name,T109_birthday)
values(?,?,?,?)";
$stmt = $mysqli -> stmt_init();
$stmt = $mysqli->prepare($query);
$stmt ->bind_param("siss", $uptime, $emp_no, $emp_name,$birthday); //----parameter----
$stmt ->execute();//----insert 実行
echo(" T001person社員マスターの変更履歴log 書き込み終了");
?>
さらに、データベースを利用しないトリガープログラムの例も示しましょう。データベースを利用せず、program内のあるエリア内のデータを更新した場合に、triggerコマンドであらかじめ定義したtrigger programを起動させたい場合の例は、以下のとおりとなります。今度は、javascriptでの例で、終了を待たずに起動だけを行う例です。
json0={
pno: pno,
key: keyno,
mode: "nowait",
server:"my_server2.jp",
area:"area_prog01",
field:{
parts_no:"A001",
parts_count: 12 ,
parts_tanka:1750
}
};
try {
const response = await fetch("https://ddsat_svr:8081/ddsat_change", {
method: "POST",
headers: {"Content-Type": "application/json",},
body: JSON.stringify(json0)});
const result = await response.json();
let pno=result.pno; //---会話番号
let mess1=result.message; //---ddsatからのメッセージ。エラーなしの場合は"OK"。
if(mess1!="OK"){
alert(" ddsat_trigger error message="+mess1);
}
} catch (error) {
console.error(" ddsat post error :", error);
}
以上の例は、DDSATに対して、ddsat_beginコマンドの実行によって受け取ったpnoの会話番号と、keynoの16桁の暗号コードを指定し、そして、DDSATのchangeコマンドへの指示内容であるjson0の文字列を渡しています。その内容は、以下のとおりのパラメータがあり、そのパラメータに対してjson形式にて値を指定することによってDDSATに渡します。
この例の場合、modeに”nowait”を指定したので、終了を待たずに起動だけが行われることになります。また、nowaitモードの場合、http://ddsat_svr:8081/ddsatで起動した管理画面での監視ボタンでログ情報を見ることができますが、その場合、トリガープログラム実行時でのsysoutイメージは、nowaitの場合では空白となりますので注意をして下さい。
Jsonキー | 意味 | 例 | 備考 |
pno | 会話番号 | 5 | ddsat_beginで受け取った値を指定する。 |
key | 16桁暗号キー | abcdefghijklmnop | ddsat_beginで受け取った値を指定する。 |
mode | wait/nowait指定。 | “wait” or “nowait” | nowaitを指定すると、このエリアの更新によって起動されるtriggerプログラム群の終了を待たずに処理を続行する。 |
server | area programが存在するserver名。 | my_server2.jp | 以下のareaを持つprogramが存在するserver名を指定する。 |
area | trigger定義で登録したarea名を指定する | “area_prog01 | もし、そのfieldが、構造体にある場合には、struct:構造体名も指定する。 |
field | |||
フィールド名 | Key又は修正したfield | parts_no:”A001″ , parts_count: 12 , parts_tanka:1750 |
修正を行うフィールド名を指定する。 |
修正値 | 修正した値 | parts_no:”A001″ , parts_count: 12 , parts_tanka:1750 |
変更するフィールド名と変更値を指定する。 |
上記の例で、以下のjsonデータを渡したとします。
json形式で渡すデータの内容:{
"pno": "8" ,
"key": "abcdabcdabcdabcd",
"mode": "nowait",
"server":"my_server2.jp",
"area":"area_prog01",
"field":{
"parts_no":"A001",
"parts_count": 12 ,
"parts_tanka":1750
}
};
上記では、my_server2.jpのサーバ内にあるarea_prog01というプログラム内にあるpart_noが”A001″のpart_countやparts_tankaが変更されたとき、あらかじめその変更によって起動されるプログラム(http://my_server.jp/prg_area.php)がddsat_triggerによって登録されており、そのプログラムがそのデータエリアの変更によって、起動されるPHPの例となります。
<?php
$jsonpara=$_POST['json'];
//---ddsat_changeで要求したjsonデータが、jsonという項目でpostで返されます。
$jsonvec=json_decode($jsonpara, true);
var_dump($jsonvec); //---debug-----postされたjsonデータの連想配列を表示します。
$proc_no=$jsonvec['pno']; //-----会話process no
$key_no=$jsonvec['key']; //-----16文字暗号文字
$parts_no=$jsonvec['field']['parts_no']; //---部品番号
$parts_tanka=$jsonvec['field']['parts_tanka']; //---単価
$parts_count=$jsonvec['field']['parts_count']; //---数量
$price=$parts_tanka * $parts_count; //---合計額
//----もしこの演算値$priceをwait_resultの実行で待ち合わせるプログラムに渡したい場合には、このあとにddsat_resultを実行します。もし、渡す必要がない場合には、以下のddsat_resultの実行は不要です。
$opts1 = array('http'=>array(
'method'=>"POST",
'header' => 'Content-type: application/json',
'content'=> '{"pno":'.$pno.',
"key":"'.$key.'",
"mode":"nowait",
"tr_id":"my_tr4",
"server":"'.$svr.'",
"area":"x_prog.php",
"field":{"total_price":"'.$price.'"}}'
)
);
$url1="http://https://ddsat_svr:8081/ddsat_result";
$context = stream_context_create($opts1);
// 上で設定した HTTP ヘッダを使用してファイルをオープンします
$out1 = file_get_contents($url1, false, $context);
echo("----ddsat_result 終わり out1=".$out1."
");
//----このresultであるtotal_priceが得られた時点で、起動されるトリガープログラムは、ddsat_wait_resultコマンドで定義ができます。
?>
他のコマンドへのリンク