如何在Adempiere中创建自动生成的列?

时间:2015-09-17 04:15:37

标签: window adempiere

我有两列名为QuantityIssued Quantity。我希望当我在Quantity列中添加值时,例如3Issued Quantity将自动生成3。另外,我希望它反过来发生。

该示例位于Purchase Order窗口,PO Line标签上。在Quantity部分。当我将4放入Quantity字段时,PO Quantity字段会自动生成4

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

1 个答案:

答案 0 :(得分:0)

这是在Adempiere中由renamed完成的,该Callout在Adempiere所称的Application Dictionary

中配置

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

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

在打开的搜索框中输入 C_OrderLine 作为数据库表名称

现在标签并向下滚动列表以找到 QtyEntered 列。切换到表单视图,接近结尾,您将看到可以输入字段标注

您应该看到C_OrderLine.QtyEntered字段已经有一个值“ org.compiere.model.CalloutOrder.qty; org.compiere.model.CalloutOrder.amt ”,表明它应该运行类 org.compiere.model.CalloutOrder 中的方法 qty ,然后是 org.compiere.model.CalloutOrder中的方法 amt 上课。

如果您打开这些类,您可以看到评估和修改值的容易程度。打破它的一些...如果你打开CalloutOrder.java类,你可以向下滚动直到找到qty方法。

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

您需要使用上面的签名来创建您创建的任何新的标注方法。遵循这种方法,Adempiere将为您传递正确的值

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

最好使用上面的方法启动方法,确保不要在Callout中打开Callout - 这会违反Adempiere规则。

    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);
    }

是一个如何从现有窗口中提取值的示例...无论列/字段如何,您只需要输入“M_Product_ID”,即要提取到的字段名称,语法将保持不变使用

现在这个标注被多个列/字段调用,所以它被一个大的if ... then ... else乱七八糟地执行相关字段所需的逻辑。它并不漂亮,但这是针对业务开发人员,他们将更多地专注于业务逻辑而不是编码主体。

您感兴趣的代码是

mTab.setValue("QtyOrdered", QtyOrdered);

代码

{{1}}

是否设置了其他数量字段的数量Qty Ordered。

此外,调用不能是Java。可以链接任何[JSR223脚本] [3]。我自己从未尝试过这种方法,但甚至可以使用Drools规则引擎实现 Callouts