◇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 件のコメント :
コメントを投稿