原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
[ 之前介绍过一个快速调度并发后台作业的工具
](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect
"https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect")
[ 该工具基于单号(或数字字段)的后两位,来区分数据设置不同的作业.
](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect
"https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect")
[ 详见链接
](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect
"https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect")
[
](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect
"https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect")
**[ 本文介绍快速定义并发后台作业的另一个方法
](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect
"https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485477&idx=1&sn=7ee95bfc0bc25de1955eb547b4a9897b&chksm=cf5dd513f82a5c0518e24aa5114252b3f812bfabc4208c88c3d763c9284ab960c297ae6e3329&payreadticket=HNRZ3xe7UGYxAuM4fW8KHlZnpN6ICJUDNJxR9FzhgaSBrczd-
F-f4Zmfgf_76DzZK2o-nS0&scene=21#wechat_redirect") **
二
后两位区分数据的缺点
通过单号的后两位 可以把数据区分100份,这是比较简单的一种方式. 但这种方式有一定的缺陷,并且最大限定100个作业.
(当然也可以扩大成3位,最大1000个作业, 但要调整相关代码逻辑).
设想一个基于物料主数据并发处理的程序.
物料主数据的编号没有严格按流水号生成(一般的零售企业会按流水号生成物料, 但是鞋服行业的物料编码一般是款(流水号)+颜色+尺码 或
款(流水号)+颜色尺码(流水号) 来作为物料编码.
这样因为尺码的编码限制. 用后两位来区分作业就会导致数据分布不均匀.
因此需要考虑一个更均匀分配的方式.
三
新的分配方式
新的分配方式逻辑描述如下
• 获取所有待处理的编号(单号或物料号或其它任意号),获取总条目数
• 按指定作业个数,计算出每个作业分配的条目数
• 把待处理的编号分配给每个作业,作为定义作业的限制条件
• 考虑多选的限制条件有一个上限( SELECT-OPTION 定义的内表,行数多大会导致SQL超过语句占用空间的最大值,报SQL错误),再次区分到不同的作业步骤中
四
实现效果
选择屏幕包含了上述逻辑中的所有要素
• 需要后台执行的程序 选择字段名称,单号或分组号的选择字段
• 表或视图名 用于限定选择字段内容的获取表
• 字段名 指定表中的字段内容传递到选择条件中
• 补充where 条 补充表的数据获取的限制条件
• 变式名称 定义位后台作业的程序其它限制条件通过变式传递
• 多值选择条件允许的最大行(超出可能导致报错)
• 后台作业数 定义并发的后台作业数
• 作业名前缀 定义作业名的前缀字符串, 如果为空, 使用程序名
批量开票VF04 中的销售组织是单选值.
下面的处理会把指定的销售组织同时定义多个后台作业,并发执行VF04开票的过程,VF04中的其它限制条件通过变式Z001限定(
变式Z001中如果也限定了销售组织, 会被指定的销售组织覆盖)
定义的作业入下图: 作业名包含了第一个选择条件值
示例二
从表ZTA_DN_POST中获取所有没有执行的交货单号, 把这些单号分到25个作业中. 通过选择字段 S_VBELN传递到程序ZA_DN_POST
去执行交货单过账
考虑了限制条件值排序,作业名也能看出来这种排序的结果
五
选择屏幕说明
选择屏幕对特定字段设置了搜索帮助,辅助获取程序的选择条件, 表的动态选择屏幕,表中的字段名等
输入程序名后, 选择条件字段可以通过搜索帮助获取
输入表名后
可以通过动态选择屏幕限制表中的数据的读取, 访问表的where 条件和动态选择屏幕内容同时生效
六
核心逻辑
核心处理逻辑如下
动态获取指定表的数据作为选择条件
通过函数Z_BC_DEVIDE_JOB 获取每个作业需要获取选择条件的从行和到行,以及每个步骤的从行和到行.
函数负责把指定条目数拆分成多个作业的多个步骤.
按照函数返回的嵌套内表,调用作业和步骤
七
配置表
这个程序的选择内容填写有一定的复杂度. 所以定义了一个配置表 ZTBC_MULTI_JOB, 可以把常用程序的并发定义方式保存下来.
用户输入程序名,可以通过配置表获取该程序的并发执行的相关参数内容
八
总结
数据量大的程序,通过特定的选择字段拆分成多份数据, 分别放到不同的后台作业中执行. 这种并发处理的一种方式. 不需要改变原程序.
快速调度并发后台作业通过一个通用的方式,可以调度所有允许拆分数据并发执行的程序.
新的分配方式没有最大作业数的限制,可以更均匀的分配作业数据量. 比原有的方法更好.
后续一个优化项: 通过最简单的方式把这个程序的执行嵌入到原程序中. 以便用户可以快速通过该方法调度产生多个并发后台作业.
源程序如果基于程序名加锁需要调整为基于并发的字段内容加锁. 避免并发作业的锁报错.
** THE **
** END **
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论