0

我正在使用 Adempiere。我有三张桌子和一个视图。它是,'M_INVENTORY'另一个是. 当我们要选择时使用。它显示这样'M_INVENTORYLINE''M_REPLENISH''VW_DAFTARBARANG_AVAILABLE'M_InventoryWarehouse

            M_INVENTORY
------------------------------------
M_Inventory_ID  || M_Warehouse_ID
------------------------------------
2000001         || 1000001
2000002     || 1000002
2000003     || 1000003

M_InventoryLine当我们想要订购库存时使用,我们在这里放置 ProductQuantity订购。M_InventoryLine是嵌套的,所以我们从我们选择的M_Inventory相关订购库存。WarehouseM_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表中的列中M_InventoryLine

如果Available订购库存时超过最低库存,则状态显示'Complete'

示例 : M_Product_ID= 1000011( QtyInternalUse[order] = 5, Level_Min= 20, Av= 27, 27-5 = 22-> Still above Minimum Level)


如果Available在订购一半的库存时达到最低库存,则状态显示' Partial'

示例 : M_Product_ID= 1000012( QtyInternalUse[order] = 7, Level_Min= 15, Av= 20, 20-7 = 13-> 变成below Minimum Level,

因此,它只能满足 7 个中的 5 个,因此库存仍处于最低水平。)


如果Available在他的最低库存中,因此无法订购库存,则状态显示'N/A'

示例 : M_Product_ID= 1000013( QtyInternalUse[order] = 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;

仍然有很多错误,我对如何根据我的条件编写好触发器感到困惑。

任何建议将不胜感激:)

4

1 回答 1

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);

SQLFiddle 演示

如果您坚持触发,那么以下内容适用于您提供的数据、逻辑和示例。我添加了更新部分qtyinternaluse,不确定这是否重要/可能。触发器可能需要调整并且肯定需要测试,无论如何我希望这会有所帮助。另外 - 如果视图vw_daftarbarang_available使用表m_inventoryline,您可能会遇到“变异表错误”,但这只是我的警告,因为我没有看到视图定义。

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;
于 2015-10-02T11:17:54.007 回答