Code: Alles auswählen.
CLASS W DEFINITION ABSTRACT FINAL.
PUBLIC SECTION.
CLASS-METHODS COMPUTE_BASE_SALARY_FROM_IT8 IMPORTING IT8_DATA TYPE LINE_OF_BUFFER_0008
ONLY_RESPECT_THESE_WAGE_TYPES TYPE LGART_TAB OPTIONAL
EXPORTING BASE_SALARY TYPE PAD_AMT7S
WAGE_TYPE_WITH_HIGHEST_AMOUNT TYPE LGART.
ENDCLASS.
Und dazu die Implementierung:
METHOD COMPUTE_BASE_SALARY_FROM_IT8.
DATA: LOCAL_COPY_OF_IT8_DATA TYPE LINE_OF_BUFFER_0008,
LGA TYPE PA0008-LGA01,
BET TYPE PA0008-BET01,
OPK TYPE PA0008-OPK01,
HIGHEST_AMOUNT TYPE PA0008-BET01.
LOCAL_COPY_OF_IT8_DATA = IT8_DATA. " syntaktisch leider notwendig, um VARYING verwenden zu können
DO 5 TIMES VARYING LGA FROM LOCAL_COPY_OF_IT8_DATA-LGA01 NEXT LOCAL_COPY_OF_IT8_DATA-LGA02
VARYING BET FROM LOCAL_COPY_OF_IT8_DATA-BET01 NEXT LOCAL_COPY_OF_IT8_DATA-BET02
VARYING OPK FROM LOCAL_COPY_OF_IT8_DATA-OPK01 NEXT LOCAL_COPY_OF_IT8_DATA-OPK02.
CHECK LGA IS NOT INITIAL.
IF ONLY_RESPECT_THESE_WAGE_TYPES[] IS NOT INITIAL.
CHECK LINE_EXISTS( ONLY_RESPECT_THESE_WAGE_TYPES[ TABLE_LINE = LGA ] ).
ENDIF.
IF BET > HIGHEST_AMOUNT.
WAGE_TYPE_WITH_HIGHEST_AMOUNT = LGA.
HIGHEST_AMOUNT = BET.
ENDIF.
BASE_SALARY = SWITCH #( OPK WHEN SPACE THEN BASE_SALARY + BET
ELSE BASE_SALARY - BET ).
ENDDO.
ENDMETHOD.
Die Kosten für die Kopie einer grossen Tabelle sind in SAP zu vernachlässigen.a-dead-trousers hat geschrieben: ↑03.05.2023 18:19Macht in gewisser Hinsicht durchaus Sinn. Wenn man die "Kosten" für die Kopie einer großen Tabelle im Speicher bedenkt ist es sinnvoller nach Möglicheit mit dem "Original" zu arbeiten.
Das finde ich auch richtig so, wenn ich eine Methode aufrufe und davon einen EXPORTING-Parameter zurückbekomme, dass dieser im Falle einer Exception initial ist. Es ist eben kein CHANGING-Parameter; er sollte auf keinen Fall einen "alten" Wert enthalten.a-dead-trousers hat geschrieben: ↑03.05.2023 21:31Das würde aber den Parameter SOFORT und nur durch den Aufruf der Methode zurücksetzen. Auch wenn z.B. eine Exception ausgelöst wird und eigentlich keine sonstige Verarbeitung passiert ist.
Wie soll diese Wahl aussehen? Dass man angesichts der Exception gerne den Wert retten möchte, den man vorher in dem Feld hatte, das man (aus Aufrufersicht) als IMPORTING-Zielfeld angegeben hat? In meinen Augen ergibt das nicht den Hauch eines Sinnes. Wenn ich eine Methode rufe und ein Feld angebe, in das mir der Rückgabewert gestellt werden soll, dann sollte ich unter keinen Umständen ein Interesse daran haben, den Wert zu behalten, der vorher in diesem Feld gestanden hat.So hat man zumindest als Programmierer noch eine Wahl individuell zu reagieren.
Davon konnte ich in dem Link nichts lesen.rob_abc hat geschrieben: ↑04.05.2023 07:28Die Kosten für die Kopie einer grossen Tabelle sind in SAP zu vernachlässigen.
https://help.sap.com/doc/abapdocu_751_i ... tion_3.htm
Ich normalerweise auch. Aber wenn die Methode mehr als einen Wert zurückliefern soll, funktioniert das nicht. Es sei denn, Du willst Dir aufwendig einen Rückgabewertstrukturtyp definieren, der aus den Feldern besteht, die Du sonst per EXPORTING zurückliefern würdest. Das finde ich aber übertrieben, und es bringt in meinen Augen auch keine nennenswerten Vorteile. Im Gegenteil: Wenn Du im aufrufenden Programm die Werte in unterschiedlichen Feldern brauchst (was häufig der Fall ist), dann musst Du nach dem Methodenaufruf die Bestandteile der RETURNING-Struktur aufwendig in die Felder umkopieren, in denen Du sie in Wahrheit haben möchtest. Es macht auch das Programm eher schlechter als besser lesbar, wenn Du solch einen Pseudotyp als Wasserkopf einführst, anstatt in der IMPORTING-Klausel des Aufrufers die Rückgabewerte gut nachlesbar in die Felder zu verteilen, in denen Du sie tatsächlich haben möchtest.
Ja, aber das ist doch eine Krücke, dass ABAP nicht von sich aus "reliable" Werte im Exporting-Parameter liefert. Und "reliable" heißt für mich bei einem in der Methode als "EXPORTING" deklarierten Parameter, dass genau das drinsteht, was die Methode reinfüllt und demnach auch nichts drinsteht, wenn sie nichts reinfüllt.fr-g hat geschrieben:Im ersten Moment dachte ich, das steht doch explizit in der Doku. Hab mich falsch erinnert, es steht im Styleguide :)
https://github.com/SAP/styleguides/blob ... parameters
Nur weil deine Erwartung eine andere ist, ist sie deswegen nicht richtig. Zumal dein Performance-Argument absolut falsch ist. OO ist in keinem Stück Laufzeit intensiver.DeathAndPain hat geschrieben: ↑03.05.2023 19:53Das mit der Referenz habe ich schon verstanden und sehe auch den Sinn. Aber dennoch müsste trotzdem ein impliziter CLEAR durch den EXPORTING-Parameter verursacht werden. Der kostet nicht nennenswert Rechenzeit; da ist das ganze OO-Geraffel viel laufzeitintensiver (und die SAP leistet sich das trotzdem, weil gut strukturierter Code heutzutage mehr wert ist als schneller (auch wenn ich meine eigene Meinung zu der Frage habe, ob ABAP OO zu besser strukturiertem Code geführt hat)).
EXPORTING mit Referenz und impliziter CLEAR als Unterschied zu CHANGING, das wäre hier in meinen Augen der offensichtliche Königsweg und auch das, was man von der Logik her erwartet hätte.
Das ist grundsätzlich dennoch falsch und wirkt sich nicht bei 1-mal Operationen aus. Wenn du mal Anwendungen im Massenbereich schreibst, merkst du das sehr wohl.rob_abc hat geschrieben: ↑04.05.2023 07:28Die Kosten für die Kopie einer grossen Tabelle sind in SAP zu vernachlässigen.a-dead-trousers hat geschrieben: ↑03.05.2023 18:19Macht in gewisser Hinsicht durchaus Sinn. Wenn man die "Kosten" für die Kopie einer großen Tabelle im Speicher bedenkt ist es sinnvoller nach Möglicheit mit dem "Original" zu arbeiten.
https://help.sap.com/doc/abapdocu_751_i ... tion_3.htm
Laut 947096 gibt es table sharing bereits seit Release 610.
Ich verwende daher immer returning und nicht exporting.
Beim klassischen Report nicht. Bei wirklichen Massendaten schon. Returning sollte daher dennoch immer nur verwendet werden, wenn das Ergebnis dem klassischen VAT entspricht. Validierung, Anreicherung, Transformation. Es ist wie bei Microsoft. Anstatt anständig zu programmieren, nötig man dem Anwender den Kauf von leistungsfähigerer Hardware auf :)fr-g hat geschrieben: ↑04.05.2023 08:08Im ersten Moment dachte ich, das steht doch explizit in der Doku. Hab mich falsch erinnert, es steht im Styleguide :)
https://github.com/SAP/styleguides/blob ... parameters
Davon abgesehen, würde ich aber auch RETURNING bevorzugen und habe praktisch keine Anwendungsfälle mehr für EXPORTING:
https://github.com/SAP/styleguides/blob ... -exporting
Nun aus deiner Sicht gibt es keinen Sinn. Weil Du bei Exceptions die Resumable Option vergisst, auch wenn diese seltener genutzt wird. Es macht absolut Sinn das der alte Wert exakt so bleibt. Ich führe eine Option mit Fehler aus, catche den Fehler und setze die Ausführung fort. Das würde keinen Sinn machen, wenn mein Wert auf einmal weg wäre. RETURNING Parameter werden in diesem Szenario logischerweise in jedem Fall gecleart.DeathAndPain hat geschrieben: ↑08.05.2023 21:32Das finde ich auch richtig so, wenn ich eine Methode aufrufe und davon einen EXPORTING-Parameter zurückbekomme, dass dieser im Falle einer Exception initial ist. Es ist eben kein CHANGING-Parameter; er sollte auf keinen Fall einen "alten" Wert enthalten.a-dead-trousers hat geschrieben: ↑03.05.2023 21:31Das würde aber den Parameter SOFORT und nur durch den Aufruf der Methode zurücksetzen. Auch wenn z.B. eine Exception ausgelöst wird und eigentlich keine sonstige Verarbeitung passiert ist.
Wie soll diese Wahl aussehen? Dass man angesichts der Exception gerne den Wert retten möchte, den man vorher in dem Feld hatte, das man (aus Aufrufersicht) als IMPORTING-Zielfeld angegeben hat? In meinen Augen ergibt das nicht den Hauch eines Sinnes. Wenn ich eine Methode rufe und ein Feld angebe, in das mir der Rückgabewert gestellt werden soll, dann sollte ich unter keinen Umständen ein Interesse daran haben, den Wert zu behalten, der vorher in diesem Feld gestanden hat.So hat man zumindest als Programmierer noch eine Wahl individuell zu reagieren.
Davon konnte ich in dem Link nichts lesen.rob_abc hat geschrieben: ↑04.05.2023 07:28Die Kosten für die Kopie einer grossen Tabelle sind in SAP zu vernachlässigen.
https://help.sap.com/doc/abapdocu_751_i ... tion_3.htm
Ich normalerweise auch. Aber wenn die Methode mehr als einen Wert zurückliefern soll, funktioniert das nicht. Es sei denn, Du willst Dir aufwendig einen Rückgabewertstrukturtyp definieren, der aus den Feldern besteht, die Du sonst per EXPORTING zurückliefern würdest. Das finde ich aber übertrieben, und es bringt in meinen Augen auch keine nennenswerten Vorteile. Im Gegenteil: Wenn Du im aufrufenden Programm die Werte in unterschiedlichen Feldern brauchst (was häufig der Fall ist), dann musst Du nach dem Methodenaufruf die Bestandteile der RETURNING-Struktur aufwendig in die Felder umkopieren, in denen Du sie in Wahrheit haben möchtest. Es macht auch das Programm eher schlechter als besser lesbar, wenn Du solch einen Pseudotyp als Wasserkopf einführst, anstatt in der IMPORTING-Klausel des Aufrufers die Rückgabewerte gut nachlesbar in die Felder zu verteilen, in denen Du sie tatsächlich haben möchtest.
Ja, aber das ist doch eine Krücke, dass ABAP nicht von sich aus "reliable" Werte im Exporting-Parameter liefert. Und "reliable" heißt für mich bei einem in der Methode als "EXPORTING" deklarierten Parameter, dass genau das drinsteht, was die Methode reinfüllt und demnach auch nichts drinsteht, wenn sie nichts reinfüllt.fr-g hat geschrieben:Im ersten Moment dachte ich, das steht doch explizit in der Doku. Hab mich falsch erinnert, es steht im Styleguide :)
https://github.com/SAP/styleguides/blob ... parameters
DeathAndPain hat geschrieben: ↑08.05.2023 21:32Sorry, aber was ist das noch für ein Unsinn ? Von CORRESPONDING #( ... mapping b = c ) hast Du anscheinend noch nichts gehört.a-dead-trousers hat geschrieben: ↑03.05.2023 21:31Ich normalerweise auch. Aber wenn die Methode mehr als einen Wert zurückliefern soll, funktioniert das nicht. Es sei denn, Du willst Dir aufwendig einen Rückgabewertstrukturtyp definieren, der aus den Feldern besteht, die Du sonst per EXPORTING zurückliefern würdest. Das finde ich aber übertrieben, und es bringt in meinen Augen auch keine nennenswerten Vorteile. Im Gegenteil: Wenn Du im aufrufenden Programm die Werte in unterschiedlichen Feldern brauchst (was häufig der Fall ist), dann musst Du nach dem Methodenaufruf die Bestandteile der RETURNING-Struktur aufwendig in die Felder umkopieren, in denen Du sie in Wahrheit haben möchtest. Es macht auch das Programm eher schlechter als besser lesbar, wenn Du solch einen Pseudotyp als Wasserkopf einführst, anstatt in der IMPORTING-Klausel des Aufrufers die Rückgabewerte gut nachlesbar in die Felder zu verteilen, in denen Du sie tatsächlich haben möchtest.
Wenn tatsächlich mal gemappt werden muss, ist das für den Programmierer sogar klar ersichtlich. SAP hat in manchen Tabellen so einen Fehler im Datenhaushalt. Z.b. heisst es mal IDOCTP und mal IDOCTYP. Aber wenigstens kann man das jetzt in einer Codezeile lösen. Wer noch 7.31 einsetzt hält nichts von Effizienz.
In eine Importing Klausel gehört nicht was für die Rückgabe relevant ist. Es gehört da nur rein was für die Ausführung der Methode tatsächlich nötig ist, wenn man SoC folgt muss man für viele Fubas von SAP mehrere Methoden schreiben. Denn FuBas verstossen gegen das Cleancode Prinzip und gegen OO. Die Rückgabe einer Methode kann dagegen naturgemäß völlig beliebig sein.