先进先出的订单分配处理

原帖地址:

http://community.youkuaiyun.com/Expert/topic/3239/3239774.xml?temp=9.711856E-02

物料 批号 库存数
aa p01 5
aa p02 10
bb p01 20

订单 物料 订货数
1 aa 11
1 bb 10
2 aa 2
3 aa 1


要得到:

订单 物料 批号 出库
1 aa p01 5
1 aa p02 6
1 bb p01 10
2 aa p02 2
3 aa p02 3


要求:
使用update,不用函数、子查询、游标、循环,一句搞定。

------------------------------------------------------------------------------------------------------

--大致的思路

--测试数据
create table ta(物料 varchar(10),批号 varchar(10),库存数 int)
insert ta select 'aa','p01',5
union all select 'aa','p02',10
union all select 'aa','p03',20
union all select 'bb','p01',2
union all select 'bb','p02',20

create table tb(订单 int,物料 varchar(10),订货数 int)
insert tb select 1,'aa',11
union all select 1,'bb',10
union all select 2,'aa',20
union all select 3,'aa',1
go

--生成临时表
select b.订单,b.物料,a.批号,a.库存数,b.订货数,出库=cast(0 as int)
from ta a,tb b
where a.物料=b.物料
order by b.物料,a.批号,b.订单
go

--删除测试
drop table ta,tb
--实现思路

/*--生成的临时表如下

订单  物料  批号 库存数 订货数  出库   
---- ----- ---- ------ ------ -----
1    aa    p01  5      11     5 --还有6未分配,那就要等下一个批号来处理
                                    --记下订单号1
2    aa    p01  5      20     0 --不再处理,因为未分配数>0
3    aa    p01  5      1      0 --不再处理,因为未分配数>0
1    aa    p02  10     11     6 --有了新库存10,与上次未分配的订单号比较,>=
                                     --所以进行分配,分配的结果是库存余4,未分配数
                                     --=0,记下本次订单号+1,如分配数>0,记本次订单号
2    aa    p02  10     20     4 --上次结余库存4,分配,余16未分配,记下订单号2
3    aa    p02  10     1      0 --不再处理,因为未分本数>0
1    aa    p03  20     11     0 --有新库存20,但订单号 <上次记下的订单号,不处理>
2    aa    p03  20     20     16     --满足条件,分配,余库库存4
3    aa    p03  20     1      1 --满足条件,分配
1    bb    p01  2      10     2 --物料变化变化,重新开始分配,未分配数8
                                     --记下订单号1
1    bb    p02  20     10     8 --有新库存,分配

(所影响的行数为 11 行)
--*/

--------------------------------------------------------------------------------------------------------------


--测试数据
create table ta(物料 varchar(10),批号 varchar(10),库存数 int)
--/*--第一套测试数据
insert ta select 'aa','p01',5
union all select 'aa','p02',10
union all select 'bb','p01',20
--*/

/*--第二套测试数据
insert ta select 'aa','p01',5
union all select 'aa','p02',10
union all select 'aa','p03',20
union all select 'bb','p01',2
union all select 'bb','p02',20
--*/

/*--第三套测试数据
insert ta select 'aa','p01',50
union all select 'aa','p02',10
union all select 'bb','p01',20
--*/

/*--第四套测试数据
insert ta select 'aa','p01',50
union all select 'aa','p02',8
union all select 'aa','p03',6
union all select 'aa','p04',3
union all select 'bb','p01',2
union all select 'bb','p02',20
--*/

create table tb(订单 int,物料 varchar(10),订货数 int)
--/*--第一套测试数据
insert tb select 1,'aa',11
union all select 1,'bb',10
union all select 2,'aa',2
union all select 3,'aa',1
--*/

/*--第二套测试数据
insert tb select 1,'aa',11
union all select 1,'bb',10
union all select 2,'aa',20
union all select 3,'aa',1
--*/

/*--第三套测试数据
insert tb select 1,'aa',11
union all select 1,'bb',10
union all select 2,'aa',2
union all select 3,'aa',1
--*/

/*--第四套测试数据
insert tb select 1,'aa',7
union all select 1,'bb',10
union all select 2,'aa',8
union all select 2,'bb',8
union all select 3,'aa',1
--*/
go

select b.订单,b.物料,a.批号,a.库存数,b.订货数,出库=cast(0 as int)
 ,未分配=cast(null as int),库存结余=cast(null as int),未配订单=cast(null as int)
into #t
from ta a,tb b
where a.物料=b.物料
order by b.物料,a.批号,b.订单

--生成出库数据
declare @物料 varchar(10),@批号 varchar(10),@订单 int
declare @出库 int,@库存 int,@未分配 int

update #t set
 @库存=case when 物料=@物料
   then case when 批号=@批号 then @库存 else @库存+库存数 end
   else 库存数  end,
 @出库=case when @库存>0
  then case when @物料=物料
    then case when isnull(@订单,订单)<=订单
     then case when @未分配>0
      then case when @库存<@未分配 then @库存 else @未分配 end
      else case when @库存 <订货数 then @库存 else 订货数 end end
     else 0 end
    else case when @库存 <订货数 then @库存 else 订货数 end end
  else 0 end,
 @未分配=case when @出库>0
  then case when @物料=物料 and @未分配>0
   then @未分配-@出库
   else 订货数-@出库 end
  else @未分配 end,
 @订单=case when @物料=物料
  then case when @出库>0
   then case when @未分配>0 then 订单 else 订单+1 end
   else @订单 end
  else case when @未分配>0 then 订单 else 订单+1 end end,
 @库存=@库存-@出库,
 出库=@出库,
 
 未分配=@未分配,库存结余=@库存,未配订单=@订单,
 @物料=物料,@批号=批号

