0

我有两列称为QuantityIssued Quantity。我希望当我在Quantity列中输入值时,例如3Issued Quantity将自动生成3. 我也希望它以相反的方式发生。

该示例在Purchase Order窗口,PO Line选项卡上。在Quantity部分。当我4输入Quantity字段时,PO Quantity字段会自动生成4.

我试图模仿列和字段,但它不起作用。

4

1 回答 1

0

这是在 Adempiere 中通过在 Adempiere 所谓的应用程序字典中配置的Callout完成的

从你给出的例子中;更新采购订单上的数量。如果您使用系统用户登录 Adempiere,您可以查看和修改应用程序字典。

从主菜单中选择Application Dictionary->Table & Column

在打开的搜索框中输入C_OrderLine作为DB Table name

现在Column选项卡并向下滚动列表以找到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”,这是您希望提取以使用的字段名称。

现在这个标注被多个列/字段调用,所以它到处都是一个大的 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 回答