此文章是本人在项目中遇到的一个实际案例,有需要的小伙伴们可以参考参考
提示:以下是实际项目中所遇到的,请结合自身阅读
一、需求说明
当DTP例程中限制了数据量,一次只能跑一个月或者单独几个月时,初始化历史数据执行DTP时就会显得繁琐且费时,比如一年有12个月,DTP限制为1个月的数据(由于在结束例程中写了累计余额计算逻辑的代码,需要单月抽取),那么就需要执行12次DTP,且每次执行的时候需要去手动修改配置表的时间,这样的效率就会显得很低,为此想了个办法,通过开发处理链、用变式去调度程序的方式实现自动跑数的效果,这样子就提高了效率。
二、相关概念
2.1 配置表
在实现某些特殊功能时,需要通过自定义配置表来实现中转的功能,配置表实际上就是一张可维护的数据表,通过某些字段值的读取实现最终的目的。(配置表通过自定义数据表创建后,一定要开启可维护的功能,否则该表不可维护)
2.2 变式
如果需要经常用相同的选择条件运行相同的程序,就可以把这些值保存在一个选择组里,在SAP中把这个组称为变式。同时可以为任何定义了选择屏幕的程序创建任意数量的变式,变式是用户与选择屏幕之间的接口,它们可以用在会话和后台模式中。在对话模式中,变式可以让用户的工作变得简单,因为用户不需要再重复输入同样的值。在后台模式的变式,它是把值传递给后台作业的报表程序的唯一方法,在后台运行程序时,必须使用变式。
三、实现步骤
3.1 新建处理链
(一)通过RSA1事务码,选择流程链,并在左上角新建一条处理链(处理链创建过程,这里不再详解),如图所示:
3.2 新建程序
(一)处理链新建好后,此时再通过事务码SE38新建一个程序,点击【源代码】,命名为ZBW_ZCFI_O017,如图所示。
(二)进入该程序后,开始编写代码,关键代码如图所示:
3.3 新建变式
(一)程序创建好后,回到SE38界面,点击【变式】,然后点击显示,如图所示:
(二)进到该界面后,命名一个变式的名称,点击创建,如图所示:
(三)输入一个开始日期,并点属性,如图所示:
(四)点击属性后,输入变式的描述,保存退出,变式创建完成,如图所示:
3.4 效果演示
(一)所有准备工作做好后,现在可通过事务码SM36调度一个作业,并定义一个作业名称,如图所示:
(二)点击【步骤】,输入该作业需要的程序名称和变式,如图所示:
(三)将开始条件设置为立刻,点击保存,开始调度作业,如图所示:
(四)最后效果,2021年1月到2022年2月的每月数据都上来了,如图所示:
四、代码附录
4.1 DTP例程
lv TYPE c LENGTH 6,
zdate TYPE d,
lv_calmonth LIKE ztbp_pz-zbpjsdy.
SELECT SINGLE zbpjsdy INTO lv_calmonth FROM ztbp_pz WHERE
zcxbh = '001' AND zsfqy = 'Y' AND zbpjsdy <> '000000'.
IF SY-SUBRC = 0.
lv = lv_calmonth(4) && lv_calmonth+4(2).
ELSE.
zdate = sy-datum(6) && '01'.
zdate = zdate - 1."默认取系统日期的上月
lv = zdate(4) && zdate+4(2).
ENDIF.
l_t_range-fieldname = '/BIC/ZI_KJQJ'.
l_t_range-sign = 'I'.
l_t_range-option = 'EQ'.
l_t_range-low = lv.
APPEND l_t_range.
4.2 核心代码
REPORT zbw_zcfi_o017.
*在选择屏幕上定义开始日期和结束日期
SELECTION-SCREEN BEGIN OF BLOCK lddate WITH FRAME TITLE lddate.
PARAMETERS zcalday1 TYPE sy-datum OBLIGATORY."开始日期
SELECTION-SCREEN END OF BLOCK lddate.
*定义配置表的工作区
DATA: BEGIN OF ltmonth,
zcxbh TYPE ztbp_pz-zcxbh,
zcxmc TYPE ztbp_pz-zcxmc,
zbpcshyf TYPE ztbp_pz-zbpjsdy,
zbpjsdy TYPE ztbp_pz-zbpjsdy,"BPC计算年月
zsfqy TYPE c LENGTH 1,"是否启用
END OF ltmonth.
DATA: zyears TYPE i,"间隔年份数
zcount TYPE i,"循环计数
zmonth TYPE t,"间隔月份数
logid TYPE rspc_logid,"处理链logid值
rs_status TYPE rspc_state,"处理链状态
nsec TYPE i,"间隔时间
day TYPE sy-datum,
zcalday2 type sy-datum.
zcalday2 = sy-datum.
day = zcalday1.
*月份减1
CALL FUNCTION 'FIMA_DATE_CREATE'
EXPORTING
i_date = zcalday2
i_months = '-1'
IMPORTING
e_date = zcalday2.
nsec = 5.
zcount = 0.
ltmonth-zcxbh = '001'.
ltmonth-zcxmc = ''.
ltmonth-zbpcshyf = '202112'.
ltmonth-zsfqy = 'Y'.
zyears = zcalday2+0(4) - zcalday1+0(4). "计算间隔年份
zmonth = zcalday2+4(2) - zcalday1+4(2) + zyears * 12. "计算间隔月份
WHILE zcount <= zmonth. "当次数小于间隔月数时,一直循环
DELETE FROM ztbp_pz. "清空配置表
ltmonth-zbpjsdy = day+0(6). "将开始年月赋值给配置表计算年月字段
INSERT ztbp_pz FROM ltmonth. "将值插入配置表
*调用执行处理链函数,并取logid
CALL FUNCTION 'RSPC_CHAIN_START'
EXPORTING
i_chain = 'ZPC_CS_FI_ZCFIO017'
IMPORTING
e_logid = logid.
IF sy-subrc = 0.
*获取处理链此时状态
CALL FUNCTION 'RSPC_API_CHAIN_GET_STATUS'
EXPORTING
i_chain = 'ZPC_CS_FI_ZCFIO017'
i_logid = logid
IMPORTING
e_status = rs_status.
WHILE rs_status = 'A'. "状态为A时,一直循环
WAIT UP TO nsec SECONDS. "等待5秒
CALL FUNCTION 'RSPC_API_CHAIN_GET_STATUS'
EXPORTING
i_chain = 'ZPC_CS_FI_ZCFIO017'
i_logid = logid
IMPORTING
e_status = rs_status.
ENDWHILE.
ENDIF.
zcount = zcount + 1. "次数加1.
*月份加1
CALL FUNCTION 'FIMA_DATE_CREATE'
EXPORTING
i_date = day
i_months = '1'
IMPORTING
e_date = day.
DELETE FROM ztbp_pz.
ENDWHILE.