ABAP程序中SUBMIT Program时、BDC CALL Transaction时填充参数的代码模板

在ABAP程序中,经常出现在Program A中调用Program B的需求,通常来讲,这种需求可以通过Submit或Call transaction的方式实现。

1. Submit

Submit也即直接提交一个程序,语法如下:

SUBMIT {rep|(name)} [selscreen_options]
… … … … … … … … [list_options]
… … … … … … … … [job_options]
… … … … … … … … [AND RETURN].

可以通过AND RETURN关键字控制,执行完被调用的程序后,是否返回主程序。使用SUBMIT时的一个难点在于参数的填充,也即如何填充被调用程序的selection screen,也即参数selscreen_options

在编程过程中,如果遇到类似的需求,可以用 宏 DEFINE 快速实现,具体可参考下面的模板。

  DATA:
    lt_spar          TYPE STANDARD TABLE OF rsparams,
    ls_spar          LIKE LINE OF lt_spar.

" fill screen parameters
DEFINE mac_set_parameter.
  CLEAR ls_spar.
  ls_spar-sign    = 'I'.
  ls_spar-option  = 'EQ'.
  ls_spar-selname = &1.
  ls_spar-kind    = 'P'.
  ls_spar-low     = &2.
  APPEND ls_spar TO lt_spar.
END-OF-DEFINITION.

" fill selection options
DEFINE mac_set_selopt.
  CLEAR ls_spar.
  ls_spar-sign    = 'I'.
  ls_spar-option  = &4.
  ls_spar-selname = &1.
  ls_spar-kind    = 'S'.
  ls_spar-low     = &2.
  ls_spar-high    = &3.
  APPEND ls_spar TO lt_spar.
END-OF-DEFINITION.

  mac_set_parameter 'P_APPL'   'AIF'.
  mac_set_parameter 'P_MAX'    ' '.
  
  mac_set_selopt    'S_MDATE'  '00000000' '20211231' 'BT'.

  SUBMIT /aif/error_handling_trans WITH SELECTION-TABLE lt_spar AND RETURN.

2. CALL Transaction

Call Transaction也即直接调用一个事务代码,其语法如下:

CALL TRANSACTION ta WITH|WITHOUT AUTHORITY-CHECK
… … … … … … … … USING bdc_tab { {[MODE mode] [UPDATE upd]}
… … … … … … … … | [OPTIONS FROM opt] }
… … … … … … … … [MESSAGES INTO itab].

具体的关键字用法,可查看ABAP的帮助文档。在CALL transaction时,其难点在于BDC字段的填充。

注:BDC - Batch Data Input是SAP非常经典一种批量导入技术,可以通过录制屏幕(Tx: SHDB)操作,生成代码。

在编程过程中,如果遇到类似的需求,也可以用 宏 DEFINE 快速实现,具体可参考下面的模板。

下例中,填充BDC包含了两种复杂操作,一种是填充selection-option, 另一种是通过剪切板中的内容来填充selection option,因此调用到了 cl_gui_frontend_services=>clipboard_expor()这个服务。

  DATA:
    lt_clipdata  TYPE STANDARD TABLE OF char120,
    lv_rc        TYPE i,
    ls_bdc       TYPE bdcdata,
    lt_bdc       TYPE STANDARD TABLE OF bdcdata WITH DEFAULT KEY.

  FIELD-SYMBOLS:
    <ls_msgguid> LIKE LINE OF it_msgguid.

  DEFINE bdc_dynpro.
    CLEAR ls_bdc.
    ls_bdc-program  = &1.
    ls_bdc-dynpro   = &2.
    ls_bdc-dynbegin = 'X'.
    INSERT ls_bdc INTO TABLE lt_bdc.
  END-OF-DEFINITION.                    "BDC_DYNPRO
  
  DEFINE bdc_field.
    CLEAR ls_bdc.
    ls_bdc-fnam = &1.
    ls_bdc-fval = &2.
    INSERT ls_bdc INTO TABLE lt_bdc.
  END-OF-DEFINITION.                    "BDC_DYNPRO

  CLEAR es_msg.

  CHECK it_msgguid IS NOT INITIAL.

  LOOP AT it_msgguid ASSIGNING <ls_msgguid>.
    INSERT CONV #( <ls_msgguid>-msgguid ) INTO TABLE lt_clipdata.
  ENDLOOP.
  IF sy-subrc = 0.
    DATA(lv_msgguid) = it_msgguid[ 1 ]-msgguid.

