これは、Adempiereがアプリケーション ディクショナリと呼んでいるもので設定されたCalloutによって、Adempiere で実現されます。
あなたが与えた例から; 注文書の数量を更新します。システムユーザーを使用してAdempiereにログインすると、アプリケーションディクショナリを表示および変更できます。
メイン メニューからApplication Dictionary->Table & Columnを選択します。
開いた検索ボックスに、 DB テーブル名としてC_OrderLineと入力します。
[列] タブでリストを下にスクロールして、[ QtyEntered ]列を見つけます。フォームビューに切り替えると、最後にCalloutフィールドに入力できることが表示されます。
C_OrderLine.QtyEntered フィールドには既に値 " org.compiere.model.CalloutOrder.qty; org.compiere.model.CalloutOrder.amt " が含まれていることがわかります。これは、クラスorg.compiere.modelでメソッドqtyを実行する必要があることを示しています。 .CalloutOrderの後にorg.compiere.model.CalloutOrderクラスのメソッドamtが続きます。
これらのクラスを開くと、値を簡単に評価および変更できることがわかります。その一部を分解します... CalloutOrder.java クラスを開くと、qty メソッドが見つかるまで下にスクロールします。
public String qty (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
作成する新しいコールアウト メソッドには、上記の署名を使用する必要があります。そのアプローチに従うと、Adempiere が正しい値を渡してくれます。
if (isCalloutActive() || value == null)
return "";
Callout 内から Callout を開かないように、上記の方法でメソッドを開始することをお勧めします。これは、Adempiere の規則に違反します。
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID");
これは、既存のウィンドウから値を抽出する方法の例です...列/フィールドに関係なく、構文は同じままで、抽出して使用するフィールド名である「M_Product_ID」を入力するだけです。
現在、このCalloutは複数の列/フィールドによって呼び出されるため、関連するフィールドに必要なロジックを実行するために、大きな if...then...else が散らばっています。きれいではありませんが、これはプリンシパルのコーディングよりもビジネス ロジックに集中するビジネス開発者を対象としています。
気になるコーデは
else if (mField.getColumnName().equals("QtyEntered"))
{
int C_UOM_To_ID = Env.getContextAsInt(ctx, WindowNo, "C_UOM_ID");
QtyEntered = (BigDecimal)value;
BigDecimal QtyEntered1 = QtyEntered.setScale(MUOM.getPrecision(ctx, C_UOM_To_ID), BigDecimal.ROUND_HALF_UP);
if (QtyEntered.compareTo(QtyEntered1) != 0)
{
log.fine("Corrected QtyEntered Scale UOM=" + C_UOM_To_ID
+ "; QtyEntered=" + QtyEntered + "->" + QtyEntered1);
QtyEntered = QtyEntered1;
mTab.setValue("QtyEntered", QtyEntered);
}
QtyOrdered = MUOMConversion.convertProductFrom (ctx, M_Product_ID,
C_UOM_To_ID, QtyEntered);
if (QtyOrdered == null)
QtyOrdered = QtyEntered;
boolean conversion = QtyEntered.compareTo(QtyOrdered) != 0;
log.fine("UOM=" + C_UOM_To_ID
+ ", QtyEntered=" + QtyEntered
+ " -> " + conversion
+ " QtyOrdered=" + QtyOrdered);
Env.setContext(ctx, WindowNo, "UOMConversion", conversion ? "Y" : "N");
mTab.setValue("QtyOrdered", QtyOrdered);
}
コード
mTab.setValue("QtyOrdered", QtyOrdered);
他の数量フィールド Qty Ordered の値を設定する場所です。
また、呼び出しは Java であってはなりません。任意の [JSR223 スクリプト][3] をリンクすることが可能です。私は実際にこのアプローチを自分で試したことはありませんが、Drools ルール エンジンを使用してコールアウトを実装することさえ可能です!