比较急:求助高手,SQL 怎样将物料的库存数结合订单先后顺序优先分配发走,详细见正文

comcyd 2016-04-03 02:00:43

首先感谢各位的关注!!
解决问题后分数还可以再加,这里最多只能发100分。

需求如下,内容有点长,但是逻辑思路是清晰的,如果做过或者理解ERP的生产物控管理相关经验就比较容易看明白,如有我表述不明白让大家不理解的地方望包涵,发上来一起讨论。

一、订单主表Order:
A1(订单号) A2(下单日期)
---------------------------------------
SA2016001 2016-03-20
SA2016002 2016-03-21
SA2016003 2016-03-22
...

二、订单物料清单从表List:
B1(订单号) B2(物料编号) B3(用量)
------------------------------------------------------
SA2016001 m001 4
SA2016001 m002 3

SA2016002 m001 8
SA2016002 m002 5
SA2016002 m003 20

SA2016003 m001 10
SA2016003 m004 30
...

三、暂且先拿三张订单(SA2016001,SA2016002,SA2016003)测试,今天我欲对上面三个订单进行发料判断,通过一系列计算已经得出一个物料需求计划表C:
C01(需求物料) C02(需求汇总) C03(关联带出实时库存数)
-----------------------------------------------------------------------------------
m001 22(注:4+8+10) 20(库存不够发,欠2个)
m002 8(注:3+5) 20
m003 20 30
m004 22(注:4+8+10) 40
...


四、实时库存表KC,发料判断的这一时刻实时库存数如下:
K1(物料编号) K2(实时在库数)
------------------------------------------
m001 20
m002 20
m003 30
m004 40
...

情景再现:根据上面的需求和库存对应数,比如上面m002、m003和m004库存是够的,m001不够欠2,三个订单里都用到m001,根据订单下单先后日期得知,可以将m001优先分配给SA2016001和SA2016002先发走(目的是让订单尽量不要停留),同时减库,而订单SA2016003需要m001用量是10,此时还欠2,不能发出,要等库存数(通过采购入库等操作)够才能发走,同时减库。如此循环作业。(整个过程类似ERP系统里的MRP操作)求一个存储过程或者解决方案,在前端界面上每次点击判断按钮时,执行上面的流程并查询出可发料订单。

...全文
655 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
misterliwei 2016-04-03
  • 打赏
  • 举报
回复
order表加个字段,表示已锁单。统计的物料的时候,可以区别统计。
comcyd 2016-04-03
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
最好是有一个锁定库存的机制, 相当于某些货已经被预订了, 不要等发货的时候再计算其他的订单情况.
你说的很对,锁库机制怎么用在这里呢,如何用,有何高见,上面我又补充了一下之前不严谨的需求描述。
comcyd 2016-04-03
  • 打赏
  • 举报
回复
引用 1 楼 misterliwei 的回复:
谢谢,我刚才试了一下能达到我的效果 我再请问一下,我这里要类似做锁库的操作,如上面两个订单可以发,但是不马上出库,也就是库存数不变,要进行锁库或者说先占用库存,确认当前库存数可以分配给哪些订单可以最终出库,也就是说仓库模块在我没点正式出库前,库存数是不变的,但是订单可以确认哪些能发走,可能上面我说的有点不严谨,2楼提醒了一下,谢谢。
tcmakebest 2016-04-03
  • 打赏
  • 举报
回复
最好是有一个锁定库存的机制, 相当于某些货已经被预订了, 不要等发货的时候再计算其他的订单情况.
misterliwei 2016-04-03
  • 打赏
  • 举报
回复

if OBJECT_ID('order') is not null
drop table [order]
go
create table [order](a1 varchar(100) primary key,
                   a2 datetime)
go

if OBJECT_ID('kc') is not null
drop table kc
go
create table kc(k1 varchar(100) primary key,
                k2 int)
go


if OBJECT_ID('list') is not null
drop table list
go
create table list(b1 varchar(100) ,
                  b2 varchar(100) ,
                  b3 int)
go
insert into [order]
select 'SA2016001' ,'2016-03-20'
union all
select 'SA2016002','2016-03-21'
union all
select 'SA2016003','2016-03-22'
go
insert into kc
select 'm001',                20
union all
select 'm002',                20
union all
select 'm003',                30
union all
select 'm004',                40
go
insert into list
select 'SA2016001',        'm001',             4
union all
select 'SA2016001',       'm002',             3
union all
select 'SA2016002',        'm001',             8
union all
select 'SA2016002',        'm002',             5
union all
select 'SA2016002',        'm003',             20
union all
select 'SA2016003',        'm001',             10
union all
select 'SA2016003',        'm004',             30
go


;with ta(a1, a2, b1, b2, b3)
as
( select * 
  from [order] a
  join list b
  on a.a1 = b.b1),
tb (a1, a2, b1, b2, b3, s)
 as(select *, (select SUM(b3) 
               from ta b 
               where b.a2 <= a.a2 and a.b2 = b.b2)
    from ta a
    )
 select * 
 from [order] a 
 where a1 not in (select a1 
                  from tb b
                  join kc c
                  on b.b2 = c.k1 
                  where b.s > c.k2
                   )
   

tcmakebest 2016-04-03
  • 打赏
  • 举报
回复
引用 4 楼 comcyd 的回复:
引用 2 楼 tcmakebest 的回复:
最好是有一个锁定库存的机制, 相当于某些货已经被预订了, 不要等发货的时候再计算其他的订单情况.
你说的很对,锁库机制怎么用在这里呢,如何用,有何高见,上面我又补充了一下之前不严谨的需求描述。
锁定机制也没什么高大上的,就是在下单的时候计算一下货是否够发,并且用一个预计表保存已经预订的货物数量, 计算库存的时候减掉预订的数量,发货后删除预订表中该订单的货物. 只是解决了按照订单顺序安排发货的问题,实现起来可能还要复杂一些.

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