方法lcl_util在循环中只调用一次为什么?

时间:2016-03-27 09:15:14

标签: sap abap

以下程序运行正常,但SELECT..ENDSELECT部分​​只运行一次,而它应该为表中的每一行多次调用类方法lcl_util一次?为什么会这样?

*&---------------------------------------------------------------------*
*& Report  ZDYNAMIC_PROG2
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ZDYNAMIC_PROG2.
PARAMETER:
 p_from(30) TYPE c DEFAULT 'T001L',
 p_where(255) TYPE c
 DEFAULT 'WERKS = ''PL01'' AND LGORT = ''SL01'' '.
* ----------------------------------------------------------------------*
*        CLASS lcl_util DEFINITION
* ----------------------------------------------------------------------*
*
* ----------------------------------------------------------------------*
 CLASS lcl_util DEFINITION.
   PUBLIC SECTION.
     CLASS-METHODS:
     write_struct IMPORTING p_struct TYPE any.
 ENDCLASS.                    "lcl_util DEFINITION
* ----------------------------------------------------------------------*
*        CLASS lcl_util IMPLEMENTATION
* ----------------------------------------------------------------------*
*
* ----------------------------------------------------------------------*
 CLASS lcl_util IMPLEMENTATION.
   METHOD write_struct.
     FIELD-SYMBOLS:
     <field> TYPE any.
     WRITE / '('.
     DO.
       ASSIGN COMPONENT sy-index OF STRUCTURE p_struct TO <field>.
       IF sy-subrc <> 0.
         EXIT.
       ENDIF.
       WRITE /4 <field>.
     ENDDO.
     WRITE / ')'.
   ENDMETHOD.                    "write_struct
 ENDCLASS.                    "lcl_util IMPLEMENTATION

 DATA:
 data_ref TYPE REF TO data,
 where_tab LIKE TABLE OF p_where.

FIELD-SYMBOLS:
 <line> TYPE any.

 START-OF-SELECTION.

   CREATE DATA data_ref TYPE (p_from).
   ASSIGN data_ref->* TO <line>.
*   APPEND p_where TO where_tab.

  SELECT * FROM (p_from) INTO <line> WHERE (p_where).

     CALL METHOD lcl_util=>write_struct
       EXPORTING
         p_struct = <line>.

   ENDSELECT.

1 个答案:

答案 0 :(得分:0)

SELECT-ENDSELECT结构取决于选择标准,因此如果没有匹配,则跳过对类的调用,或者仅根据返回的行数执行。 从逻辑结构来看,在执行时很难知道循环执行的次数。 通常,应避免使用SELECT-ENDSELECT结构,因为它们会影响性能,在这种情况下,很难知道有多少行符合选择标准。
我的建议是:(1)在内部表中选择条目。 (2)然后在该内部表上循环,调用您的方法将表条目写出来。

这是关于效果提示的好blog post。 这是关于SELECT INTO与SELECT-ENDSELECT

的良好blog post