oder1. wieviele Einträge gibt es
describe table wäre hier die Lösung
Code: Alles auswählen.
i = lines( ITAB ).
Code: Alles auswählen.
l_false = 0.
l_true =0.
Loop at ITAB into ls_ITAB where Feld = 'abap_true'.
l_true = l_true + 1.
:
endloop.
Loop at ITAB into ls_ITAB where Feld = 'abap_false'.
l_false = l_false + 1.
:
endloop.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
debianfan
Code: Alles auswählen.
l_false = 0.
l_true =0.
Loop at ITAB into ls_ITAB.
if ls_ITAB-feld = 'abap_true'.
l_true = l_true + 1.
else.
l_false = l_false + 1.
endif.
:
endloop.
Grundsätzlich zwar richtig - aber erst ab einer nicht unerheblichen Größe relevant, so dass sich die "ziemliche Katastrophe" meist doch stark relativiert.ralf.wenzel hat geschrieben:Wobei man dazusagen muss, dass ein LOOP mit WHERE in Standardtabellen ohne Schlüssel immer alle Sätze durchlaufen werden. Performancetechnisch ist das eine ziemliche Katastrophe
Naja, ich versuche das immer etwas globaler zu sehen - mein aktuelles Projekt zeigt wieder, dass Programmierer eine Methode immer wieder anwenden. Daher sage ich lieber "bitte nur sortierte Tabellen", dabei können sie nix falsch machen. Macht man das nicht, hat man nachher auch riesige Standardtabellen ohne jeglichen Index.black_adept hat geschrieben:Grundsätzlich zwar richtig - aber erst ab einer nicht unerheblichen Größe relevant, so dass sich die "ziemliche Katastrophe" meist doch stark relativiert.ralf.wenzel hat geschrieben:Wobei man dazusagen muss, dass ein LOOP mit WHERE in Standardtabellen ohne Schlüssel immer alle Sätze durchlaufen werden. Performancetechnisch ist das eine ziemliche Katastrophe
Code: Alles auswählen.
TYPES:
BEGIN OF lst_names,
name TYPE string,
tf TYPE abap_bool,
END OF lst_names,
ltt_names TYPE STANDARD TABLE OF lst_names
WITH DEFAULT KEY
WITH NON-UNIQUE SORTED KEY key_tf COMPONENTS tf.
START-OF-SELECTION.
DATA(lt_names) = VALUE ltt_names(
( name = |Schulze| tf = abap_true )
( name = |Schmidt| tf = abap_true )
( name = |Meyer| tf = abap_false )
( name = |Müller| tf = abap_true )
).
DATA(lv_true) = lines( FILTER #( lt_names USING KEY key_tf WHERE tf = abap_true ) ).
DATA(lv_false) = lines( FILTER #( lt_names USING KEY key_tf WHERE tf = abap_false ) ).
WRITE: / lv_true, / lv_false.
Moin Ralf.ralf.wenzel hat geschrieben:Aber erst ab 7.40, oder?
Ralf
Code: Alles auswählen.
TYPES: BEGIN OF stf,
tf TYPE abap_bool,
count TYPE i,
END OF stf,
ttf TYPE SORTED TABLE OF stf WITH UNIQUE KEY tf.
DATA(sums) = VALUE ttf( FOR GROUPS grp OF <name> IN lt_names
WHERE ( name IS NOT INITIAL )
GROUP BY ( tf = <name>-tf )
( tf = grp
count = REDUCE #( INIT i = 0
FOR name IN lt_names
WHERE ( tf = grp )
NEXT i = i + 1 ) ) ).
Code: Alles auswählen.
100.000 1.000.000
Haubi FILTER 77s 778s
Enno REDUCE 36s 449s
Tron LOOP 33s 343s
Code: Alles auswählen.
REPORT
PARAMETERS p type i DEFAULT 100000.
CLASS help DEFINITION.
PUBLIC SECTION.
CLASS-METHODS rnd_name RETURNING VALUE(name) TYPE string.
CLASS-METHODS rnd_bool RETURNING VALUE(tf) TYPE boolean.
CLASS-METHODS class_constructor.
CLASS-METHODS p01.
CLASS-METHODS p02.
CLASS-METHODS p03.
PROTECTED SECTION.
CLASS-DATA rnd TYPE REF TO cl_abap_random.
TYPES:
BEGIN OF lst_names,
name TYPE string,
tf TYPE abap_bool,
END OF lst_names,
ltt_names TYPE STANDARD TABLE OF lst_names
WITH DEFAULT KEY
WITH NON-UNIQUE SORTED KEY key_tf COMPONENTS tf.
CLASS-DATA names TYPE ltt_names.
ENDCLASS.
CLASS help IMPLEMENTATION.
METHOD class_constructor.
rnd = cl_abap_random=>create( ).
names = VALUE ltt_names( FOR i = 1 THEN i + 1 WHILE i <= p
( name = help=>rnd_name( ) tf = help=>rnd_bool( ) ) ).
ENDMETHOD.
METHOD rnd_name.
DATA(len) = rnd->intinrange( low = 5 high = 40 ).
DO len TIMES.
DATA(pos) = rnd->intinrange( low = 0 high = 25 ).
name = name && sy-abcde+pos(1).
ENDDO.
ENDMETHOD.
METHOD rnd_bool.
CASE rnd->intinrange( low = 0 high = 1 ).
WHEN 0.
tf = abap_false.
WHEN 1.
tf = abap_true.
ENDCASE.
ENDMETHOD.
METHOD p01.
TYPES:
BEGIN OF stf,
tf TYPE abap_bool,
count TYPE i,
END OF stf,
ttf TYPE SORTED TABLE OF stf WITH UNIQUE KEY tf.
DATA(sum) = VALUE ttf( FOR GROUPS grp OF <name> IN names
WHERE ( name IS NOT INITIAL )
GROUP BY ( tf = <name>-tf )
( tf = grp
count = REDUCE #( INIT i = 0
FOR name IN names
WHERE ( tf = grp )
NEXT i = i + 1 ) ) ).
* cl_demo_output=>display_data( sum ).
ENDMETHOD.
METHOD p02.
DATA(lv_true) = lines( FILTER #( names USING KEY key_tf WHERE tf = abap_true ) ).
DATA(lv_false) = lines( FILTER #( names USING KEY key_tf WHERE tf = abap_false ) ).
* DATA(out) = cl_demo_output=>new( ).
* out->write( lv_true )->write( lv_false )->display( ).
ENDMETHOD.
METHOD p03.
DATA lv_true TYPE i.
DATA lv_false TYPE i.
LOOP AT names INTO DATA(name).
CASE name-tf.
WHEN abap_true. ADD 1 TO lv_true.
WHEN abap_false. ADD 1 TO lv_false.
ENDCASE.
ENDLOOP.
* DATA(out) = cl_demo_output=>new( ).
* out->write( lv_true )->write( lv_false )->display( ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
help=>p01( ).
help=>p02( ).
help=>p03( ).
Code: Alles auswählen.
100.000 1.000.000
Haubi FILTER 77s 778s
Enno REDUCE 36s 449s
Enno 1-LOOP-CASE 33s 343s
Tron 2-LOOP-WHERE 27s 278s