ABAP动态模式(Dynamic Pattern)

在利用模式快速规范开发ABAP代码中,我们讨论了模式的基本特性和用法,以及如何创建自己的模式。我将进一步介绍,并演示如何将动态元素添加到模式中,从而使开发过程更加简化。

SAP ABAP Dynamic Pattern

1. 什么是动态模式

在常规(静态)模式中,只有ABAP代码和一些注释。有用,但不是非常复杂。然而,使用动态模式,您可以模拟内置模式的行为:获取参数(例如结构名称),进行一些处理,根据输入生成输出。

作为一个示例,我们将创建一个动态模式,该模式将前文中的代码注释中的开发人员、请求号等信息动态填充到注释中。

2. 创建动态模式

要在SAP ERP中创建动态模式,只需执行利用模式快速规范开发ABAP代码中讨论的创建模式的步骤:选择实用程序>更多实用程序>编辑模式>创建模式,然后输入模式的名称。它将只包含以下代码行,不包含其他内容:

*$&$MUSTER

ABAP动态模式(Dynamic Pattern)_第1张图片
然后为模式创建一个函数,函数的格式如下,
_EDITOR_EXIT
当调用模式是,程序会调用函数模式对应的函数。
我们需要创建一个函数ZDP_EDITOR_EXIT,使用一个名为BUFFER的RSWSOURCET类型的TABLES参数创建函数模块。
ABAP动态模式(Dynamic Pattern)_第2张图片

在这个功能模块中,您现在可以对动态模式做任何想做的事情。您拥有正常对话编程的所有可能性。例如,您可以使用弹出窗口向用户请求输入,就像我在本例中所做的那样(在下面找到我的示例代码)。
我们可以使用函数模块POPUP_GET_VALUES向用户请求一些输入。也可以自己创建Dialog屏幕来获取输入的信息,然后将这些信息拼接成我们需要的备注信息。

录入基本信息:
ABAP动态模式(Dynamic Pattern)_第3张图片
插入效果:
ABAP动态模式(Dynamic Pattern)_第4张图片

3. 详细代码

 	FUNCTION zdp_editor_exit.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      BUFFER TYPE  RSWSOURCET
*"----------------------------------------------------------------------
  "Pattern格式
