【问题标题】:How to update stock table quantity on the basis of expiry date?如何根据到期日更新库存表数量?
【发布时间】:2020-08-18 15:57:48
【问题描述】:

大家好,我有一个库存表,列如下

Item_ID  | Expiry_Date | Quantity | Rate
 cB0001  | 01-18-2021  |     5    | 150
 cB0001  | 12-08-2020  |     3    | 145
 cB0001  | 02-15-2021  |     25   | 155

注意:利率不是问题,我只想根据到期日和可用数量更新库存表数量。

现在我想从最先到期的库存中向 cB0001 数量 : 10 的客户销售库存。现在的问题是销售数量是 10,我想减去 01-18-2021 到期日的 5 和 3 从 12-08-2020 到期和 2 从 02-15-2021 的数量。基本上我想使用一个查询来实现 FIFO 逻辑。我想用这个更新库存表数量

update stock set quantity = quantity - '10' where item_id = 'cB0001' and expiry_Date < Now()

但这并不能给出准确的结果。如何解决这个问题?你有什么想法吗?

希望你能理解我的问题

【问题讨论】:

  • Expiry_Date 不在 MySQL 日期格式中。
  • @SatishGupta 是的,我知道 mysql 格式是 yyyy-MM-dd。格式不是问题。如果您对我的问题有解决方案,我们将不胜感激。
  • 你用的是什么版本的mysql?
  • 您的更新 SQL 对于您显示的列没有意义。如果只有 5 个,为什么要从 cb0001 的数量中减去 10 - 目前您将该行设置为 -5。
  • 在您的 MySQL 上运行 select '06-18-2021'

标签: c# mysql fifo inventory-management


【解决方案1】:

我假设您打算在触发器中执行此操作。因此,“诀窍”是确定销售何时完成(确定是否可以完成是另一个问题)。为此,将值 0 分配给累积数量小于销售的行,将 1 分配给最终可以完成销售的行,然后分配 2。我假设有一个唯一的行标识符来处理同一日期的多个库存条目 - 在我的例子中是 inventory.id

drop table if exists inventory,sales;
create table inventory
(id int auto_increment primary key,Item_ID varchar(20),  Expiry_Date date,  Quantity int, Rate int);

create table sales (item_id varchar(20), quantity int);

insert into inventory values
( null,'cB0001'  , str_to_date('01-18-2021','%m-%d-%Y'),     5    , 150),
( null,'cB0001'  , str_to_date('12-08-2020','%m-%d-%Y'),     3    , 145),
( null,'cB0001'  , str_to_date('02-15-2021','%m-%d-%Y'),     25   , 155),
( null,'cB0001'  , str_to_date('02-15-2021','%m-%d-%Y'),     10   , 155),
( null,'cB0001'  , str_to_date('02-15-2021','%m-%d-%Y'),     10   , 155),
( null,'cB0001'  , str_to_date('02-15-2021','%m-%d-%Y'),     10   , 155),
( null,'cB0002'  , str_to_date('02-15-2021','%m-%d-%Y'),     30   , 155);

drop trigger if exists t;
delimiter $$
create trigger t after insert on sales
for each row 
begin
update  inventory  left join
(select s.*,
         if(fst = 0, @runqty:=@runqty+quantity,@runqty:=@runqty) qty
from
(
select *,
         @t:=@t+quantity cumqty,
         if(@t>=@sale,if(@p>=1,2,@p:=1),@p:=0) fst
from inventory
cross join (select @t:=0,@p:=0,@sale:=new.quantity) t
where quantity > 0 and item_id = new.item_id
order by item_id,expiry_date
) s
cross join (select @runqty:=0) r
where fst in (0,1)
) a
on a.id = inventory.id 
set inventory.quantity = case when fst = 0 then 0 
                                      when fst = 1 then inventory.quantity - (new.quantity - a.qty)
                                 else inventory.quantity
                                 end;

end $$

delimiter ;


MariaDB [sandbox]> insert into sales values('cb0001',10);
Query OK, 1 row affected (0.095 sec)

MariaDB [sandbox]> select * from inventory order by item_id,expiry_date;
+----+---------+-------------+----------+------+
| id | Item_ID | Expiry_Date | Quantity | Rate |
+----+---------+-------------+----------+------+
|  2 | cB0001  | 2020-12-08  |        0 |  145 |
|  1 | cB0001  | 2021-01-18  |        0 |  150 |
|  3 | cB0001  | 2021-02-15  |       23 |  155 |
|  4 | cB0001  | 2021-02-15  |       10 |  155 |
|  5 | cB0001  | 2021-02-15  |       10 |  155 |
|  6 | cB0001  | 2021-02-15  |       10 |  155 |
|  7 | cB0002  | 2021-02-15  |       30 |  155 |
+----+---------+-------------+----------+------+
7 rows in set (0.001 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> insert into sales values('cb0001',25);
Query OK, 1 row affected (0.111 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> select * from inventory order by item_id,expiry_date;
+----+---------+-------------+----------+------+
| id | Item_ID | Expiry_Date | Quantity | Rate |
+----+---------+-------------+----------+------+
|  2 | cB0001  | 2020-12-08  |        0 |  145 |
|  1 | cB0001  | 2021-01-18  |        0 |  150 |
|  3 | cB0001  | 2021-02-15  |        0 |  155 |
|  4 | cB0001  | 2021-02-15  |        8 |  155 |
|  5 | cB0001  | 2021-02-15  |       10 |  155 |
|  6 | cB0001  | 2021-02-15  |       10 |  155 |
|  7 | cB0002  | 2021-02-15  |       30 |  155 |
+----+---------+-------------+----------+------+
7 rows in set (0.001 sec)

【讨论】:

  • 感谢您的回复。我会检查并很快回来
  • 嗨,我们可以在不使用触发器的情况下执行此操作吗?如果是,那么我们该怎么做
  • 它返回错误代码:1054。'字段列表'中的未知列'数量'
  • 它适用于您的表结构,但不是我的,它给我错误“数量”是字段列表中的未知列,同时插入到销售和销售已经有列数量。我想念什么?如果我将触发器行成功插入到销售中,但在触发器创建后它不起作用
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
相关资源
最近更新 更多