Code: Alles auswählen.
REPORT.
CLASS lcl_report DEFINITION CREATE PRIVATE.
PUBLIC SECTION.
TYPES: BEGIN OF ty_1,
werks TYPE string,
desc TYPE string,
END OF ty_1.
TYPES: BEGIN OF ty_2,
werks TYPE string,
longer_desc TYPE string,
END OF ty_2.
TYPES tty_plants TYPE SORTED TABLE OF ty_1 WITH UNIQUE KEY werks.
TYPES tty_plants_longer TYPE SORTED TABLE OF ty_2 WITH UNIQUE KEY werks.
CLASS-METHODS main.
CLASS-METHODS enhance
IMPORTING i_desc TYPE string
RETURNING VALUE(r_result) TYPE string.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD main.
DATA(plants) = VALUE tty_plants( ( werks = '1000' desc = 'Plant 1' )
( werks = '2000' desc = 'Plant 2' ) ).
cl_demo_output=>write( plants ).
" Konvertierung von DESC findet nicht statt
DATA plants_longer TYPE tty_plants_longer.
plants_longer = VALUE #( FOR <x> IN plants
( CORRESPONDING #( <x> MAPPING longer_desc = desc ) ) ).
cl_demo_output=>write( plants_longer ).
" TBL kann auhc direkt kopiert werden.
plants_longer = CORRESPONDING #( plants MAPPING longer_desc = desc ).
cl_demo_output=>write( plants_longer ).
" Ohne CORRESPONDING müssen alle Felder aufgelistet werden, was viele sein können
" Aber Felder können konvertiert werden
DATA plants_longer2 TYPE tty_plants_longer.
plants_longer2 = VALUE #( FOR <x> IN plants
( werks = <x>-werks
longer_desc = enhance( <x>-desc ) ) ).
cl_demo_output=>write( plants_longer2 ).
* " Zusätzliches Klammernpaar fügt zusätzliche Zeile ein
* DATA plants_longer3 TYPE tty_plants_longer.
* plants_longer3 = VALUE #( FOR <x> IN plants
* ( CORRESPONDING #( <x> ) )
* ( longer_desc = enhance( <x>-desc ) ) ).
* cl_demo_output=>write( plants_longer3 ).
* " Im Mapping können Werte nicht verändert werden
* DATA plants_longer4 TYPE tty_plants_longer.
* plants_longer4 = VALUE #( FOR <x> IN plants
* ( CORRESPONDING #( <x> MAPPING longer_desc = enhance( desc ) ) ) ).
* cl_demo_output=>write( plants_longer4 ).
" Nur im LOOP kann ich es mir ersparen, evtl. hunderte Felder aufzulisten
DATA plants_longer5 TYPE tty_plants_longer.
DATA new_line TYPE ty_2.
LOOP AT plants ASSIGNING FIELD-SYMBOL(<line>).
new_line = CORRESPONDING #( <line> ).
new_line-longer_desc = enhance( <line>-desc ).
INSERT new_line INTO TABLE plants_longer5.
ENDLOOP.
cl_demo_output=>write( plants_longer5 ).
cl_demo_output=>display( ).
ENDMETHOD.
METHOD enhance.
r_result = |{ i_desc } in long|.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
lcl_report=>main( ).
Code: Alles auswählen.
DATA(longerPlants) = VALUE tty_plants_longer(
FOR plant IN plants
( VALUE #( BASE CORRESPONDING #( plant ) desc = enhance( plant-descending ) ) )
).
Weils Leute gibt, die das GEIL finden... Solche Experten hat bei uns auch, die bestehenden Code unbedingt von LOOP auf FOR umstellen müssen, damit alles in einer Anweisung steht. Mache ich inzwischen auch, damit es im Coding einheitlich bleibt und nicht nachträglich meine Coding immer umgeschrieben wird.
Ach, VALUE im FOR mit BASE CORRESPONDING, vielen Dank.LeMinion hat geschrieben: ↑02.05.2025 11:46Code: Alles auswählen.
DATA(longerPlants) = VALUE tty_plants_longer( FOR plant IN plants ( VALUE #( BASE CORRESPONDING #( plant ) desc = enhance( plant-descending ) ) ) ).
Weil ich damit viel prägnanter ausdrücken kann was passiert und damit für den Leser später leichter verständlich ist. Das mit einer Reihe Hilfsvariablen und LOOP zu bauen geht natürlich, dauert in dem Fall aber meiner Meinung nach länger in der Erfassung.
Code: Alles auswählen.
e_export = VALUE #( FOR <x> IN mat->get_itab( )
( value #( base corresponding #( <x> )
menge = zconverter=>to_string( CONV #( <x>-menge ) ) ) ) ).
Also bei den Aussagen "prägnanter Ausdrückbar", "für den Leser leichter verständlich" und "dauert länger in der Erfassung" (? Erfassung = Zeit das zu Coden ? ) und "Reihe von Hilfsvariablen" hätte ich noch Erklärungsbedarf.rob_abc hat geschrieben: ↑03.05.2025 08:25Weil ich damit viel prägnanter ausdrücken kann was passiert und damit für den Leser später leichter verständlich ist. Das mit einer Reihe Hilfsvariablen und LOOP zu bauen geht natürlich, dauert in dem Fall aber meiner Meinung nach länger in der Erfassung.Code: Alles auswählen.
e_export = VALUE #( FOR <x> IN mat->get_itab( ) ( value #( base corresponding #( <x> ) menge = zconverter=>to_string( CONV #( <x>-menge ) ) ) ) ).
Code: Alles auswählen.
loop at me->get_itab ASSIGNING FIELD-SYMBOL(<ls_itab>).
append value #( base corresponding #( <ls_itab> )
menge = zconverter=>to_string( CONV #( <ls_itab>-menge ) ) ) to e_export.
endloop.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
msfox
Recht hat er... Debuggen geht da einfacher, weil es ebenen mehrere Befehle sind und nicht in einem Schritt alles auf einmal stattfindet.black_adept hat geschrieben: ↑05.05.2025 10:32- "für den Leser leichter verständlich": Das ist einerseits sehr subjektiv - ich z.B. kann das mit dem LOOP schneller verinnerlichen als das FOR. Andererseits finde ich, dass ich in einem LOOP besser Breakpunkte verteilen kann wenn in <ls_itab> halt ein spezieller Wert drin steht der mir Probleme bereitet.
Ja genau zum Zeitpunkt der Entwicklung. Aber wehe dem, irgendwo ist ein Fehler drin und dieser soll gefunden werden. Dann muss gedanktlich das ganze FOR zerlegen, weil man es ja nicht debuggen kann.
Ich gebe zu, dass ich für sowas noch Kommentare verwende.rob_abc hat geschrieben: ↑05.05.2025 21:48Mit Erfassungszeit meine ich nicht die Zeit zum Schreiben, sondern die Zeit wie lange ich brauche, um dich Absicht des gelesenen Codings zu verstehen. Diese ist hier bei der FOR-Schleife geringer, da sofort klar ist, dass E_EXPORT einen neuen Inhalt erhält. Es ist das erste was dem Leser ins Auge springt: E_EXPORT = ...
Wenn mich die Details dazu nicht interessieren, kann ich über den Rest drüber hinweggehen und muss mich darum gar nicht kümmern, die in diesem Fall ja nur das Kopieren einer itab + ein paar Konvertierungen sind.