Dynamische Methodenschnittstelle

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Dynamische Methodenschnittstelle

Beitrag von mareikemei92 (ForumUser / 49 / 19 / 0 ) »
Hallo ABAP-Cracks,

Ich hoffe, ihr könnt mir bei diesem Problem im Bereich OO helfen. Mein Anwendungsfall ist folgender:

Ich habe eine Superklasse, die von mehreren Unterklassen geerbt wird, in denen jeweils ein ALV-Grid zusammengebastelt wird. In jeder Unterklasse sieht die Struktur für das ALV-Grid anders aus. Nun habe ich in dieser Superklasse Methoden, die Werte auf Basis der Zeile des ALV-Grids berechnen und denen ich gerne in der Schnittstelle die aktuelle ALV-Grid-Zeile als CHANGING-Parameter übergeben möchte. Gibt es eine Möglichkeit diesen CHANGING-Parameter dynamisch zu gestalten? Das heißt, je nachdem aus welcher Unterklasse die Methode der Oberklasse aufgerufen wird, sieht die Schnittstelle zur Methode anders aus?

Klar, könnte ich jedes Feld, das ich zur Berechnung brauche, einzeln als Parameter übergeben und die berechneten Felder einzeln zurückgeben. Aber vielleicht gibt es ja eine ganz einfache Möglichkeit und ich kenne sie nur noch nicht :)

Randinfo: Unser Basis-Release ist momentan noch auf Stand 7.01, daher sind so schicke Spielereien wie Inline-Deklaration nicht möglich :(

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Dynamische Methodenschnittstelle

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Suchst du „TYPE ANY“?
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dynamische Methodenschnittstelle

Beitrag von a-dead-trousers (Top Expert / 4403 / 224 / 1183 ) »
mareikemei92 hat geschrieben:Klar, könnte ich jedes Feld, das ich zur Berechnung brauche, einzeln als Parameter übergeben und die berechneten Felder einzeln zurückgeben. Aber vielleicht gibt es ja eine ganz einfache Möglichkeit und ich kenne sie nur noch nicht :)
Ich verwende hierfür gerne Substrukturen mit Aliasnamen.
Man fasst alle Felder, die man in den Schnittstellen braucht, in eigene Strukturen zusammen und bindet diese dann anstatt der EInzelfelder als .INCLUDE in die Strukturen des ALV-Grids ein. Den eingebundenen Includes werden Alias-Namen gegeben und diese können dann beim Schnittstellen-Aufruf verwendet werden:

Code: Alles auswählen.

TYPES:
  BEGIN OF ts_interface,
    param1 TYPE char1,
    param2 TYPE char2,
  END OF ts_interface.
TYPES:
  BEGIN OF ts_grid01,
    field01 TYPE char10.
    INCLUDE TYPE ts_interface AS interface01.
TYPES END OF ts_grid01.
TYPES:
  BEGIN OF ts_grid02,
    field02 TYPE char20.
    INCLUDE TYPE ts_interface AS interface01.
TYPES END OF ts_grid02.

FORM fill_interface CHANGING cs_interface TYPE ts_interface.
  IF cs_interface-param1 EQ 'X'.
    cs_interface-param2 = 'XX'.
  ENDIF.
ENDFORM.

...

DATA:
  ls_grid01 TYPE ts_grid01,
  ls_grid02 TYPE ts_grid02.

ls_grid01-field1 = 'Hier passiert was'.
ls_grid01-param1 = 'X'.
PERFORM fill_interface CHANGING ls_grid01-interface01. "param2 = 'XX'

ls_grid02-field2 = 'Hier passiert nix'.
PERFORM fill_interface01 CHANGING ls_grid02-interface. "param2 = '  '
Der Einfachheit halber mit Forms, weil dass schneller zu Tippen geht :wink:

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
mareikemei92

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Dynamische Methodenschnittstelle

Beitrag von mareikemei92 (ForumUser / 49 / 19 / 0 ) »
a-dead-trousers hat geschrieben:
mareikemei92 hat geschrieben:Klar, könnte ich jedes Feld, das ich zur Berechnung brauche, einzeln als Parameter übergeben und die berechneten Felder einzeln zurückgeben. Aber vielleicht gibt es ja eine ganz einfache Möglichkeit und ich kenne sie nur noch nicht :)
Ich verwende hierfür gerne Substrukturen mit Aliasnamen.
Man fasst alle Felder, die man in den Schnittstellen braucht, in eigene Strukturen zusammen und bindet diese dann anstatt der EInzelfelder als .INCLUDE in die Strukturen des ALV-Grids ein. Den eingebundenen Includes werden Alias-Namen gegeben und diese können dann beim Schnittstellen-Aufruf verwendet werden:

