如何在 Adempiere 中制作自动生成的列?

How can I make automatic generated column in Adempiere ?

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

示例位于 Purchase Order window、PO Line 选项卡上。在 Quantity 部分。当我在 Quantity 字段中输入 4 时, PO Quantity 字段会自动生成 4.

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

这是由 Callout which is configured in what Adempiere calls the Application Dictionary

在 Adempiere 完成的

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

从主菜单select 应用词典->Table & 专栏

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

现在 Column 选项卡并向下滚动列表以找到 QtyEntered 列。切换到 Form 视图,在接近尾声时您会看到可以输入字段 Callout

您应该看到 C_OrderLine.QtyEntered 字段已经有一个值“org.compiere.model.CalloutOrder.qty; org.compiere.model.CalloutOrder.amt”,这表明它应该 运行 方法 qty 在 class org.compiere.model.CalloutOrder 之后是方法 amtorg.compiere.model.CalloutOrder class.

如果您打开这些 classes,您会发现评估和修改值是多么容易。为您分解其中的一些...如果您打开 CalloutOrder.java class,您可以向下滚动直到找到数量方法。

public String qty (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{

您需要为您创建的任何新标注方法使用上述签名。按照这种方法,Adempiere 会负责为您传递正确的值

    if (isCalloutActive() || value == null)
        return "";

最好使用上述方法启动该方法,确保您不会从标注内打开标注 - 这会违反 Adempiere 规则。

int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); 

是一个示例,说明如何从现有的 window 中提取值...无论 Column/Field 是什么,语法都将保持不变,您只需要输入 "M_Product_ID"这是您希望提取使用的字段名称。

现在这个 Callout 被不止一个 Column/Field 调用,所以它充满了一个很大的 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。可以 link 任何 [JSR223 脚本][3]。我本人从未实际尝试过这种方法,但甚至可以使用 Drools 规则引擎实现 Callouts