根据订购数量添加状态

时间:2015-10-02 07:21:59

标签: oracle adempiere

我正在使用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,我们在这里放置 已订购ProductQuantityM_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_ID1000011 [订单] = QtyInternalUse5 = Level_Min20 = Av27 - >仍为27-5 = 22

如果above Minimum Level在订购库存一半时达到最低库存,则状态显示Available

示例:' Partial' = M_Product_ID1000012 [订单] = QtyInternalUse7 = Level_Min15 = Av20 - >成为20-7 = 13

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

如果below Minimum Level在他的最低库存中,因此无法订购库存,则状态显示为Available'

示例:'N/A = M_Product_ID1000013 [订单] = QtyInternalUse8 = Level_Min12 = Av, - >数量12Available相同,因此无法订购)

我尝试通过制作类似这样的东西来制作触发器

minimum level

仍然存在很多错误,我对如何基于此编写触发器感到困惑 我的条件。

任何建议将不胜感激:)

1 个答案:

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

SQLFiddle demo

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