2016-03-27 51 views
0

下面的程序運行正常,但是,SELECT..ENDSELECT部分​​只運行一次,而它應該爲表中的每一行多次調用一次類方法lcl_util一次?這是爲什麼?方法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

您的'p_where'參數限制了選擇。你可以檢查你的表中有多少條目有這個限制嗎? – knut

+1

這絕對是條件。對於我來說,你的代碼運行得很好:與表中的行一樣多。 – Suncatcher

回答

0

這SELECT-ENDSELECT結構取決於選擇的標準,因此,如果沒有匹配,調用類被跳過,否則將只執行基於返回多少行。 從邏輯的結構來看,在執行時,很難知道循環執行多少次。 通常,應避免使用SELECT-ENDSELECT結構,因爲它們可能會影響性能,並且在此情況下難以知道有多少行符合選擇條件。
我的建議是:(1)將條目選入內部表格。 (2)然後在該內部表上循環,調用你的方法寫入表項。

關於性能提示,下面是一個很好的blog post。 這是一個很好的blog post關於SELECT INTO與SELECT-ENDSELECT

相關問題