BW DTP自动上载程序

此文章是本人在项目中遇到的一个实际案例,有需要的小伙伴们可以参考参考



提示:以下是实际项目中所遇到的,请结合自身阅读

一、需求说明

当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.
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酔墨诗欣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值