ラベル Application Dictionary の投稿を表示しています。 すべての投稿を表示
ラベル Application Dictionary の投稿を表示しています。 すべての投稿を表示

2015年1月5日月曜日

iDempiere アプリケーション辞書 画面のカスタマイズ(Default Logic)

Windows, Tab & Field の画面エディタの機能をいじってみようと思っていたのですが、気になることがあったので、もちっとフィールド設定いじります。

前回は 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かな?

2015年1月4日日曜日

iDempiere アプリケーション辞書 画面のカスタマイズ

iDempiere のカスタムは Javaによるプログラミングとアプリケーション辞書によるカスタマイズがあるようです。
ここではアプリケーション辞書を取り上げます。(Java によるプログラミングもいずれ、、)

今回はアプリケーション辞書により画面のカスタマイズやってみます。
現時点たいしたことは出来ないでしょうが、道筋というか経験というか、、

アプリケーション辞書の概念の理解はCompiere Distribution Lab 殿の研究を読まれると良いと思います。(非公開コンテンツもあるので詳しく知りたい方は問い合わせされるのも良いと思います。)



というわけで、今回の題材は Requisition の Requisition Lineの Product が必須入力として設定されていない問題。
(以前Requisition 調査していたとき、Product が必須じゃないことに疑問を持ったので、修正しちゃいます。)

-----------------------後日追加----------------------
Requisition Line で Charge について確認してみると、、Charge に値を設定した場合はこの Product の項目は非表示になることがわかりました。
つまり Product は必須というわけではなく、仕様の通りということになります。
例えば購入後に輸送費を追加請求する時とかに使うのでしょうか?

ちなみにここで Product を必須にしても Charge を指定すると Product の項目が消えるので問題なくセーブできるました。
----------------------------------------------------------

いきなり脱線しますが、これまでデータが必須かどうかは画面に表示されている項目名が赤字かどうかで判別してきました。いまさらですが、これは本質的には正しくありません。
原則論で言えばデータの依存関係はデータスキーマで規定すべきもので、画面は単なる表現方法にすぎません。しかし実際には実オペレーションの関係からデータ入力タイミング的に原則論に無理もありますので、「原則を理解した上で画面による制御も許容する」程度の姿勢が現実的かもしれません。

前口上はこのぐらいにして、実際にトライしてみます。

私がいきなり悩んだのは、「Window,  Tab & Field」という画面がどこにも見当たらないということでした。

Menu -> Application Dictionary を見るとWindow Customization/Context Help/Application Packaging の3機能しか出てきません。

Red1さんの YouTubeでもログオンは SuperUser なのですが、SuperUserでログオンしてもどうやっても呼び出せません。よーく画面を見てみると右上には System とありました。
なるほど、 System ユーザーでログオンするのね。

というわけで、こちらが System でのログオン。

Menu -> Application Dictionary を見てみるとずらずらっと、機能が表示され、この中に 「Window,  Tab & Field」も含まれていることを確認できました。


今日のお題いきましょう。
「 Requisition の Requisition Lineの Product を必須入力項目にしたい。」

営業担当の西島さんでログオンします。
Menu -> Requisition-to-Invoice -> Requisition
からヘッダー部分を適当に入力し、子タブ Requisition Line を開きます。

ここでは Product は赤文字になっておらず、必須入力ではないことがわかります。
一度ログオフし、今度は System でログオンし直します。
Menu -> Application Dictionary -> Window, Tab & Field を開きます。

 画面 Requisition を検索します。
 Requisition 画面の設定が開いたら子タブ(Tab) から Requisition Line を選択し、子タブへ移動します。

Requisition Line が開いたら、属性を変更したいフィールド "Product" を選択し、子タブへ移動します。

 Product フィールドの属性がいろいろと表示されます。
今回は入力を必須としたいので、 Mandatory Overwrite (変更必須) を "YES" にします。
 変更したら保存してSystemからログアウト
西島さんでログオンして、先ほどの Requisition LIne を開いてみると、、、

Product が赤文字になっています。
変更前は空白のままでもセーブ可能だったのですが、変更後は空白のまま Fill mandatory Fields: Product と表示されました。



このように Windows, Tab & Field 画面を使うと iDempiere のちょっとしたカスタマイズは可能です。
Fieldの X position とか、Sequence とかいじれば項目の表示位置の変更もできると思います。
が、、、


Windows, Tab & Field はなんと画面エディタの機能も持っているため、 WYSIWYG(この単語自体は懐かし響きがありますね。)として視覚的に画面をいじることができます。

次はこのあたりちょっと掘ってみたいと思います。