--显示更新结果
select 订单,物料,批号,出库 from #t
where 出库>0
order by 订单,物料,批号
go

--删除测试
drop table ta,tb
drop table #t

/*--测试结果

订单          物料         批号         出库         
----------- ---------- ---------- -----------
1           aa         p01        5
1           aa         p02        6
1           bb         p01        10
2           aa         p02        2
3           aa         p02        1

(所影响的行数为 5 行)
--*/

/*---一些说明:

处理语句中的下述这些,只是为了调试时,方便观察用的,没有实际处理用处:
未分配=@未分配,库存结余=@库存,未配订单=@订单,

同样的,生成临时表中的下述这些也只是调试用的(实际处理不需要):
,未分配=cast(null as int),库存结余=cast(null as int),未配订单=cast(null as int)
--*/



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=77449


<think>好的,用户想了解如何在SAP中设置先进先出(FIFO)的库存管理方法。首先,我需要回忆一下SAP库存管理的基本概念和相关配置步骤。FIFO意味着最早入库的物料会优先出库,这在库存管理中很常见,尤其是对有效期敏感的物料。 首先,我应该从SAP的后台配置开始。可能需要检查物料主数据中的设置,比如移动类型和价格控制。然后,库存管理的部分,特别是评估区域和评估类的配置是否正确,因为FIFO可能涉及到不同的评估方法。 接下来,批次管理可能是关键。FIFO通常需要启用批次管理,因为系统需要跟踪不同批次的入库时间。用户可能需要配置批次分类,并确保每个批次的入库日期被正确记录。此外,移动类型如101用于收货,201用于消耗,这些是否配置正确? 然后是自动批次确定功能,这可以帮助系统在出库时自动选择最早的批次。需要设置条件表、存取顺序和策略类型,确保系统能够根据入库日期排序。 可能还需要考虑库存盘点和批次状态,确保库存数据准确,避免过期批次被遗漏。此外,用户可能想知道实际业务操作中的步骤,比如收货时如何分配批次,发货时系统如何自动选择批次,以及相关的报表如MB5B来监控库存状况。 需要提醒用户,启用批次管理会增加数据维护的工作量,是否值得需要根据业务需求权衡。同时,测试环境中的验证非常重要,避免配置错误影响实际业务。 最后,总结步骤,确保结构清晰,分点说明配置和操作流程,让用户能够一步步理解和实施。还要注意使用正确的术语,比如评估范围、移动类型、批次分类等,确保专业性。</think>在SAP系统中实现**先进先出(FIFO)库存管理**需要结合物料主数据配置、批次管理和移动类型设置。以下是分步骤说明: --- ### 一、基础配置 1. **启用批次管理** - 在物料主数据视图`Basic Data 1`中勾选`Batch Management`字段。 - **路径**:`后勤 -> 物料管理 -> 物料主数据 -> 物料 -> 创建(MM01)` 2. **设置价格控制** - 选择`移动平均价(V)`或`标准价(S)`: - `V`:系统自动计算加权平均价(适合动态价格环境)。 - `S`:需手动维护标准价(适合价格稳定的物料)。 3. **定义评估范围(Valuation Area)** - 确保工厂级评估范围已激活,路径: `IMG -> 物料管理 -> 评估和科目设置 -> 科目确定 -> 定义评估级别` --- ### 二、批次管理配置 1. **批次分类** - 创建批次特征(如生产日期、有效期): **路径**:`后勤 -> 批次管理 -> 主数据 -> 分类 -> 类类型023(批次)` - 将特征分配给物料的批次分类。 2. **批次确定策略** - 配置自动批次选择规则: **路径**:`后勤 -> 批次管理 -> 批次确定和批次检查 -> 批次确定 -> 激活批次确定` - 设置条件表(按入库日期排序),例如: ```ABAP 条件技术:选择条件表(如T023) 存取顺序:按生产日期升序排列 ``` --- ### 三、库存移动设置 1. **收货(入库)** - 使用移动类型`101(采购订单收货)`或`501(无订单收货)`。 - 系统自动生成批次并记录入库时间。 2. **发货(出库)** - 使用移动类型`201(消耗)`或`261(销售订单发货)`。 - 系统根据批次入库日期自动选择最早批次: - 若批次未自动匹配,需检查批次确定策略逻辑。 --- ### 四、关键报表验证 1. **批次库存分析** - 使用事务代码`MB5B`查看批次库存及入库时间。 2. **库存概览** - 通过`MMBE`检查物料库存分布及批次详情。 --- ### 五、注意事项 1. **批次主数据维护** - 必须准确录入批次的生产日期/到期日期。 2. **特殊场景处理** - 若需跳过某批次(如质检冻结),需手动干预批次选择。 3. **测试环境验证** - 在开发系统模拟收货、发货流程,确保FIFO逻辑生效。 --- ### 六、扩展功能(可选) - **动态批次优先级**:通过增强程序自定义排序逻辑(例如:结合保质期和入库日期)。 - **QM集成**:若启用质检,需配置批次放行状态与FIFO的协同。 通过以上配置,SAP可实现基于批次的先进先出库存管理,确保库存周转符合业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值