Code: Alles auswählen.
REPORT zfi_select_beleg.
TABLES: bkpf, bseg.
SELECT-OPTIONS: s_bukrs FOR bkpf-bukrs,
s_gjahr FOR bkpf-gjahr,
s_hkont FOR bseg-hkont.
TYPES: BEGIN OF header,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
usnam TYPE usnam,
END OF header,
t_header TYPE STANDARD TABLE OF header WITH KEY bukrs belnr gjahr,
BEGIN OF position,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
gjahr TYPE bkpf-gjahr,
buzei TYPE bseg-buzei,
dmbtr TYPE dmbtr,
hkont TYPE bseg-hkont,
shkzg TYPE bseg-shkzg,
END OF position,
t_position TYPE STANDARD TABLE OF position WITH KEY bukrs belnr buzei gjahr,
BEGIN OF ausgabe,
bukrs TYPE bkpf-bukrs,
belnr TYPE bkpf-belnr,
buzei TYPE bseg-buzei,
gjahr TYPE bkpf-gjahr,
dmbtr TYPE dmbtr,
hkont TYPE bseg-hkont,
shkzg TYPE bseg-shkzg,
usnam TYPE usnam,
END OF ausgabe,
t_ausgabe TYPE STANDARD TABLE OF ausgabe WITH KEY bukrs belnr buzei gjahr.
DATA : lt_header TYPE t_header,
lt_bseg TYPE t_position,
lt_ausgabe TYPE t_ausgabe.
* ----------------------------------------------------------
* Schlüsselfelder BKPF + Userkennung
SELECT bukrs, belnr, gjahr, usnam FROM bkpf
INTO CORRESPONDING FIELDS OF TABLE @lt_header
WHERE bukrs IN @s_bukrs
AND gjahr IN @s_gjahr .
* Schlüsselfelder BSEG + Betrag, Sachkonto, Soll/Haben-Kennzeichen
SELECT bukrs, belnr, buzei, gjahr, dmbtr, hkont, shkzg FROM bseg
INTO CORRESPONDING FIELDS OF TABLE @lt_bseg
WHERE bukrs IN @s_bukrs
AND gjahr IN @s_gjahr
AND hkont IN @s_hkont.
* Alles durch Magie in die interne Tabelle lt_alv für die Ausgabe. Nur leider zu langsam.
DATA(lt_alv) = VALUE t_ausgabe(
FOR ls_bseg IN lt_bseg
FOR ls_bkpf IN lt_header
FROM line_index( lt_ausgabe[
bukrs = ls_bkpf-bukrs
gjahr = ls_bkpf-gjahr
belnr = ls_bkpf-belnr ] )
WHERE
( bukrs = ls_bseg-bukrs AND
gjahr = ls_bseg-gjahr AND
belnr = ls_bseg-belnr )
LET ls_ausgabe = VALUE ausgabe( usnam = ls_bkpf-usnam )
IN ( CORRESPONDING #( BASE ( ls_ausgabe ) ls_bseg ) ) ).
DATA go_functions TYPE REF TO cl_salv_functions_list.
cl_salv_table=>factory(
IMPORTING
r_salv_table = DATA(lo_alv)
CHANGING
t_table = lt_alv ).
go_functions = lo_alv->get_functions( ).
go_functions->set_all( abap_true ).
lo_alv->display( ).
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Wann
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Wann
Code: Alles auswählen.
REPORT.
CLASS lcl_report DEFINITION.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_text,
text TYPE c LENGTH 100,
END OF ty_text,
tty_texts TYPE STANDARD TABLE OF ty_text WITH NON-UNIQUE KEY table_line.
CLASS-METHODS:
main.
PRIVATE SECTION.
CLASS-METHODS:
prepare_source_table,
fill_table_with_base,
fill_table_with_append,
fill_table_with_insert,
fill_table_with_for,
fill_table_with_select.
CLASS-DATA:
source_for TYPE tty_texts,
source_base TYPE tty_texts,
source_append TYPE tty_texts,
source_insert TYPE tty_texts,
source_select TYPE tty_texts.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD main.
prepare_source_table( ).
fill_table_with_select( ).
fill_table_with_for( ).
fill_table_with_insert( ).
fill_table_with_append( ).
fill_table_with_base( ).
ENDMETHOD.
METHOD prepare_source_table.
DO 9999 TIMES.
INSERT VALUE #( text = |Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a sodales lorem. { sy-index }: for| ) INTO TABLE source_for.
INSERT VALUE #( text = |Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a sodales lorem. { sy-index }: base| ) INTO TABLE source_base.
INSERT VALUE #( text = |Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a sodales lorem. { sy-index }: append| ) INTO TABLE source_append.
INSERT VALUE #( text = |Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a sodales lorem. { sy-index }: insert| ) INTO TABLE source_insert.
INSERT VALUE #( text = |Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam a sodales lorem. { sy-index }: select| ) INTO TABLE source_select.
ENDDO.
ENDMETHOD.
METHOD fill_table_with_base.
DATA rng_texts TYPE RANGE OF ty_text.
LOOP AT source_base ASSIGNING FIELD-SYMBOL(<row>).
rng_texts = VALUE #( BASE rng_texts ( sign = 'I' option = 'EQ' low = <row>-text ) ).
ENDLOOP.
ENDMETHOD.
METHOD fill_table_with_append.
DATA rng_texts TYPE RANGE OF ty_text.
LOOP AT source_append ASSIGNING FIELD-SYMBOL(<row>).
APPEND VALUE #( sign = 'I' option = 'EQ' low = CONV #( <row>-text ) ) TO rng_texts.
ENDLOOP.
ENDMETHOD.
METHOD fill_table_with_insert.
DATA rng_texts TYPE RANGE OF ty_text.
LOOP AT source_insert ASSIGNING FIELD-SYMBOL(<row>).
INSERT VALUE #( sign = 'I' option = 'EQ' low = CONV #( <row>-text ) ) INTO TABLE rng_texts.
ENDLOOP.
ENDMETHOD.
METHOD fill_table_with_for.
DATA rng_texts TYPE RANGE OF ty_text.
rng_texts = VALUE #( FOR <row> IN source_for ( sign = 'I' option = 'EQ' low = <row>-text ) ).
ENDMETHOD.
METHOD fill_table_with_select.
DATA rng_texts TYPE RANGE OF ty_text.
SELECT FROM @source_select AS source
FIELDS 'I' AS sign, 'EQ' AS option, source~text AS low
INTO TABLE @rng_texts.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_report=>main( ).
Folgende Benutzer bedankten sich beim Autor rob_abc für den Beitrag (Insgesamt 3):
ewx • DeathAndPain • Wann
Code: Alles auswählen.
line_index( )
Folgende Benutzer bedankten sich beim Autor sap_enthusiast für den Beitrag:
ewx
Du meinst für den Fall, dass man SY-TABIX benötigt? Wenn man nur SY-TABIX benötigt und für den Fall, dass die gesuchte Zeile nicht gefunden wird, nicht den passenden Einfügeindex braucht, ist das sicherlich eine Option. Ich dachte eher an den Fall, bei dem ich den Wert einer Zeile brauche und deren Tabellenindex. Dann ist READ TABLE sicherlich besser, weil ich beides auf einmal benötige. Kommt in der Praxis nur sehr selten vor.sap_enthusiast hat geschrieben: ↑19.01.2023 09:34Da READ TABLE heutzutage schon als "obsolet" betrachtet wird, wäre eine mögliche alternative die eingebaute Funktion line_index( ) ?
Moin D&P,DeathAndPain hat geschrieben: ↑18.01.2023 15:33Von READ TABLE halte ich in der heutigen Zeit nicht mehr viel, außer man kann die Tabelle nicht als sortiert oder gehasht definieren oder benötigt zusätzlich SY-TABIX.
Code: Alles auswählen.
READ TABLE t_buffer WITH TABLE KEY key_components = local_key ASSIGNING FIELD-SYMBOL(<row_for_key>).
IF sy-subrc <> 0.
INSERT VALUE #( key_components = local_key ) INTO TABLE t_buffer ASSIGNING <row_for_key>.
~diverse (laufzeitintensive?) Berechnungen um Nichtschlüsselfelder zu füllen~
ENDIF.
~in <row_for_key> stehen jetzt die Daten bereit~
Code: Alles auswählen.
ASSIGN t_buffer[ key_components = local_key ] to FIELD-SYMBOL(<row_for_key>).
Code: Alles auswählen.
READ TABLE t_buffer WITH TABLE KEY key_components = local_key ASSIGNING FIELD-SYMBOL(<row_for_key>).
IF sy-subrc <> 0.
INSERT VALUE #( key_components = local_key ) INTO t_buffer INDEX sy-tabix ASSIGNING <row_for_key>.
~diverse (laufzeitintensive?) Berechnungen um Nichtschlüsselfelder zu füllen~
ENDIF.
~in <row_for_key> stehen jetzt die Daten bereit~
Das dumpt, wenn die Zeile nicht vorhanden istrob_abc hat geschrieben: ↑20.01.2023 14:47Ist das zu einfach gedacht?Code: Alles auswählen.
ASSIGN t_buffer[ key_components = local_key ] to FIELD-SYMBOL(<row_for_key>).
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
qyurryus
Huh... dachte die Tabellenzuweisung würde immer dumpen, aber tatsächlich, im Kontext von "ASSIGN" dumpt es nicht, gut zu wissen!DeathAndPain hat geschrieben: ↑20.01.2023 23:33Da irrst Du Dich. ASSIGN dumpt niemals, sondern setzt den SY-SUBRC.
Letztlich ist das auch die viel nützlichere Verhaltensweise. An der Stelle hat die SAP mal was sinnvoll statt streng formal gemacht.
Code: Alles auswählen.
DATA(tab) = VALUE str_tab( ( `AA` ) ).
" kein Dump
ASSIGN tab[ 2 ] TO FIELD-SYMBOL(<xd>).
" Dump
DATA(test) = tab[ 2 ].
Hast recht. DankeDeathAndPain hat geschrieben: ↑20.01.2023 23:33Da irrst Du Dich. ASSIGN dumpt niemals, sondern setzt den SY-SUBRC.
Es gibt auch noch andere Kontexte, bei denen die Tabellenzuweisung nicht dumpt, wobei das bei denen offensichtlicher ist, beispielsweise beiqyurryus hat geschrieben: ↑23.01.2023 08:38Huh... dachte die Tabellenzuweisung würde immer dumpen, aber tatsächlich, im Kontext von "ASSIGN" dumpt es nicht, gut zu wissen!
Code: Alles auswählen.
DATA(tab) = VALUE str_tab( ( `AA` ) ). " kein Dump ASSIGN tab[ 2 ] TO FIELD-SYMBOL(<xd>). " Dump DATA(test) = tab[ 2 ].