Code: Alles auswählen.

TYPES:
  BEGIN OF ts_interface,
    param1 TYPE char1,
    param2 TYPE char2,
  END OF ts_interface.
TYPES:
  BEGIN OF ts_grid01,
    field01 TYPE char10.
    INCLUDE TYPE ts_interface AS interface01.
TYPES END OF ts_grid01.
TYPES:
  BEGIN OF ts_grid02,
    field02 TYPE char20.
    INCLUDE TYPE ts_interface AS interface01.
TYPES END OF ts_grid02.

FORM fill_interface CHANGING cs_interface TYPE ts_interface.
  IF cs_interface-param1 EQ 'X'.
    cs_interface-param2 = 'XX'.
  ENDIF.
ENDFORM.

...

DATA:
  ls_grid01 TYPE ts_grid01,
  ls_grid02 TYPE ts_grid02.

ls_grid01-field1 = 'Hier passiert was'.
ls_grid01-param1 = 'X'.
PERFORM fill_interface CHANGING ls_grid01-interface01. "param2 = 'XX'

ls_grid02-field2 = 'Hier passiert nix'.
PERFORM fill_interface01 CHANGING ls_grid02-interface. "param2 = '  '
Der Einfachheit halber mit Forms, weil dass schneller zu Tippen geht :wink:
Das klingt machbar, werde ich mal ausprobieren :)
black_adept hat geschrieben:Suchst du „TYPE ANY“?
Ich hatte die Schnittstelle als "TYPE ANY" deklariert, aber dann kam schon in der Methode selbst ein Syntaxfehler, wenn ich auf ein Feld der Struktur zugreifen wollte.

Re: Dynamische Methodenschnittstelle

Beitrag von black_adept (Top Expert / 4102 / 128 / 945 ) »
Wenn dir a-d-ts Weg zu kompliziert ist oder du an den Strukturen nicht groß rumfummeln darfst:

Code: Alles auswählen.

DATA: BEGIN OF ls_known_fields,
        known_field_1 type matnr,
        known_field_2 type vkorg,
        known_field_3 type abap_bool,
      END OF ls_known_fields.
MOVE-CORRESPONDING cs_data TO ls_known_fields.
* Hier kannst du jetzt auf deine Felder zugreifen mit Namen
IF ls_known_field-known_field_1 = 'MATNR1'.
  ls_known_field-known_field_2 = 'HUGO'.
  ls_known_field-known_field_3 =abap_true.
ENDIF.
MOVE-CORRESPONDING ls_known_fields to cs_data

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
mareikemei92

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dynamische Methodenschnittstelle

Beitrag von mareikemei92 (ForumUser / 49 / 19 / 0 ) »
black_adept hat geschrieben:Wenn dir a-d-ts Weg zu kompliziert ist oder du an den Strukturen nicht groß rumfummeln darfst:

Code: Alles auswählen.

DATA: BEGIN OF ls_known_fields,
        known_field_1 type matnr,
        known_field_2 type vkorg,
        known_field_3 type abap_bool,
      END OF ls_known_fields.
MOVE-CORRESPONDING cs_data TO ls_known_fields.
* Hier kannst du jetzt auf deine Felder zugreifen mit Namen
IF ls_known_field-known_field_1 = 'MATNR1'.
  ls_known_field-known_field_2 = 'HUGO'.
  ls_known_field-known_field_3 =abap_true.
ENDIF.
MOVE-CORRESPONDING ls_known_fields to cs_data
Die Strukturen sind alle im eigenen Namensraum, also das ist nicht das Problem. Ich möchte die Methode zentral halten, um bei Änderungen nur eine Methode anpassen zu müssen und nicht wie im Moment fünf (die alle das gleiche machen).
Die Klassenstruktur ist ein altes Reliqium eines Vorgängers von mir und da ich keine Zeit habe, es komplett neu zu modellieren, fange ich halt zumindest an kleinen Stellen an :)

Seite 1 von 1

Vergleichbare Themen

3
Antw.
2211
Views
Dynamische SQL
von Gabriel99 » 22.06.2015 17:59 • Verfasst in ABAP® für Anfänger
6
Antw.
4118
Views
Dynamische Spalten
von hmaxi96 » 16.11.2015 10:03 • Verfasst in ABAP® für Anfänger
0
Antw.
1129
Views
Dynamische Variablennamen?
von mbecker » 23.03.2009 12:16 • Verfasst in ABAP® für Anfänger
6
Antw.
6519
Views
Dynamische Typisierung?
von cortex » 18.03.2014 09:10 • Verfasst in ABAP Objects®
8
Antw.
4125
Views
Dynamische Listausgabe
von GERDLA » 15.11.2005 09:15 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.