如何在 Adempiere 中制作自动生成的列?
How can I make automatic generated column in Adempiere ?
我有两列,名为 Quantity
和 Issued Quantity
。我希望当我在 Quantity
列中输入值时,例如 3
,Issued 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 之后是方法 amt 在 org.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!
我有两列,名为 Quantity
和 Issued Quantity
。我希望当我在 Quantity
列中输入值时,例如 3
,Issued 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 之后是方法 amt 在 org.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!