失敗しない!選択肢 XML 更新作業とは?(サービスタスク Addon編)

サービスタスク Addon を用いて「選択肢マスタ」を更新する自動工程を作成しよう!

こんにちは、古久保です。

選択肢 XML の更新のお問い合わせが多くございます。
より便利に、簡単にマスタ情報の管理が行える提案を求められるケースが多いです。

以前、以下の記事にてご紹介致しました。

失敗しない!選択肢 XML 更新作業とは?
それならば、「選択肢 XML 更新作業手順」を改善し、さらにもっと便利にしていきましょう!
<方針>
* 便利にする
共有ファイルのダウンロード/アップロードの手段を使わず、更新内容を入力して自動更新を行う。
* 改善する
複数人が非同期に作業をしても洗い替えの影響を可能な限り回避する。

http://www.questetra.com/ja/blog/cat-questetra-tips-ja/safetyupdate-options-xml/

この記事に対して

* 様々な選択肢 XML を更新する必要があり、作成したプロセスモデル毎にいちいち、スクリプトタスクの内容をコピペして実現するのが面倒。
* コピペだけではなく、プロセスデータ項目番号も変更するのを失敗するケースがよくある。

等とご指摘がございましたが、ごもっともでございます。
少しでも楽に、間違いが少ない形での実現方法をご提案します。

◆自動工程の定義ファイルを組み込んで実現

スクリプトタスクの内容を定義ファイルに組み込むこと(サービスタスク Addon)でご指摘に対応できるのでは無いかと考えています。

業務プロセス定義で利用可能な自動工程を追加する
“文字数とハッシュ値を取得する” といった処理工程を自動化したい場合、標準の[サービス工程]や[イベント]だけでは表現できません([スクリプト工程]を利用することになります)。しかし、予め “文字数カウント-addon.xml” や “SHAハッシュ-addon.xml” といった[アドオンXML]をインポートしておけば、簡単に処理工程の自動化を実現することができます。(Service-Task Addon)

http://www.questetra.com/ja/tour/m4/m415/

「失敗しない!選択肢 XML 更新作業とは?」にて紹介しましたプロセスモデル

<選択肢 XML 更新プロセスモデル>
4-選択肢XML更新プロセスモデル改良版

に対して「サービスタスク Addon 」で実現しますと

<選択肢 XML 更新プロセスモデル:サービスタスク Addon 版>

となります。
見た目かほぼわらないですね。(どこが違うでしょう?)
しかし、GUI による設定に変わり、より容易に、間違えにくくなっています。

<対象データ更新処理工程(サービスタスク Addon )>

* 選択肢 XML 更新対象データを示すプロセスデータ項目をプルダウンメニューで選択。(文字列型複数行のデータを選択)
* 選択肢 XML 更新用データ(値用、表示ラベル用、選択肢データ用)を示すプロセスデータ項目をプルダウンメニューで選択。
「値用」、「表示ラベル用」は、文字列型複数行のデータを選択。
「選択肢データ用」は、選択肢型のデータを選択。

更新対象の選択肢 XML のファイル名は記述しなくてはならないですが他はプロセスデータ項目の名称で選択することになるので間違いは少なくなるでしょう。

◆ 対象データ更新処理工程(サービスタスク Addon )コード例

<?xml version="1.0" encoding="UTF-8"?><service-task-definition>

<label locale="ja">マスタ更新用データ生成サービス</label>

<configs>
  <config name="conf_MasterFile" required="true" form-type="TEXTFIELD">
    <label>更新対象マスタファイル名を記述して下さい。</label>
  </config>
<config name="conf_TargetData" required="true" form-type="SELECT" select-data-type="STRING_TEXTAREA">
    <label>更新対象レコードデータを選択して下さい。</label>
  </config>
  <config name="conf_MasterSourceId" required="true" form-type="SELECT" select-data-type="STRING_TEXTAREA">
    <label>更新用テキストエリア(ID)データを選択して下さい。</label>
  </config>
  <config name="conf_MasterSourceDisplay" required="true" form-type="SELECT" select-data-type="STRING_TEXTAREA">
    <label>更新用テキストエリア(表示)データを選択して下さい。</label>
  </config>
  <config name="conf_CheckResult" required="true" form-type="SELECT" select-data-type="SELECT_SINGLE">
    <label>更新チェック結果データを選択して下さい。</label>
  </config>
