我如何使自动生成列在Adempiere



我有两列QuantityIssued Quantity。我希望当我在Quantity列中输入值时,例如3, Issued Quantity会自动生成3。我也希望它能以另一种方式发生。

示例位于Purchase Order窗口,PO Line选项卡上。在Quantity节。当我在Quantity字段中输入4时,PO Quantity字段会自动生成4

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

这是在Adempiere中通过Callout完成的,该Callout在Adempiere称为应用程序字典的地方配置

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

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

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

现在Column选项卡并向下滚动列表以找到QtyEntered列。切换到Form视图,在接近结束时,您将看到可以输入Callout字段的位置。

您应该看到C_OrderLine。QtyEntered字段已经有一个值org.compiere.model.CalloutOrder.amt",指示它应该在类中运行qty方法,然后在org.compiere.model.CalloutOrder类中运行方法。

如果你打开这些类,你会发现计算和修改值是多么容易。为你分解一些…如果您打开CalloutOrder.java类,您可以向下滚动,直到找到qty方法。

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

您需要对您创建的任何新callout方法使用上述签名。按照这种方法,Adempiere将为您传递正确的值

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

从上面的方法开始是一个很好的做法,确保你不会从一个Callout中打开一个Callout——这会打破addempiere规则。

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

是一个如何从现有窗口中提取值的示例…无论列/字段,语法都将保持不变,您只需要输入"M_Product_ID",这是您希望提取使用的字段名称。

现在这个Callout被多个列/字段调用,所以它被一个大的if…then…否则执行相关字段所需的逻辑。它不是很漂亮,但它是针对那些更关注业务逻辑而不是编码原则的业务开发人员的。

你感兴趣的代码是

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

设置另一个数量字段"订购数量"的值。

同样,调用不能是Java。可以链接任何[JSR223脚本][3]。我从来没有真正尝试过这种方法,但它甚至可以实现Callouts使用Drools规则引擎!

相关内容

  • 没有找到相关文章

最新更新