Добавить статус в зависимости от заказанного количества

Я использую 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 столбец в таблице 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 -> становится below Minimum Level,

Таким образом, он может выполнить только 5 из 7, поэтому запас все еще находится на минимальном уровне.)


Если 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;

По-прежнему много ошибок, и я не совсем понимаю, как правильно написать триггер, основываясь на моем условии.

Любые предложения будут оценены:)

1 ответ

Решение

Я не уверен, нужен ли здесь триггер, возможно, будет достаточно просмотра на основе этого запроса:

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 Вы можете столкнуться с "ошибкой изменяющейся таблицы", но это только мое предупреждение, так как я не вижу определения представления.

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;
Другие вопросы по тегам