</configs>

<script><![CDATA[
// マスタ更新用スクリプト(ver. 20170209)
// 指定されたデータレコードを追加/更新/削除種別によって処理する
// (c) 2017, Questetra, Inc. (the MIT License)

//// == 工程コンフィグの参照 / Config Retrieving ==
var masterFileName = configs.get( "conf_MasterFile" );  // return 選択肢マスタファイル名
var targetDataNum = configs.get( "conf_TargetData" ); // (returns Number)
var masterSourceIdNum = configs.get( "conf_MasterSourceId" ); // (returns Number)
var masterSourceDisplayNum = configs.get( "conf_MasterSourceDisplay" ); // (returns Number)
var checkResultNum = configs.get( "conf_CheckResult" ); // (returns Number)

//// == ワークフローデータの参照,定義 / Data Retrieving, Data Define ==
var sep = "\n";
var targetDatas = new String(data.get(targetDataNum)).split(sep);
var masterSourceIds = "";
var masterSourceDisplays= "";
var checkResult = "false";

//// == 演算 / Calculating ==
// 対象マスタ取得
var items = itemDao.findAll(masterFileName, true);
// レコード更新もしくは削除
for (var i = 0; i < items.size(); i++){
	var matchKind = "";
	for (var j = 0; j < targetDatas.length; j++){
		var cols = targetDatas[j].split(",");
		if (items.get(i).getValue() == cols[1]){
			if (cols[0] == "U"){
				matchKind = "update";
				masterSourceIds += items.get(i).getValue() + "\n";
				masterSourceDisplays += cols[2] + "\n";
				checkResult = "true";
				break;
			}
			if (cols[0] == "D"){
				matchKind = "delete";
				checkResult = "true";
				break;
			}
		}
	}
	if (matchKind == ""){
		masterSourceIds += items.get(i).getValue() + "\n";
		masterSourceDisplays += items.get(i).getDisplay() + "\n";
	}
}
// レコード追加
for (var j = 0; j < targetDatas.length; j++){
	var cols = targetDatas[j].split(",");
	if (cols[0] == "I"){
		// 追加レコードがすでに存在した場合、セットしない
		if (masterSourceIds.indexOf(cols[1] + "\n") == -1){
			masterSourceIds += cols[1] + "\n";
			masterSourceDisplays += cols[2] + "\n";
			checkResult = "true";
		}
	}
}
masterSourceIds = masterSourceIds.replace(/\n$/,"") ;          // 最後の改行を削除
masterSourceDisplays = masterSourceDisplays.replace(/\n$/,""); // 最後の改行を削除

// for Debug

//// == ワークフローデータへの代入 / Data Updating ==
retVal.put( masterSourceIdNum, masterSourceIds);
retVal.put( masterSourceDisplayNum, masterSourceDisplays );
retVal.put( checkResultNum, [checkResult]);

]]></script>

<icon>
(◆◆◆◆省略◆◆◆)
</icon>

</service-task-definition>

このサービスタスクにインプットされる「更新対象レコードデータ」のデータフォーマットは、「失敗しない!選択肢 XML 更新作業とは?」で定義しているフォーマットと同じです。
さらなる工夫点としては、

* エラーチェックをより厳密に行う。
* 既に有るデータを追加する場合や、存在しないデータの削除による処理スキップのログを残す。

が考えられるかもしれません。

◆あとがき

スクリプトタスクで実現されている内容をサービスタスク Addon に置き換える一つのパターンとなる例と思います。
今後もよく使用されるパターンを紹介させてもらえればと思います。

より効率的な自動処理の実装として、一度、利用や改善のご検討を頂ければと思います。
ご検討時のご相談は、お気軽にお声掛け下さい。

◆ワークフローサンプル

2017-02-20

Masato Furukubo の紹介

Questetra, Inc. Sales Department
Masato Furukubo の投稿をすべて表示

あわせて読みたい
50.Questetra Tips の前の記事 FAQ. [オープンチャット]に投稿されたメッセージの共有範囲は?
50.Questetra Tips の次の記事 コンビニ印刷サービスとクラウド BPM との連携事例
Masato Furukubo の他の記事 ロボット君がランダムに翻訳者を指名してくれる方法(3)

アーカイブ

 RSS