根据订购数量添加状态
Add status based on Quantity ordered
我正在使用 Adempiere。我有三个 table 和一个视图。
一个是'M_INVENTORY'
,'M_INVENTORYLINE'
,'M_REPLENISH'
,另一个是'VW_DAFTARBARANG_AVAILABLE'
。
当我们要选择Warehouse
时使用M_Inventory
。显示如下
M_INVENTORY
------------------------------------
M_Inventory_ID || M_Warehouse_ID
------------------------------------
2000001 || 1000001
2000002 || 1000002
2000003 || 1000003
M_InventoryLine
是我们要订货的时候用的,这里放
Product
和 Quantity
已订购。 M_InventoryLine
嵌套自 M_Inventory
,因此我们从 M_Inventory
中选择的相关 Warehouse
订购库存。
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
我想将信息放在 table M_InventoryLine
的 Status
列中。
如果 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
-> 变成 below Minimum Level
,
因此,它只能满足 7 个中的 5 个,因此库存仍处于最低水平。)
如果Available
处于他的最低库存以致无法订购库存,则状态显示'N/A
'
示例:M_Product_ID
= 1000013
(QtyInternalUse
[顺序] = 8
, Level_Min
= 12
, Av
= 12
, -> 数量 Available
与 minimum level
相同,因此无法订购)
我试过通过制作这样的东西来制作触发器 =
CREATE OR REPLACE TRIGGER STATUS_MR
BEFORE INSERT ON M_INVENTORYLINE
FOR EACH ROW
BEGIN
WHEN M_INVENTORY.M_WAREHOUSE_ID = M_WAREHOUSE_ID AND M_PRODUCT_ID = M_PRODUCT_ID;
IF :NEW.QTYINTERNALUSE <= VW_DAFTARBARANG_AVAILABLE.AVAILABLE THEN
:new.Status := "Complete"
ELSIF :NEW.QTYINTERNALUSE > VW_DAFTARBARANG_AVAILABLE.AVAILABLE THEN
:new.Status := "Partial"
ELSE
:new.status := "Not Available"
END IF;
END;
还有很多错误,我很困惑如何根据
我的情况。
任何建议将不胜感激:)
我不确定这里是否需要触发器,也许基于此查询的视图就足够了:
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
的部分,不确定这是不是 important/possible。触发器可能需要调整,而且肯定
需要测试,无论如何我希望这会有所帮助。另外 - 如果视图 vw_daftarbarang_available
使用 table m_inventoryline
你可能会遇到
"mutating table error",但这只是我的警告,因为我没有看到视图定义。
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;
我正在使用 Adempiere。我有三个 table 和一个视图。
一个是'M_INVENTORY'
,'M_INVENTORYLINE'
,'M_REPLENISH'
,另一个是'VW_DAFTARBARANG_AVAILABLE'
。
当我们要选择Warehouse
时使用M_Inventory
。显示如下
M_INVENTORY
------------------------------------
M_Inventory_ID || M_Warehouse_ID
------------------------------------
2000001 || 1000001
2000002 || 1000002
2000003 || 1000003
M_InventoryLine
是我们要订货的时候用的,这里放
Product
和 Quantity
已订购。 M_InventoryLine
嵌套自 M_Inventory
,因此我们从 M_Inventory
中选择的相关 Warehouse
订购库存。
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
我想将信息放在 table M_InventoryLine
的 Status
列中。
如果 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
-> 变成 below Minimum Level
,
因此,它只能满足 7 个中的 5 个,因此库存仍处于最低水平。)
如果Available
处于他的最低库存以致无法订购库存,则状态显示'N/A
'
示例:M_Product_ID
= 1000013
(QtyInternalUse
[顺序] = 8
, Level_Min
= 12
, Av
= 12
, -> 数量 Available
与 minimum level
相同,因此无法订购)
我试过通过制作这样的东西来制作触发器 =
CREATE OR REPLACE TRIGGER STATUS_MR
BEFORE INSERT ON M_INVENTORYLINE
FOR EACH ROW
BEGIN
WHEN M_INVENTORY.M_WAREHOUSE_ID = M_WAREHOUSE_ID AND M_PRODUCT_ID = M_PRODUCT_ID;
IF :NEW.QTYINTERNALUSE <= VW_DAFTARBARANG_AVAILABLE.AVAILABLE THEN
:new.Status := "Complete"
ELSIF :NEW.QTYINTERNALUSE > VW_DAFTARBARANG_AVAILABLE.AVAILABLE THEN
:new.Status := "Partial"
ELSE
:new.status := "Not Available"
END IF;
END;
还有很多错误,我很困惑如何根据 我的情况。
任何建议将不胜感激:)
我不确定这里是否需要触发器,也许基于此查询的视图就足够了:
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
的部分,不确定这是不是 important/possible。触发器可能需要调整,而且肯定
需要测试,无论如何我希望这会有所帮助。另外 - 如果视图 vw_daftarbarang_available
使用 table m_inventoryline
你可能会遇到
"mutating table error",但这只是我的警告,因为我没有看到视图定义。
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;