我正在使用Adempiere。我有三张桌子和一个视图。
它是'M_INVENTORY'
,'M_INVENTORYLINE'
,'M_REPLENISH'
,另一个是'VW_DAFTARBARANG_AVAILABLE'
。
当我们想要选择M_Inventory
时,会使用Warehouse
。它显示如下
M_INVENTORY
------------------------------------
M_Inventory_ID || M_Warehouse_ID
------------------------------------
2000001 || 1000001
2000002 || 1000002
2000003 || 1000003
我们想要订购库存时使用 M_InventoryLine
,我们在这里放置
已订购Product
和Quantity
。 M_InventoryLine
嵌套在M_Inventory
,因此我们从Warehouse
中选择的相关M_Inventory
订购了广告资源。
M_INVENTORYLINE
-----------------------------------------------------------
M_Inventory_ID || M_Product_ID || QtyInternalUse || Status
2000001 || 1000011 || 5 ||
2000001 || 1000012 || 7 ||
2000001 || 1000013 || 8 ||
M_Replenish
用于检查最低库存水平。
M_REPLENISH
-----------------------------
M_Product_ID || Level_Min
1000011 || 20
1000012 || 15
1000013 || 12
可以在VW_DAFTARBARANG_AVAILABLE
视图中查看库存的可用性。
VW_DAFTARBARANG_AVAILABLE
--------------------------------------------
M_Warehouse_ID || M_Product_ID || Available
--------------------------------------------
1000001 || 1000011 || 27
1000001 || 1000012 || 20
1000001 || 1000013 || 12
1000002 || 1000011 || 25
1000002 || 1000012 || 20
1000003 || 1000011 || 25
1000003 || 1000012 || 20
我想将信息放在表Status
的{{1}}列中。
如果在订购库存时M_InventoryLine
超过最低库存,则状态显示Available
示例:'Complete'
= M_Product_ID
(1000011
[订单] = QtyInternalUse
,5
= Level_Min
,20
= Av
,27
- >仍为27-5 = 22
)
如果above Minimum Level
在订购库存一半时达到最低库存,则状态显示Available
示例:' Partial'
= M_Product_ID
(1000012
[订单] = QtyInternalUse
,7
= Level_Min
,15
= Av
,20
- >成为20-7 = 13
,
因此,它只能满足7个中的5个,因此库存仍处于最低水平。)
如果below Minimum Level
在他的最低库存中,因此无法订购库存,则状态显示为Available
'
示例:'N/A
= M_Product_ID
(1000013
[订单] = QtyInternalUse
,8
= Level_Min
,12
= Av
, - >数量12
与Available
相同,因此无法订购)
我尝试通过制作类似这样的东西来制作触发器
minimum level
仍然存在很多错误,我对如何基于此编写触发器感到困惑 我的条件。
任何建议将不胜感激:)
答案 0 :(得分:0)
我不确定此处是否需要触发器,也许根据此查询进行查看就足够了:
select m_inventory_id, m_product_id, qtyinternaluse qty, level_min lvl, available,
case when available - qtyinternaluse > level_min then 'Complete'
when available <= level_min then 'Not Available'
else 'Partial' end status
from m_inventory i
join m_inventoryline il using (m_inventory_id)
join m_replenish r using (m_product_id)
join vw_daftarbarang_available d using (m_warehouse_id, m_product_id);
如果您坚持使用触发器,则下面的内容适用于您提供的数据,逻辑和示例。
我添加了部分用于更新qtyinternaluse
,不确定这是否重要/可能。触发可能需要调整并且肯定
需要测试,无论如何我希望这会有所帮助。此外 - 如果查看vw_daftarbarang_available
使用您可能遇到的表m_inventoryline
&#34;变异表错误&#34;,但这只是我的警告,因为我没有看到视图定义。
create or replace trigger status_mr
before insert or update of qtyinternaluse on m_inventoryline for each row
declare
v_qty_max number := 0;
begin
select available-level_min into v_qty_max
from m_replenish r join vw_daftarbarang_available da using (m_product_id)
join m_inventory i using (m_warehouse_id)
where m_product_id = :new.m_product_id and m_inventory_id = :new.m_inventory_id;
if inserting then
if :new.qtyinternaluse <= v_qty_max then
:new.Status := 'Complete';
elsif v_qty_max <= 0 then
:new.status := 'Not Available';
else
:new.Status := 'Partial';
end if;
elsif updating then
if :new.qtyinternaluse <= v_qty_max + :old.qtyinternaluse then
:new.Status := 'Complete';
elsif v_qty_max + :old.qtyinternaluse <= 0 then
:new.status := 'Not Available';
else
:new.Status := 'Partial';
end if;
end if;
end;