* Put into clipboard
    cl_gui_frontend_services=>clipboard_export(
      IMPORTING
        data                 =     lt_clipdata
*        length               =     " Data length
      CHANGING
        rc                   = lv_rc
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4
    ).
    IF sy-subrc <> 0.
      RETURN.
    ENDIF.
  ENDIF.

  " fill normal screen parameters
   bdc_dynpro '/AIF/ERROR_HANDLING_TRANS' '1000'.
   bdc_field 'BDC_OKCODE' '=%00291010003785126'.
   bdc_field 'P_APPL' 'AIF'.
   bdc_field 'P_STS_S' 'X'.
   bdc_field 'P_STS_W' 'X'.
            
   " selection-option fill 2 values
   bdc_field 'S_IFNAME-LOW' 'TEST_A'. 
   bdc_dynpro 'BDC_CURSOR' 'S_IFNAME-LOW'.
   bdc_dynpro 'SAPLALDB' '3000'.   
   bdc_field 'BDC_OKCODE' '=ACPT'.
   bdc_field 'BDC_CURSOR' 'RSCSEL_255-SLOW_I(02)'.
   bdc_field 'RSCSEL_255-SLOW_I(02)' 'TEST_B'.

   " fill selection-option from clipboard
   bdc_dynpro '/AIF/ERROR_HANDLING_TRANS' '1000'.
   bdc_field 'BDC_CURSOR' 'S_GUID32-LOW'.
   bdc_field 'BDC_OKCODE' '=%034'.
   bdc_dynpro 'SAPLALDB' '3000'.
   bdc_field 'BDC_OKCODE' '=CLIP'. 
   bdc_field 'BDC_CURSOR' 'RSCSEL_255-SLOW_I(01)'.
   bdc_dynpro 'SAPLALDB' '3000'.
   bdc_field 'BDC_OKCODE' '=ACPT'. 
   bdc_field 'BDC_CURSOR' 'RSCSEL_255-SLOW_I(01)'.

   CALL TRANSACTION '/AIF/ERR' USING lt_bdc  
                               MODE 'E'.

3. 小技巧

  1. 填充BDC参数时,可以先用Tx: SHDB录制一个预期屏幕操作,然后导出到一个local的程序中,这样在填充BDC参数时,便可以参考系统自动生成的程序。
  2. 如果遇到,需要在新窗口打开被调用的程序,则可以使用 ABAP4_CALL_TRANSACTION这个函数,也即对CALL Transaction进行了一个RFC的封装,这样就可以在一个新的进程中打开被调用的transaction。其中田中using_tab参数也即bdc格式的参数。示例如下:
" same as CALL TRANSACTION '/AIF/ERR' USING lt_bdc. 
" but open in a new window.

     CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
       STARTING NEW TASK 'AIF'
       EXPORTING
         tcode                   = '/AIF/ERR'
         mode_val                = 'E'
         update_val              = 'L'
       TABLES
         using_tab               = lt_bdc   
       EXCEPTIONS
         call_transaction_denied = 1
         tcode_invalid           = 2
         OTHERS                  = 3.
     IF sy-subrc <> 0.
       MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
       RETURN.
     ENDIF.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ABAP程序BDC(Batch Data Communication代码开发主要是为了处理大批量数据的输入或修改。下面是BDC代码开发的全过程: 1. 定义BDC数据结构:首先需要定义一个数据结构,用于存储要导入或修改的数据。这个结构通常是一个内表,包含了程序需要处理的字段。 2. 读取数据源:接下来,从数据源读取数据。数据源可以是数据库表、Excel文件或其他外部系统。 3. 编写转换逻辑:在BDC开发,通常需要进行数据转换,将数据源的数据映射到ABAP程序的数据结构。这个过程,需要根据业务需求对数据进行一些处理,比如日期格式转换、数值转换等。 4. 创建BDC会话:接下来,需要创建一个BDC会话。BDC会话是ABAP程序与事务处理之间的桥梁,用于处理事务数据的导入或修改。 5. 输入或修改数据:通过BDC会话,将转换后的数据导入到SAP系统。如果是数据导入,可以使用BDC方法CALL TRANSACTION来执行事务代码。如果是数据修改,可以使用BDC方法CALL TRANSACTION USING来执行事务代码。 6. 错误处理:在BDC开发,由于可能存在各种错误,如数据格式错误、字段缺失等,所以需要对错误进行处理。可以使用BDC方法SESSION_SET_BIG_INTERVAL来设置一个长间间隔,然后检查和处理错误信息。 7. 提交和确认:在数据导入或修改完成后,需要使用BDC方法SESSION_CLOSE来提交事务,并通过BDC方法SESSION_PROCESSING提交数据更改。然后,可以检查和处理事务的结果。 8. 清除会话:在处理完BDC会话后,需要使用BDC方法SESSION_CLOSE来清除会话,以释放相关的资源。 以上是ABAP程序BDC代码开发的全过程。通过合理的数据结构定义、数据源读取、转换逻辑编写、BDC会话创建和数据处理,可以实现大批量数据的输入或修改。同,错误处理和会话清除也是不可忽视的步骤,以确保数据的完整性和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值