根据订购数量添加状态

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是我们要订货的时候用的,这里放 ProductQuantity 已订购。 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_InventoryLineStatus 列中。

如果 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, -> 数量 Availableminimum 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);

SQLFiddle demo

如果您坚持使用触发器,那么下面是适用于您提供的数据、逻辑和示例的内容。 我添加了更新 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;