Adempiere
,Inventory Stock
可能会变为否定。让它变为负面的一种方法是,当Quantity
放入Internal Use Inventory
Available
以上Warehouse
库存时Product Info
------------
Product || Qty
Fertilizer || 15
。
示例
Qty
“产品信息”中显示Fertilizer
的当前15
为Internal Use Inventory
----------------------
Product || Qty
Fertilizer || 25
。然后我制作内部使用库存文件
Quantity
完成后,-10
将为Internal Use Inventory
。当Quantity
超过Available Stock
时,如何阻止{{1}}完成,以便避免负库存?
答案 0 :(得分:1)
这是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)
答案 1 :(得分:0)
为了防止库存消极,您可以使用两种方法
- 代码中的标注
- BeforeSave方法
醇>
要在Callout中应用它,您需要创建一个Callout类并在那里的定位器中获取当前Stock Qty,然后从输入的Qty中减去qty,如果结果小于0,则显示错误。将此应用于数量字段,您将获得所需的结果。
这是稍微好一点的方法,因为这不需要完全在代码中创建一个新类,并且会消耗更少的内存,在代码中搜索MInventoryLine类,然后在其中搜索beforesave()。添加相同的代码(获取库存,然后从输入的数量中减去它)。 beforesave()中的代码将是这样的
if (your condition here) { log.saveError("Could Not Save - Error", "Qty less than 0"); return false; }
现在我假设您知道创建Callout并设计条件的基本代码,如果您需要任何帮助,请告诉我。
答案 2 :(得分:0)
除了Colin先生的答案,请参见以下代码,以限制基于M_Inventory的交易中的负库存。您也可以在M_Inout和M_Movement表中考虑相同的概念。
client = listener.accept(NULL);
commandProcessor.setClient(client);