ABAP Help Document(28):13 Program Editing

13.Program Editing

13.1 Testing and Checking Program

          创建项目和完成项目时,需要进行项目测试。

          Checkpoints(断点),程序运行时,可以作为测试接入点。使用Tcode:SAAB,将断点放入checkpoint group。

语法:

ASSERT [ [ID group [SUBKEY sub]] [FIELDS val1 val2 ...]  CONDITION ] log_exp.

定义断言。

当没有ID时,checkpoint总是激活的,当有ID时,checkpoint状态由外部checkpoint group状态决定;

SUBKEY只在ASSERT将条目写入日志时有效;

FIELDS的大小由系统profile parameter:abap/aab_log_field_size_limit确定;

语法:

BREAK-POINT { [ID group] | [log_text] }.

定义断点。

语法:

LOG-POINT ID group  [SUBKEY sub] [FIELDS val1 val2 ...].

定义日志断点。

13.2 Runtime measurement

          运行时间测量,使用类CL_ABAP_RUNTIME或者GET RUN TIME、SET RUN TIME CLOCK RESOLUTION、SET RUN TIME ANALYZER。

语法:

GET RUN TIME FIELD rtime.

获取运行时间

示例:

FORM f_get_runtime.
  DATA:lv_time TYPE I.
  DATA:lv_t1 TYPE I.
  DATA:lv_t2 TYPE I.
  DATA:lv_dura TYPE P LENGTH 8 DECIMALS 5.

  GET RUN TIME FIELD lv_t1.
  DO 1000 TIMES.
    SELECT COUNT(*) FROM sflight.
  ENDDO.
  GET RUN TIME FIELD lv_t2.
  lv_time = lv_t2 - lv_t1.

  GET RUN TIME FIELD lv_t1.
  DO 1000 TIMES.
  ENDDO.
  GET RUN TIME FIELD lv_t2.
  lv_time = lv_time - ( lv_t2 - lv_t1 ).
  "获取每查询一次时间,单位microseconds
  lv_dura = lv_time / 1000.
  WRITE:/ lv_time,lv_dura.
ENDFORM

语法:

SET RUN TIME CLOCK RESOLUTION {HIGH|LOW}.

指定GET RUN TIME的精度。必须在GET RUN TIME之前执行,否则出错。

语法:

SET RUN TIME ANALYZER {ON|OFF}.

此语句影响运行时分析工具。

13.3 ABAP Unit Test

          ABAP单元测试。

语法:

CLASS class DEFINITION FOR TESTING [RISK LEVEL {CRITICAL|DANGEROUS|HARMLESS}]

[DURATION   {SHORT|MEDIUM|LONG}].

测试类定义。

方法名:

setup:which is executed before each individual test or before each execution of a test method.

teardown:which is executed after each individual test or after each execution of a test method.

class_setup:静态方法,which is executed once before all tests of the class.

class_teardown:静态方法,which is executed once after every test of the class.

语法:

METHODS meth [ABSTRACT|FINAL]

  FOR TESTING

  [RAISING exc1|RESUMABLE(exc1) exc2|RESUMABLE(exc2) ...].

测试方法,只能在测试类中定义。

使用类CL_ABAP_UNIT_ASSERT中静态方法进行值测试。

示例:

"被测试类
CLASS c_1 DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:set_name IMPORTING name TYPE string.
    CLASS-DATA:gv_name TYPE string.
ENDCLASS.
CLASS c_1 IMPLEMENTATION.
  METHOD:set_name.
    gv_name = name.
  ENDMETHOD.
ENDCLASS.
"测试类
CLASS c_test DEFINITION FOR TESTING.
  PUBLIC SECTION.
    METHODS:m_test FOR TESTING.
ENDCLASS.
CLASS c_test IMPLEMENTATION.
  METHOD:m_test.
    c_1=>set_name( 'hh' ).
    cl_abap_unit_assert=>assert_equals(
      EXPORTING
        act = c_1=>gv_name
        exp = 'hh'
        msg = 'success'
        ).
  ENDMETHOD.
ENDCLASS

13.4 Dynamic Program Edit

          对Program编辑实现动态控制。Program由Source code、Text Elements、Dynpro三个部分组成。Function:RS_ACCESS_PERMISSION,进行权限检查;TR_SYS_PARAMS:存储库对象是否可更改;

1.Source code

语法:

GENERATE SUBROUTINE POOL itab NAME prog [error_handling].

生成临时子程序池。

[error_handling]

MESSAGE mess]

[INCLUDE incl]

[LINE lin]

[WORD wrd]

[OFFSET off]

[MESSAGE-ID mid]

[SHORTDUMP-ID sid] ... .

message:当子程序池发生错误,第一个错误的错误信息;

include:当子程序池中include发生错误,include名称;

line:当子程序池中发生错误,第一个错误行号;

word:当子程序池中发生错误,第一个字符;

offset:当子程序池发生错误,第一个字符及后偏移量;

message-id:当子程序池发送错误,第一个错误存储在table: TRMSG,使用mid可以查找到;

shortdump-id:当出现错误时,但是被处理了,错误存储在table: SNAPT;

示例1:动态子程序

