Добавить статус в зависимости от заказанного количества
Я использую 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);
Если вы настаиваете на триггере, то ниже приводится кое-что, что сработало для данных, логики и примеров, которые вы предоставили. Я добавил часть для обновления 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;