这是Adempiere特意设计的功能。在某些情况下,库存允许变为负值,因为在这些情况下,最好允许过程完成但是负值则突出显示必须解决的问题。在内部使用的情况下,用户被警告,如果他们继续进行,股票将变为负数。
要改变这种标准的功能,您需要修改
org.compiere.model.MInventory.completeIt()
但如果你直接更改代码,它会变得更加困难,以保持你的版本同步与基ADempiere的,甚至只是应用补丁。
推荐的方法是添加Model Validator。这是一种监视底层数据模型并在发生特定事件时能够注入额外代码/逻辑的机制。
你想要的事件是文档事件TIMING_BEFORE_COMPLETE。 为链接描述您可以创建一个新的模型验证,在ADempiere的应用程序字典注册登记,因为你希望你的代码触发时库存文件类型执行你想补充的方法是这样的
public String docValidate (PO po, int timing)
{
if (timing == TIMING_BEFORE_COMPLETE) {
if (po.get_TableName().equals(MInventory.Table_Name))
{
// your code to be executed
// it is executed just before any (internal or physical)
// Inventory is Completed
}
}
return null;
} // docValidate
一句警告; 内部使用功能与物理库存(即库存盘点)功能所使用的功能相同!他们在Adempiere拥有不同的窗户。因此,请确保在应用更改后测试两个功能。从核心org.compiere.model.MInventory
有一个暗示,你如何区分这两者。
//Get Quantity Internal Use
BigDecimal qtyDiff = line.getQtyInternalUse().negate();
//If Quantity Internal Use = Zero Then Physical Inventory Else Internal Use Inventory
if (qtyDiff.signum() == 0)
这将是一个更好的做法,如果你可以分享,如果解决方案是不合格的,或者他们投票并标记为正确将帮助未来的用户相同的问题。 – JavaDragon