Collect mittels Feld Symbolen

Grundsätzlich ist es nicht möglich, ein Collect in Kombination mit einem Feld Symbol innerhalb eines Loops oder eines SELECT – ENDSELECT zu nutzen. Benutzt man allerdings statt einem ASSIGNING ein normales INTO in einem Loop oder liest die Daten in eine Workarea innerhalb eines SELECT, dann kann man auch ein COLLECT nutzen.

Anbei ein kleiner Testreport, welcher die nötigen Schritte zeigt, um ein COLLECT auch mit dynamischen Datenstrukturen zu nutzen. In meinem Beispiel habe ich eine Tabelle Z_INVOICES mit mehreren Feldern angelegt. Ausgelesen werden im SELECT allerdings nur drei Werte pro Zeile.

*---------------------------------------------------------------------*
* Report  Z_TEST_COLLECT
*
*---------------------------------------------------------------------*
*
*
*---------------------------------------------------------------------*

REPORT  z_test_collect.

TYPE-POOLS: abap.

TYPES: BEGIN OF ls_invoice,
        vbeln TYPE z_invoice_number,
        billing_quantity TYPE y0dpl_fkimg,
        net_value TYPE netwr,
       END OF ls_invoice.

DATA: obj_data TYPE REF TO data,
      obj_wa TYPE REF TO data.

FIELD-SYMBOLS: <lt_data> TYPE HASHED TABLE,
               <wa_data> TYPE ANY.

START-OF-SELECTION.
PERFORM build_data.
PERFORM get_data.

END-OF-SELECTION.

*---------------------------------------------------------------------*
*     Form  build_data
*---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM build_data.
* Create data object
 CREATE DATA obj_data TYPE HASHED TABLE OF ls_invoice WITH UNIQUE DEFAULT KEY.
 ASSIGN obj_data->* TO <lt_data>.

 CREATE DATA obj_wa LIKE LINE OF <lt_data>.
 ASSIGN obj_wa->* TO <wa_data>.
ENDFORM.                    "build_data

*---------------------------------------------------------------------*
*    Form  get_data
*---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_data.
* Select data
 SELECT *
 INTO CORRESPONDING FIELDS OF <wa_data>
 FROM Z_invoices
 UP TO 100 ROWS.

  COLLECT <wa_data> INTO <lt_data>.
 ENDSELECT.
ENDFORM.                    "get_data

 

In der Form BUILD_DATA werden zwei Datenobjekte erzeugt. Die interne Tabelle und die dazu passende Work Area. In der Form GET_DATA werden dann die Daten aus der Datenbank gelesen und in der internen Tabelle mittels Collect abgelegt.

Posted on 20. März 2015 in ABAP, Blog

Back to Top