SAP MM批次管理(2)批次主数据

二、批次主数据

2.1批次主数据

为物料启用批次管理后,就可以使用批次功能了,在SAP系统中,批次与物料一样都是主数据,而且也有组织架构,批次的组织架构包括:物料、工厂、库存地点。可以使用事务代码MSC3N来查看批次主数据,


批次主数据包含组织架构,和基本数据1、基本数据2、分类、物料数据、更改视图,主要内容如下:

  • 基本数据 1

生产日期、货架寿命到期日、评估类型、供应商、供应商批次、上一次收货(即最新的收货日期)……

  • 基本数据 2

文本描述、预留日期字段……

  • 分类

类、类类别、特征、特征值

  • 物料数据

总货架寿命、剩余货架寿命、期间标识……

  • 更改

更改历史、更改凭证


2.2创建批次主数据

创建批次主数据有以下三种方式:

1) 事务代码MSC1N(手工创建)

2) 货物移动(自动创建)

101 根据采购订单收货

501无采购订单的收货

561 初始库存

……

3) 生产订单/工单

 

三种方式创建新批次的配置路径:SPRO->后勤-常规->批次管理->创建新批次


其中,手工创建新批次和货物移动创建新批次的配置定义了生成和校验新批次的方式。

 

批次主数据是依赖于物料主数据的,在创建批次主数据时一定要指定一个物料。


2.3批次编号

批次主数据有内部给号、外部给号两种编码方式,批次编号可以是数字和字符。在IMG路径SPRO->后勤-常规->批次管理->批次编号的分配 下配置批次给号方式、编码范围和编码范围的程序出口,


SAP系统提供了四个批次编号范围的用户出口,增强为SAPLV01Z

下面两个用户出口用于自动分配批次编号:

Ø EXIT_SAPLV01Z_001

Ø EXIT_SAPLV01Z_002

下面两个用户出口用于手工分配批次编号:

Ø EXIT_SAPLV01Z_003

Ø EXIT_SAPLV01Z_004

这四个用户出口的应用不做详细讨论,工作中遇到具体情况具体对待。


号码范围段的自定义出口。增强为 SAPLV01Z 

SAPLV01Z 包括两个出口,分别是:EXIT_SAPLV01Z_001 和 EXIT_SAPLV01Z_002 

SAP提供了 6 个实例。 

1.复制生产订单号至批次号码上。 

2.复制销售订单号至批次号码上。 

3.批次号码按物料类型来分配。 

4.批次号码按物料号码来分配。 

5.批次号码包括日期。 

6.批次号码包括工厂号码。 

1.2.3.4 可以通过 EXIT_SAPLV01Z_001来实现。 

1.2.5.6 可以通过 EXIT_SAPLV01Z_002来实现。 

实例:在号码中增加日期。 

CMOD:创建增强

代码示例:

DATA NUM(10) TYPE C.
CLEAR:NUM.
IF  X_BNCOM-MTART = 'FERT'.

   CONCATENATE  'D' SY-DATUM+3(5) NEW_CHARG+6(4) INTO NUM.
   NEW_CHARG = NUM.

ELSEIF  X_BNCOM-MTART = 'ROH'.
   CONCATENATE  'R' SY-DATUM+3(5) NEW_CHARG+6(4) INTO NUM.
   NEW_CHARG = NUM.
endif.
可以按物料类型来。


实际项目案例:

通过批次增强出口,对于批次外部给号编写批次编码规则

增强出口程序:EXIT_SAPLV01Z_003.EXIT_SAPLV01Z_004

每个工厂定义一套批次编码规则,编码规则为:年(4+月(2+日(2+4位流水号,定义编码规则时存在下面两种情况:

1.根据工厂(MARC-WERKS)=“HD*”时编码规则为:年(4)+月(2)+日(2)+4位流水号,其中4位流水号要增加物料编码(MARC-MATNR)判断,查找该物料编码最新的批次号(MCHA-CHARG),再原批次号上面递增加1,如果4位流水号的编号为9999后下一个批次号就为0001开始。

2.其它工厂编码规则为:年(4)+月(2)+日(2)+4位流水号,流水号根据每天的日期自动从0001开始递增。

20120808新增:

在处理公司内调拨订单(Z009)入库(移动类型101)时,要求沿用原出库批次号,不能使用新的批次编号,此要求与目前正常采购订单入库时的批次增强存在冲突,所以需要调整目前收货时的批次增强逻辑,将订单类型为Z009的收货对应的自动产生批次逻辑屏蔽掉。




MSC8336N是一款高性能的网络处理器,广泛应用于网络设备中。非阻塞定时器是网络编程中常用的技术,用于处理超时事件而不阻塞主程序的执行。下面是一个简单的MSC8336N非阻塞定时器的实现demo。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> // 定义定时器结构体 typedef struct { int id; long long expiration_time; } timer_t; // 比较两个定时器的过期时间 int compare_timer(const void *a, const void *b) { timer_t *timer_a = (timer_t *)a; timer_t *timer_b = (timer_t *)b; return (timer_a->expiration_time > timer_b->expiration_time) - (timer_a->expiration_time < timer_b->expiration_time); } // 初始化定时器 void init_timer(timer_t *timer, int id, long long delay) { timer->id = id; timer->expiration_time = get_current_time_in_ms() + delay; } // 获取当前时间(毫秒) long long get_current_time_in_ms() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1000 + ts.tv_nsec / 1000000; } // 处理定时器超时 void handle_timer_expiration(timer_t *timer) { printf("Timer %d expired\n", timer->id); } int main() { // 创建定时器数组 timer_t timers[10]; int timer_count = 0; // 添加定时器 for (int i = 0; i < 10; i++) { timer_t new_timer; init_timer(&new_timer, i, (i + 1) * 1000); // 设置定时器过期时间为1s, 2s, ..., 10s timers[timer_count++] = new_timer; } // 排序定时器数组(按过期时间升序) qsort(timers, timer_count, sizeof(timer_t), compare_timer); // 主循环 while (timer_count > 0) { long long current_time = get_current_time_in_ms(); long long next_timeout = timers[0].expiration_time; if (current_time >= next_timeout) { handle_timer_expiration(&timers[0]); // 移除已超时的定时器 for (int i = 1; i < timer_count; i++) { timers[i - 1] = timers[i]; } timer_count--; } else { // 计算等待时间 long long wait_time = next_timeout - current_time; usleep(wait_time * 1000); // 转换为微秒 } } return 0; } ``` 这个demo展示了如何在MSC8336N上实现一个简单的非阻塞定时器。主循环中,程序会检查定时器数组中的第一个定时器是否过期,如果过期则处理超时事件并移除该定时器,否则等待下一个定时器的超时时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值