前回は iDempiere Application Dictionary (アプリケーション辞書)から必須項目の設定をしてみました。
Requisition / Requisition Line の Product を必須項目に変えたのですが、も1つ気になっていたことが、、、
Requisition の Document Type です。
必須項目であることは良いのですが、選択肢が Purchase Requisition の一択。それならデフォルトとしてセットしてくれていればいいのに。。
もしかしたら条件によって別の選択肢が「出現」するかもしれないので、これが正解かは断言できないのですが、デフォルト値のセット方法のお勉強としてやってみようと思います。
まず初期状態の確認。
営業の西島さんでログオンし、
Requisition 画面を開き、新規作成します。
Document Type と Data Required が赤字で必須となっているのがわかります。
この Document Type は Purchase Requisition しか選択肢がありません。
選択すれば良いだけなので、あえて設定を埋め込むほど重要な箇所とは思えませんが、、、、、、(ユーザーの中にはこういうわかりやすいところに異常に固執する人もいますしね。)
設定は System ユーザーで行いますので、ログオンし直します。
前回の Window, Tab & Field 画面で
Requisition / Requisition /Document Type と進みます。
下はWindow, Tab & Fieldで Requisition を選択したところ
子タブの Requisition に移動したところ
子タブの Document Type フィールドの属性を表示させたところ
下の方にスクロールしていくと、 Default Logic というフィールドがあります。
(はじめは空白)
ここに次の文を埋め込みます。
@SQL=SELECT c_doctype_id FROM c_doctype WHERE ad_client_id = @#AD_Client_ID@ AND name = 'Purchase Requisition';
一度ログアウトして、営業ユーザーでログオン、 Requisition画面を表示して新規作成すると今度ははじめから Document Type に Purchase Requisition が設定されているのが確認出来ました。
ここから先は苦労話(&たどり着くまでの道のり)なので、興味の無い方は読み飛ばしてください。
はじめ、超安直に Document Type の Default Logic には リテラルとして 'Purchase Order' という文字列を入力して試してみました。
Requisition 画面で確認しても Document Type は空白のまま。
あたりまえですが、Requisition 画面の Document Type は表示上 Purchase Requisition と見えているだけで、内部的には Document コードを持っていることが予想されます。
Column フィールドを見てもC_DocType_ID_Document Type と設定されています。
DBをのぞいてみると、テーブル名にそれっぽいものが、
テーブル:C_DocType
項目名を確認指定見ると、ありました、C_DocType_ID、きっとこれに違いない。
(本当はきちんとマニュアルなり定義書を調べるべきですが、、、)
SQLでC_DocType_IDを表示してみると、なんと複数のC_DocType_IDが表示されます。
よくよくC_DocTypeを見てみると、 Client ごとに異なるC_DocType_IDを持っていました。
ま、そりゃそうか。。
私の環境ではC_DocType_IDは4レコード(クライアントが4つ)存在したので、ためしに1つ試したところ、思い通りの結果となりました。(他のID はNG)
これで最終的に Default Logicにセットすべきものは、実行しているクライアントのC_DocType_IDであることは確認できました。
次はどうやって動的にC_DocType_IDを取り出すかです。
iDempiere画面横に Tool Tip があり、ここにガイドがあります。
文字列は '(シングルクオート)で囲む
変数は @ (アットマーク)で囲む
ログイン情報は # (シャープ)で始まる
SQLコードは @SQL= から始まる
今必要なのはこの程度でしょうか?
これらの情報から必要な式を作ります。
@SQL=SELECT c_doctype_id FROM c_doctype WHERE ad_client_id = @#AD_Client_ID@ AND name = 'Purchase Requisition';
これで Purchase Requisition の Document Type フィールドの Default Logic に c_doctype_id の中身が渡されます。
(繰り返しになりますが、何かしらの他の条件が存在する可能性があります。ここでは「こうすればうまくいった」程度の示唆であることご理解ください。)
ちなみに私は #AD_Client_ID を取り出すのに苦労をしました。@で囲むんですね。
わかってしまえば簡単なのですけど、、
次こそ WYSIWYGかな?
0 件のコメント:
コメントを投稿