Code: Alles auswählen.
zielstruc = corresponding #( quellstruc mapping field1 = default switch #( lv_field1 when 'B' then 'B'
else 'P' ).
Das wäre mir im praktischen Betrieb auch schnell aufgefallen, weil es mir der Editor beim Compilieren nämlich um die Ohren gehauen hätte. 😁 Danach bleibt dann nur noch die bessere Lesbarkeit des Konstrukts für nach mir kommende Menschen (oder mich selber in einem halben Jahr).
Ich mag CORRESPONDING sehr gerne. Ich treffe immer wieder auf Fälle, in denen es sich plötzlich anbietet. Insbesondere das FILTER-Konstrukt ist ohne gleichzeitigen Einsatz von CORRESPONDING kaum zu gebrauchen, denn man will ja in aller Regel nicht in derselben Routine mit mehreren identisch typisierten internen Tabellen hantieren. Nehmen wir beispielsweise an, dass Du eine interne Tabelle hast, in der Du die ganzen Materialien mit dem zugehörigen Lagerort gepuffert hast (mit Schlüssel auf den Lagerort) und willst jetzt alle Materialien, die an einem bestimmten Lagerort liegen, in Deine ALV-Tabelle übernehmen, die Material uns zugehörigen Text enthält, dann könntest Du das z.B. so bewerkstelligen:Ich finde das Konstrukt aber an sich schlecht und verwende CORRESPONDING außerhalb von SELECTs recht selten.
Code: Alles auswählen.
TYPES: BEGIN OF puffer_lagerort_zeile,
lgort type lgort,
matnr type matnr,
END OF puffer_lagerort_zeile,
BEGIN OF alv_ausgabetabelle_zeile,
matnr type matnr,
maktx type maktx,
END OF alv_ausgabetabelle_zeile.
DATA: puffer_lagerort TYPE SORTED TABLE OF puffer_lagerort_zeile WITH NON-UNIQUE KEY lgort,
alv_ausgabetabelle TYPE STANDARD TABLE OF alv_ausgabetabelle_zeile WITH EMPTY KEY.
puffer_lagerort = alle_lagerorte_puffern( ). " enthält einfach einen passenden SELECT
* Zeilen für alle Materialnummern, die am Lagerort ABCD liegen, in der Ausgabetabelle anlegen
alv_ausgabetabelle[] = CORRESPONDING #( FILTER #( puffer_lagerort WHERE lgort = 'ABCD' ) ). " überträgt nur die Spalte MATNR, denn nur die gibt es in beiden Tabellen
ergaenze_textspalte( CHANGING alv_ausgabetabelle ). " Liest zu jeder Materialnummer den zugehörigen Text in die Spalte MAKTX
gib_alv_aus( alv_ausgabetabelle ).
Code: Alles auswählen.
data(lt_alv_data) = value ltty_alv_data(
for line in lt_lagerorte where (
id = 'ABCD'
" ... weitere where bedingungen ...
) (
materialbeschreibung = read_material( line-materialnr )-beschreibung
materialnr = line-materialnr
" ... fülle direkt weitere spalten ...
)
).
Genau so ist es. Da haben sich ja auch einige Leute in dem Beitrag dafür ausgesprochen. Die Argumentation, die tm987456 dort dagegen angeführt hat, finde ich sehr schräg, weil er im Prinzip argumentiert, dass er mit RETURNING mehr Möglichkeiten habe als mit CHANGING, ungeachtet des Umstands, dass man diese Möglichkeiten gar nicht braucht, wenn man CHANGING schreibt.Ralf hat geschrieben:Im verlinkten Beitrag steht schon richtig: Wenn eine Methode eine Variable ändert, nimmt man CHANGING, schon um genau das anzuzeigen.
Ich finde das eigentlich in bestimmten Situationen als recht nützlich. Beispiel: ABAP_BOOL Returning-Parameter um anzuzeigen ob etwas geklappt hat oder nicht und Exporting-Parameter BAPRET2_T, falls der Aufrufer sehen möchte was das Protokoll zu bieten hat. Das ermöglichtralf.wenzel hat geschrieben: ↑02.11.2024 10:46Richtig schräg (um nicht das andere Wort mit sch.... zu verwenden) finde ich Methoden (gibts auch von der SAP), die EXPORTING *und* RETURNING-Parameter haben.
Code: Alles auswählen.
IF NOT me->dosomething( EXPORTING ...
IMPORTING et_log = DATA(lt_log) ).
me->display_log( lt_log ).
ENDIF
CHANGING/EXPORTING sind FuBa-Relikte - TABLES hat man doch auch weggeworfen, warum diese beiden nicht gleich mit? Seltsam, dass man RETURNING in ABAP nicht erzwingt, wo doch dessen konsequente Durchsetzung zu besser wiederverwendbarem Code und einer sauberen Formatierung führen würde.DeathAndPain hat geschrieben: ↑02.11.2024 20:47Aber solange man einfach ein Feld ändern möchte und für eine über den konkreten Anwendungsfall hinaus gehende Flexibilität gar keine Verwendung hat, finde ich es abwegig, sich auf eine Syntax festzulegen.
Code: Alles auswählen.
class lcl_land definition.
public section.
data:
id type t005-land1,
sprache type t005-spras.
methods:
constructor importing iv_id type t005-land1.
endclass.
class lcl_land implementation.
method constructor.
select single land1 as id,
spras as sprache
into (@id, @sprache)
from t005
where land1 = @iv_id.
endmethod.
endclass.
class lcl_helper definition.
public section.
types:
ltty_t005 type standard table of t005 with empty key.
class-methods:
setze_landessprache importing io_land type ref to lcl_land
iv_sprache type t005-spras.
endclass.
class lcl_helper implementation.
method setze_landessprache.
io_land->sprache = iv_sprache. " shoot the coder
endmethod.
endclass.
start-of-selection.
data(lo_land) = new lcl_land( 'DE' ).
end-of-selection.
write:/ 'vorher: ', lo_land->sprache.
lcl_helper=>setze_landessprache(
io_land = lo_land
iv_sprache = 'E'
).
write:/ 'nachher: ', lo_land->sprache.
Du kommst aus der Java-Welt, wo alles über Objekte geht und man keine änderbaren Parameter in Modularisierungseinheiten verwendet, oder einer anderen, rein objektorientierten Sprache?tar hat geschrieben: ↑03.11.2024 01:23CHANGING/EXPORTING sind FuBa-Relikte - TABLES hat man doch auch weggeworfen, warum diese beiden nicht gleich mit? Seltsam, dass man RETURNING in ABAP nicht erzwingt, wo doch dessen konsequente Durchsetzung zu besser wiederverwendbarem Code und einer sauberen Formatierung führen würde.
Falls man mehrere Rückgabewerte benötigt, kann man das über eigene Typisierungen lösen und wundersamerweise gibt es im OO das Klassenkonzept.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain
Diese Meinung von Dir teile ich nicht.tar hat geschrieben:CHANGING/EXPORTING sind FuBa-Relikte
TABLES war überflüssig, weil die Feldtypen halt Tabellen sein können. Damit braucht man TABLES nicht mehr. (Das Kopfzeilenverhalten von TABLES hat die Sache nicht übersichtlicher gemacht, aber das war in meinen Augen nicht der ausschlaggebende Faktor.)tar hat geschrieben:TABLES hat man doch auch weggeworfen, warum diese beiden nicht gleich mit?
Code: Alles auswählen.
DATA(kundendatenstruktur) = kundendaten_ermitteln( kunnr = kundennummer
stichtag = p_datum )." Parameter aus Selektionsbild
Code: Alles auswählen.
DATA: begin of kundenanfragestruktur,
kunnr TYPE kunnr,
stichtag TYPE d,
end of of kundenanfragestruktur.
kundendatenstruktur = kundendaten_ermitteln( kundenanfragestruktur. ).
M.E. eben so wichtig ist, dass diese Parameter optional sein können und mittels "IS SUPPLIED" die Laufzeit beeinflussen können, wenn sie nicht angefordert werden. Außerdem ist ist es hier ein Einfaches eine generische Typisierung zu verwenden.DeathAndPain hat geschrieben: ↑04.11.2024 13:07CHANGING und EXPORTING hingegen sind nicht überflüssig. RETURNING VALUE() kann sie nicht zufriedenstellend ersetzen. und noch ein paar weitere richtige Anmerkungentar hat geschrieben:CHANGING/EXPORTING sind FuBa-Relikte
Keine Mensch hat gesagt, dass man nur einen Import-Parameter verwenden soll 🧐DeathAndPain hat geschrieben: ↑04.11.2024 13:07Nach meiner Erfahrung ist eine Parameteranzahl von zwei oder drei Parametern sogar der Regelfall. Wenn ich beispielsweise Kundendaten eines Kunden lesen möchte, dann brauche ich seine Kundennummer und den Stichtag, zu dem die Daten gelesen werden sollen. Die Daten, die ich zurückbekomme (Name des Kunden, Anschrift, Jahresumsatz mit mir usw.), sind dann durchaus eine semantische Einheit. Da könnte man dann gut eine Struktur für verwenden.
Folgende Benutzer bedankten sich beim Autor tar für den Beitrag:
ralf.wenzel