備忘録記事です。ZOHO Creatorのワークフローでのスクリプト書き方サンプル。
想定
- 「製品フォーム」と「部品調達指示フォーム」がある。
- 製品フォームにはその製品を構成する部品をサブフォームとして記録してある。
- 部品調達指示フォームには「製品50個作るために、必要な構成部品とその数量」を記録するフォーム。
図のように、「製品を作るのに必要な構成部品をそれぞれ何個調達すればよいか?」を自動で取得・作成したい。
処理の流れ
- 部品調達指示フォーム上で
- 製品名を選択・入力したタイミングで
- 製品フォームの該当製品の情報を参照し、サブフォームの部品リストを部品調達指示書のフォームに転記
- その際に、製造数量(上図でいうと「50」)と「単位数量」を掛け算して調達数量を自動で入力する
※実際には「一旦選んだ製品を再度別の製品に選び直した場合はどうするんだ?」とか「製造数量が空欄(Null)だったらどうするんだ」とか「後で製造数量が50→100に変更になった場合の処理は?」とか色々派生で必要となる処理があるが、ここではそういうのを省いて「新たに製品名を選択したタイミング」のみの想定で備忘録を書いておく。
ちなみに、製品名は、「製品フォーム」をルックアップしている。
※「部品」は、別途マスタデータとして「部品フォーム」があり、製品フォーム・部品調達指示フォームともにサブフォームでは部品フォームをルックアップして部品を指定している。
スクリプト
pMyProductID = input.Product;・・・(1) pMyProductQty = input.Quantity;・・・(2) pMyParts = T_Product[ID == pMyProductID].Details;・・・(3) for each pMyRow in pMyParts・・・(4) { pMyPartsID = pMyRow.PartsID_Details;・・・(4-1) pMyUnitQty = pMyRow.UnitQty_Details;・・・(4-2) if(pMyProductQty != null && pMyUnitQty != null) { pMyPickingQty = pMyProductQty * pMyUnitQty; } else { pMyPickingQty = 0; } ・・・(4-3) pMyItem = T_Picking.Details(); ・・・(4-5) pMyItem.Parts=pMyPartsID; ・・・(4-6) pMyItem.UnitQty_Detail=pMyUnitQty.toLong(); pMyItem.Quantity_Detail=pMyPickingQty.toLong(); input.Details.insert(pMyItem); ・・・(4-7) }
このスクリプトでは、判別がしやすいように変数は「pMy・・・」で始まる文字列にしてあります&多少名前が長いですが変数名見ればナンの変数なのかある程度判別できるようにしてあります。
(1)pMyProductIDにフォームで選択された製品IDを格納
(2)pMyProductQtyにフォームで入力された数量を格納
(3)T_Product(←製品フォームのこと)のレコードを[ID=pMyProductID]で特定し、そのサブフォーム(Details)をリストとしてpMyPartsへ格納
(4)pMyPartsのすべての行(つまり、製品フォームに記録されている構成部品=サブフォームのすべての行)についてループ処理を行う。以下、ループ処理の内容
(4-1)pMyPartsIDに、サブフォームの部品のIDを取得して格納する
(4-2)pMyUnitQty に、サブフォームの製品1個あたりの必要部品数量を取得して格納する
(4-3)pMyProductQty ,pMyUnitQty がNullでなければ、掛け算して調達数量を算出する。どちらかがNullなら数量は算出できないので0にしておく
(4-5)pMyItemに現在のフォーム(部品調達指示フォーム)のサブフォームを定義する
(4-6)pMyItemの各構成項目に、値((1)~(4-3)で取得した変数の値)を入力する
(4-7)サブフォームにレコード(行)を追加する
あくまで備忘録ですので^^;
なんせこの記事書いている時点でDelugeスクリプトを勉強し始めてまだ2日目なので^^;・・・本当はもうちょっとスマートな処理のしかたやスクリプトの書き方があるだろうと思います^^;。
あくまで弊社内での作業のための備忘録なので・・・参考にされる方はどうぞいくらでも参考にしてください。ただ、この記事&中に書いてあるスクリプトの内容についての質問にはお応えできません(まだお答えするスキルもありませんし^^;)
コメントを投稿するにはログインしてください。