◇2015-12-07: 顧客マスタを「法人番号システム Web-API」でクリーニング
この業務プロセスは、「取引先の商号が変更されていないか」を、毎週自動チェックする仕組みだ。日曜日の朝6時に自動的に開始される。人間は、「顧客マスター」(XML)に修正すべき点が発生したことを、自然と検知できる。
ただ「全ての取引先が法人番号を持っている」と言う前提に立っている。つまり、全ての取引先について、1件1件「Web-API 機能」に問い合わせているのだ。現実には『法人番号』を持たない取引先(個人事業主や海外企業など)も存在する。
以下の業務プロセス定義では、「顧客マスター」にダミー番号「9999999999999」(13桁の9)の存在を許容する。
すなわち、海外顧客など法人番号を持たない取引先は「13桁の9」を登録するというルールだ。また『Web-API 機能』へのリクエストも、10件ずつ行う仕組みになっている。
[取引先マスタ登録商号の自動チェック2]
[スクリプト工程]などの自動工程を活用すると、「無人化」「高速化」などの大きなメリットがある。
しかし一方で、「自動化」の程度に比例して、「HTTP 通信の知識」や「JavaScript の知識」などが必要となってくる。すなわち、「メンテナンスできる人が限られてしまう」という新たなリスクが発生してしまう。
この例では、2つの[スクリプト工程]において、50行程度と100行程の JavaScript がセットされている。
確かにそれほど複雑なスクリプトではない。また、この例に限って言えば「修正が必要となるケース」は想定しづらいだろう。が、しかし、それでも、あらかじめワークフロー運用における「リスク」について、しっかり考察したうえで活用すべきなのだろう。
[取引先マスタ登録商号の自動チェック2:「1. Confirm / 確認」画面]
▼スクリプト工程『Count # of clientsXML』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving ==
// [共通ファイル]に登録されている XML ファイル (M319)
// returns "List<ItemView>"
optionsList = itemDao.findAll("Business-Connections.xml", true);
//// == 演算 / Calculating ==
var numOfClients = 0; // javascript number
numOfClients = optionsList.size(); // 登録されている取引先数
var clientsCorporateNumbers = ""; // javascript string
var clientsCorporateNames = "";
var iRequestCorporateNumbers = ""; // javascript string
var iCorporateNames = "";
for (j = 0; j < numOfClients; j++){
clientsCorporateNumbers += optionsList.get(j).getValue().substr(7, 13) + "\n";
clientsCorporateNames += optionsList.get(j).getDisplay() + "\n";
if ( j < 10 ){ // 最大10件分をセット(法人番号はコンマで接続)
if ( optionsList.get(j).getValue().substr(7, 13) != "9999999999999" ){
iRequestCorporateNumbers += optionsList.get(j).getValue().substr(7, 13) + ",";
iCorporateNames += optionsList.get(j).getDisplay() + "\n";
}
}
}
if ( iRequestCorporateNumbers == "" ){ // 法人番号が一つもセットされなかった場合
iRequestCorporateNumbers = "6130001031686";
iCorporateNames = "株式会社クエステトラ";
}
var numOfLoops = 0; // javascript number
numOfLoops = Math.ceil(numOfClients / 10) ; // 10件ずつループでの必要何回
//// == ワークフローデータへの代入 / Updating ==
retVal.put("1", java.math.BigDecimal(numOfClients) );
retVal.put("2", java.math.BigDecimal(numOfLoops) );
retVal.put("3", clientsCorporateNumbers );
retVal.put("4", clientsCorporateNames );
retVal.put("5", java.math.BigDecimal(0) ); // i=0
retVal.put("6", iRequestCorporateNumbers ); // 初回リクエスト
retVal.put("7", iCorporateNames ); // 初回リクエスト分の商号一覧
retVal.put("11", "vvv Check Log vvv\n" ); // null 状態を解除
if( numOfClients == 0 ){
retVal.put("11", "Business-Connections.xml: no such file ?" );
}
▼スクリプト工程『Res Chk / Req Prep』の設定サンプル (サーバサイド JavaScript)
//// == ワークフローデータの参照 / Retrieving ==
var i = 0; // javascript number
i = data.get("5") - 0;
var iRequestCorporateNumbers= ""; // javascript string
iRequestCorporateNumbers = data.get("6") + "";
var iCorporateNames = ""; // javascript string
iCorporateNames = data.get("7") + "";
var diffLog = ""; // javascript string
diffLog = data.get("11") + "";
var iResponseTmp = ""; // javascript string
iResponseTmp = data.get("8") + "";
iResponseTmp = iResponseTmp.replace(/^<\?xml\s+version\s*=\s*(["'])[^\1]+\1[^?]*\?>/, "");
// E4X bug 336551
var iResponseXML = new XML(iResponseTmp); // javascript xml
// 次の10件をセットするために
var numOfClients = 0; // javascript number
numOfClients = data.get("1") - 0;
var clientsCorporateNumbers = ""; // javascript string
var clientsCorporateNames = "";
clientsCorporateNumbers = data.get("3") + ""; // (multi-lines)
clientsCorporateNames = data.get("4") + "";
//// == 演算 / Calculating ==
var xmlCorporationCount = 0; // javascript number
xmlCorporationCount = iResponseXML.count - 0;
var iResponseCorporateNames = ""; // javascript string
var array = iCorporateNames.split("\n");
var arrayNumber = iRequestCorporateNumbers.split(",");
// リクエスト順(AAA,BBB,)とレスポンス順(xml)は一致しない
for ( j = 0; j < xmlCorporationCount; j++ ){
var k = 0;
for ( k = 0; k < 10; k++ ){
if ( iResponseXML.corporation[k].corporateNumber == arrayNumber[j] ){
break;
}
}
iResponseCorporateNames += iResponseXML.corporation[k].name + "\n";
if( array[j] == iResponseXML.corporation[k].name ){
diffLog += "ok: ";
} else {
diffLog += "NG: ";
}
diffLog += array[j] + " is " + iResponseXML.corporation[k].name + "\n";
}
// 次の10件をセット
var nextiRequestCorporateNumbers = "";
var nextiCorporateNames = ""; // javascript string
var array2 = clientsCorporateNumbers.split("\n");
var array3 = clientsCorporateNames.split("\n");
var request10 = 10; // javascript number
if ( (i+2) * 10 > numOfClients ){
request10 = numOfClients - (i+1) * 10; // 最終ループは負
}
if ( request10 > 0 ){
for ( j = 0; j < request10; j++ ){
if ( array2[(i+1)*10+j] != "9999999999999" ){
nextiRequestCorporateNumbers += array2[(i+1)*10+j] + ",";
nextiCorporateNames += array3[(i+1)*10+j] + "\n";
}
}
if ( nextiRequestCorporateNumbers == "" ){ // 法人番号が一つもセットされなかった場合
nextiRequestCorporateNumbers = "6130001031686";
nextiCorporateNames = "株式会社クエステトラ";
}
retVal.put("6", nextiRequestCorporateNumbers );
retVal.put("7", nextiCorporateNames );
}
//// == ワークフローデータへの代入 / Updating ==
retVal.put("5", java.math.BigDecimal(i + 1) );
retVal.put("10", iResponseCorporateNames );
retVal.put("11", diffLog );
<データ項目一覧画面>
[雛形ダウンロード (無料)]
- 業務テンプレート:取引先マスタ登録商号の自動チェック2
- 顧客マスタを「法人番号システム Web-API」でクリーニング (2015-12-07)
- 法人番号を使った取引先マスターの管理(一括更新編) (2015-09-21)
- 法人番号を使った取引先マスターの管理(追加更新編) (2015-09-14)
- 法人番号で外部 Web-API に問い合わせる (2015-10-26)
- M407 データ項目 業務の流れ: 挿し込みメールが繰り返し送信されるように設定する (使い方)
- M230 自動工程: 業務データの複雑なデータ加工が自動実行されるように設定する(ECMAスクリプト) (使い方)
- M319 プロセスモデリング環境: 複数の業務プロセス定義から参照される選択肢XMLを登録する (使い方)
[英文記事 (English Entry) ]





0 件のコメント :
コメントを投稿