Variante 1 (HASHED TABLE)
TYPES: BEGIN OF ty_msgnr,
msgnr TYPE t100-msgnr,
END OF ty_msgnr.
DATA: it_t100 TYPE HASHED TABLE OF t100 WITH UNIQUE KEY sprsl arbgb msgnr.
SELECT * FROM t100
INTO TABLE @it_t100
UP TO 100000 ROWS.
DATA: it_msgnr TYPE HASHED TABLE OF ty_msgnr WITH UNIQUE KEY msgnr.
DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).
LOOP AT it_t100 ASSIGNING FIELD-SYMBOL(<s>).
* jedes Element auf Vorhandensein Prüfen und ggf. zur Liste hinzufügen
IF NOT line_exists( it_msgnr[ msgnr = <s>-msgnr ] ).
INSERT VALUE ty_msgnr( msgnr = <s>-msgnr ) INTO TABLE it_msgnr.
ENDIF.
ENDLOOP.
DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.
WRITE: / 'Laufzeit:', sec, 's'.
Variante 2 (GROUP BY)
TYPES: BEGIN OF ty_msgnr,
msgnr TYPE t100-msgnr,
END OF ty_msgnr.
*DATA: it_t100 TYPE HASHED TABLE OF t100 WITH UNIQUE KEY sprsl arbgb msgnr.
DATA: it_t100 TYPE STANDARD TABLE OF t100 WITH DEFAULT KEY.
SELECT * FROM t100
INTO TABLE @it_t100
UP TO 100000 ROWS.
DATA: it_msgnr TYPE STANDARD TABLE OF ty_msgnr WITH DEFAULT KEY.
DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).
LOOP AT it_t100 ASSIGNING FIELD-SYMBOL(<s>) GROUP BY <s>-msgnr ASCENDING.
* jedes Element auf Vorhandensein Prüfen und ggf. zur Liste hinzufügen
APPEND VALUE ty_msgnr( msgnr = <s>-msgnr ) TO it_msgnr.
ENDLOOP.
DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.
WRITE: / 'Laufzeit:', sec, 's'.
Variante 3 (am schnellsten: COLLECT)
TYPES: BEGIN OF ty_msgnr,
msgnr TYPE t100-msgnr,
END OF ty_msgnr.
* Messages lesen
SELECT * FROM t100
INTO TABLE @DATA(it_t100)
UP TO 100000 ROWS.
DATA: it_msgnr TYPE STANDARD TABLE OF ty_msgnr WITH DEFAULT KEY.
DATA(o_timer) = cl_abap_runtime=>create_hr_timer( ).
DATA(usec_start) = o_timer->get_runtime( ).
LOOP AT it_t100 ASSIGNING FIELD-SYMBOL(<s>).
* jedes Element auf Vorhandensein Prüfen und ggf. zur Liste hinzufügen
* COLLECT verwendet intern HASHED TABLES
COLLECT VALUE ty_msgnr( msgnr = <s>-msgnr ) INTO it_msgnr.
ENDLOOP.
DATA(usec_end) = o_timer->get_runtime( ).
DATA(usec) = CONV decfloat16( usec_end - usec_start ).
DATA(sec) = usec / 1000000.
WRITE: / 'Laufzeit:', sec, 's'.