FORM f_dyn_source_subroutine.
  DATA:lv_prog  TYPE string.
  DATA:lt_tab  TYPE STANDARD TABLE OF string.
  DATA:lv_mess TYPE string.
  DATA:lv_id TYPE string.

  APPEND 'PROGRAM subpool.' TO lt_tab.
  APPEND ` DATA spfli_tab TYPE TABLE OF spfli.`  TO lt_tab.
  APPEND ` DATA spfli_wa TYPE spfli.` TO lt_tab.
  APPEND `LOAD-OF-PROGRAM.` TO lt_tab.
  APPEND `  SELECT *` & ` FROM spfli` & ` INTO TABLE spfli_tab.` TO lt_tab.
  APPEND `FORM show_tab.` TO lt_tab.
  APPEND `  LOOP AT spfli_tab INTO spfli_wa.` TO lt_tab.
  APPEND `   WRITE:/ spfli_wa-carrid,spfli_wa-connid.` TO lt_tab.
  APPEND `  ENDLOOP.` TO lt_tab.
  APPEND `ENDFORM.` TO lt_tab.
  "创建子程序池
  GENERATE SUBROUTINE POOL lt_tab NAME lv_prog
         MESSAGE lv_mess
         SHORTDUMP-ID lv_id.

  IF sy-subrc = 0.
    PERFORM ('SHOW_TAB') IN PROGRAM (lv_prog) IF FOUND.
  ELSEIF sy-subrc = 4.
    MESSAGE lv_mess TYPE 'I'.
  ELSEIF sy-subrc = 8.
    MESSAGE lv_id TYPE 'I'.
  ENDIF.

  "创建类
  DATA:lv_class TYPE string.
  DATA:lo_ref TYPE REF TO object.
  CLEAR lt_tab.
  APPEND `program.` TO lt_tab.
  APPEND `class main definition.` TO lt_tab.
  APPEND `  public section.` TO lt_tab.
  APPEND `    class-methods meth.` TO lt_tab.
  APPEND `endclass.`  TO lt_tab.
  APPEND `class main implementation.`   TO lt_tab.
  APPEND `  method meth.`  TO lt_tab.
  APPEND `    message 'Test' type 'I'.` TO lt_tab.
  APPEND `  endmethod.` TO lt_tab.
  APPEND `endclass.`   TO lt_tab.
  "创建子程序池
  GENERATE SUBROUTINE POOL lt_tab NAME lv_prog.
  "类名
  lv_class = `PROGRAM=` && lv_prog && `CLASS=MAIN`.
  CALL METHOD (lv_class)=>meth.
  "方式2:
  CREATE OBJECT lo_ref TYPE (lv_class).
  CALL METHOD lo_ref->('METH').
ENDFORM.

语法:

READ REPORT prog INTO itab [MAXIMUM WIDTH INTO wid].

获取存储库中source code。

示例:

FORM f_dyn_source_read.
  DATA:lv_prog TYPE C LENGTH 30.
  DATA:lt_tab TYPE TABLE OF string.
  lv_prog = 'ZTOM_LEARNING14'.
  READ REPORT lv_prog INTO lt_tab.
  IF sy-subrc = 0.
    APPEND `FORM sub.` TO lt_tab.
    APPEND ` WRITE:/ 'hello'.` TO lt_tab.
    APPEND `ENDFORM.` TO lt_tab.
    GENERATE SUBROUTINE POOL lt_tab NAME lv_prog.
    PERFORM ('SUB') IN PROGRAM (lv_prog).
  ENDIF.

  "生成指定program
  lv_prog = 'TEST_PROG'.
  APPEND `FORM sub1.` TO lt_tab.
  APPEND ` WRITE:/ 'hello sub1'.` TO lt_tab.
  APPEND `ENDFORM.` TO lt_tab.
  INSERT REPORT lv_prog FROM lt_tab.
  "读取
  CLEAR lt_tab[].
  READ REPORT lv_prog INTO lt_tab.
  GENERATE SUBROUTINE POOL lt_tab NAME lv_prog.
  PERFORM ('SUB1') IN PROGRAM (lv_prog).
ENDFORM.

语法:

SYNTAX-CHECK FOR itab MESSAGE mess LINE lin WORD wrd

                 [PROGRAM prog] [DIRECTORY ENTRY dir]

                 [WITH CURRENT SWITCHSTATES] [error_handling].

对itab内动态内容进行语法检查,不必要,因为执行时,总会进行语法检查。

error_handling:

[INCLUDE incl]

[OFFSET off]

[MESSAGE-ID mid]

语法:

INSERT REPORT prog FROM itab
              [MAXIMUM WIDTH INTO wid]
              { [KEEPING DIRECTORY ENTRY]
              | { [PROGRAM TYPE pt]
                  [FIXED-POINT ARITHMETIC fp]
                  [UNICODE ENABLING uc] }
              | [DIRECTORY ENTRY dir] }.

将itab动态定义语法插入到存储库。如果prog已经存在,就覆盖。

程序类型

ID

Program Type

1

Executable program

F

Function group or function pool

I

Include program

J

Interface pool

K

Class pool

M

Module pool

S

Subroutine pool

T

Type group or type pool

2. Text Elements

语法:

READ TEXTPOOL prog INTO itab LANGUAGE lang.

读取textpool。

语法:

INSERT TEXTPOOL prog FROM itab LANGUAGE lang.

插入textpool。

lang这里为表T002维护。

示例:

FORM f_dyn_source_texts.
  DATA:lv_prog TYPE C LENGTH 30.
  DATA:lt_tab TYPE TABLE OF textpool.
  DATA:ls_tab LIKE LINE OF lt_tab.
  lv_prog = 'ZTOM_LEARNING14'.
  READ TEXTPOOL lv_prog INTO lt_tab LANGUAGE 'EN'.
  LOOP AT lt_tab INTO ls_tab.
    WRITE:/ ls_tab-id,ls_tab-key,ls_tab-entry,ls_tab-length.
  ENDLOOP.
ENDFORM.
原文地址:https://www.cnblogs.com/tangToms/p/14697292.html