*----------------------------------------------------------------------*
* Object          :  <开发对象,如程序名、增强,类等等>
* FS ID           :  <开发需求编号,如AM0014>
* Functional Owner:  <业务顾问>
* Description     :  <功能描述,如果内容太多,请换行>
*                    <功能描述>
*----------------------------------------------------------------------*
* TR No.      Date         Author      Description
* S4DK946420  2020.09.18   梁子华      初始版本
*
*----------------------------------------------------------------------*


  CONSTANTS lc_spit_line TYPE string
    VALUE '*----------------------------------------------------------------------*'.

  CONSTANTS lc_blank_line TYPE string VALUE '*                      '.

  DATA: BEGIN OF ls_buffer_basic,
          id(22)    TYPE c,
          value(51) TYPE c,
        END OF ls_buffer_basic,
        lt_buffer_basic LIKE TABLE OF ls_buffer_basic.
  DATA: BEGIN OF ls_buffer_version,
          trno        TYPE text12,
          date        TYPE text12,
          author      TYPE text12,
          description TYPE text36,
        END OF ls_buffer_version,
        lt_buffer_version LIKE TABLE OF ls_buffer_version.

  DATA: ls_buffer       TYPE text72,
        lt_desc         TYPE TABLE OF string,
        lv_date_version TYPE char10.

  "弹出窗口,获取基本信息(业务顾问、开发人员、TR号码)
  CLEAR: zbc_pattern_zdp.
  zbc_pattern_zdp-fsid         = ''.
  zbc_pattern_zdp-func_owner   = ''.

  SPLIT sy-title AT space INTO TABLE DATA(lt_title_tab).

  DATA(lv_title_lines) = lines( lt_title_tab ).
  READ TABLE lt_title_tab INTO DATA(ls_title) INDEX lv_title_lines.
  IF sy-subrc EQ 0.
    zbc_pattern_zdp-object = ls_title. "更改对象
  ENDIF.
  LOOP AT lt_title_tab INTO ls_title.
    CASE ls_title.
      WHEN '报表'.
        EXIT.
      WHEN '函数构建器:更改'.
        EXIT.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

  CASE ls_title.
    WHEN '报表'.
      SELECT SINGLE text
        FROM trdirt
       WHERE name  = @zbc_pattern_zdp-object
         AND sprsl = @sy-langu
        INTO @zbc_pattern_zdp-desc_func.
    WHEN '函数构建器:更改'.
      SELECT SINGLE stext
        FROM tftit
       WHERE spras  = @sy-langu
         AND funcname = @zbc_pattern_zdp-object
        INTO @zbc_pattern_zdp-desc_func.
    WHEN OTHERS.
  ENDCASE.


  zbc_pattern_zdp-trno         = ''.
  zbc_pattern_zdp-user_dev     = sy-uname.
  zbc_pattern_zdp-date_version = sy-datum.
  zbc_pattern_zdp-desc_version = TEXT-001. "初始版本


  PERFORM frm_get_username_dev.


  CALL SCREEN 0001 STARTING AT 5 5
                   ENDING AT 80 13.

  CHECK zbc_pattern_zdp-modified = abap_true.

  APPEND lc_spit_line TO buffer[].

  "开发对象基本信息
  lt_buffer_basic = VALUE #( BASE lt_buffer_basic
        ( id = '* Object          : ' value = zbc_pattern_zdp-object )     "基本信息
        ( id = '* FS ID           : ' value = zbc_pattern_zdp-fsid )       "
        ( id = '* Functional Owner: ' value = zbc_pattern_zdp-func_owner ) "
        ).

  "功能描述,如果内容太多,请换行,将描述拆分成25字符个长度的行
  PERFORM frm_split_text USING zbc_pattern_zdp-desc_func
                               25
                               CHANGING lt_desc.

  LOOP AT lt_desc INTO DATA(ls_desc).
    IF sy-tabix = 1.
      lt_buffer_basic = VALUE #( BASE lt_buffer_basic
       ( id = '* Description     :' value = ls_desc )
       ).
    ELSE.
      lt_buffer_basic = VALUE #( BASE lt_buffer_basic
     ( id = '* ' value = ls_desc ) ).
    ENDIF.
  ENDLOOP.

  LOOP AT lt_buffer_basic INTO ls_buffer_basic.
    CONCATENATE ls_buffer_basic-id  ls_buffer_basic-value INTO ls_buffer  RESPECTING BLANKS.
    APPEND ls_buffer TO buffer[].
  ENDLOOP.

  APPEND lc_spit_line TO buffer[]. "插入拆分行

  "变更版本信息
  lt_buffer_version = VALUE #( BASE lt_buffer_version
      (
        trno        = 'TR No.'
        date        = 'Date'
        author      = 'Author'
        description = 'Description'
      ) ).

  "变更日期,格式YYYY.MM.DD
  CLEAR: ls_buffer.
  lv_date_version =  zbc_pattern_zdp-date_version+0(4) && '.'  &&
                     zbc_pattern_zdp-date_version+4(2) && '.'  &&
                     zbc_pattern_zdp-date_version+6(2) .

  "变更版本描述
  CLEAR: lt_desc.
  PERFORM frm_split_text USING zbc_pattern_zdp-desc_version
                               16
                               CHANGING lt_desc.

  LOOP AT lt_desc INTO ls_desc.
    IF sy-tabix = 1.
      lt_buffer_version = VALUE #( BASE lt_buffer_version
     (
       trno        = zbc_pattern_zdp-trno
       date        = lv_date_version
       author      = zbc_pattern_zdp-username_dev
       description = ls_desc
     ) ).

    ELSE.
      lt_buffer_version = VALUE #( BASE lt_buffer_version (  description = ls_desc  ) ).
    ENDIF.

  ENDLOOP.

  LOOP AT lt_buffer_version INTO ls_buffer_version.

    CONCATENATE '* ' ls_buffer_version-trno
                ls_buffer_version-date
                ls_buffer_version-author
                ls_buffer_version-description
     INTO ls_buffer  RESPECTING BLANKS.
    APPEND ls_buffer TO buffer[].
  ENDLOOP.

  ls_buffer = '*'.
  APPEND ls_buffer TO buffer[].
  APPEND lc_spit_line TO buffer[].

ENDFUNCTION.

"根据自定义需求拆分文本
FORM frm_split_text USING uv_text
                          uv_split_len TYPE i
                 CHANGING ct_text TYPE STANDARD TABLE.

  DATA: lv_strlen TYPE i,
        lv_text   TYPE string.
  CLEAR: lv_text.
  lv_text = uv_text.

  DO  .
    lv_strlen = strlen( lv_text ).
    IF lv_strlen LE uv_split_len.
      APPEND lv_text TO ct_text .
      EXIT.
    ELSE.
      APPEND lv_text+0(uv_split_len) TO ct_text .

      SHIFT lv_text BY uv_split_len PLACES.
      CONDENSE lv_text.
    ENDIF.
  ENDDO.
ENDFORM.

你可能感兴趣的:(ABAP,开发语言)