我有两列Quantity
和Issued 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方法。 您需要对您创建的任何新callout方法使用上述签名。按照这种方法,Adempiere将为您传递正确的值 从上面的方法开始是一个很好的做法,确保你不会从一个Callout中打开一个Callout——这会打破addempiere规则。 是一个如何从现有窗口中提取值的示例…无论列/字段,语法都将保持不变,您只需要输入"M_Product_ID",这是您希望提取使用的字段名称。 现在这个Callout被多个列/字段调用,所以它被一个大的if…then…否则执行相关字段所需的逻辑。它不是很漂亮,但它是针对那些更关注业务逻辑而不是编码原则的业务开发人员的。public String qty (Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value)
{
if (isCalloutActive() || value == null)
return "";
int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID");
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规则引擎!