0

と という 2 つの列がQuantityありIssued Quantityます。Quantityたとえば、列に値を入力すると3Issued Quantityが自動的に生成され3ます。また、私はそれが逆に起こることを望んでいます。

例はPurchase Orderウィンドウ、PO Lineタブにあります。Quantityセクションで。フィールドに入れる4と、フィールドは自動的に生成されます。QuantityPO Quantity4

列とフィールドを模倣しようとしましたが、うまくいきません。

4

1 に答える 1

0

これは、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 ルール エンジンを使用してコールアウトを実装することさえ可能です!

于 2015-09-30T19:43:39.467 に答える