2016-03-27 12 views
0

次のプログラムは正常に動作しますが、SELECT..ENDSELECT部分​​は1回だけ実行されますが、表の各行に対してクラスメソッドlcl_utilを複数回呼び出す必要があります。これはなぜですか? SELECT-ENDSELECT構造が選択基準に依存しているので、一致するものがない場合は、クラスの呼び出しがスキップされたり、それが唯一の返される行数に基づいて実行されることをメソッドlcl_utilはループ内で1回だけ呼び出されます。なぜですか?

*&---------------------------------------------------------------------* 
*& 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構造体はパフォーマンスに影響を与える可能性があるため避ける必要があります。この場合、選択基準に一致する行の数がわからないことがあります。
私の提案は、(1)内部テーブルへのエントリを選択することです。 (2)次に、その内部テーブルをループし、メソッドを呼び出してテーブルエントリを書き出します。

パフォーマンスのヒントについては、blog postが良いです。 ここでは、blog postについてSELECT INTOとSELECT-ENDSELECTの関係があります。

関連する問題