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 / 18 / 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 / 3950 / 105 / 886 ) »
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 / 4287 / 214 / 1142 ) »
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 / 18 / 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 / 3950 / 105 / 886 ) »
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 / 18 / 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.
1834
Views
Dynamische SQL
von Gabriel99 » 22.06.2015 17:59 • Verfasst in ABAP® für Anfänger
1
Antw.
1195
Views
dynamische Tabellen
von Kaiwalker » 15.06.2005 10:28 • Verfasst in ABAP® Core
2
Antw.
2714
Views
Dynamische GUI-Elemente
von SAPinator » 08.07.2010 15:46 • Verfasst in Dialogprogrammierung
8
Antw.
3672
Views
dynamische Tabellen
von juli » 11.08.2005 14:31 • Verfasst in ABAP® für Anfänger
2
Antw.
1943
Views
Dynamische Methode
von quatschi » 21.12.2009 14:09 • Verfasst in ABAP® für Anfänger

Ü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

Aktuelle Forenbeiträge

Updates der Daten, Fehlermeldung
vor 2 Tagen von Egzon gelöst 1 / 65
Wie benutze ich COMMIT WORK richtig
vor 4 Tagen von msfox 17 / 460

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.

Aktuelle Forenbeiträge

Updates der Daten, Fehlermeldung
vor 2 Tagen von Egzon gelöst 1 / 65
Wie benutze ich COMMIT WORK richtig
vor 4 Tagen von msfox 17 / 460

Unbeantwortete Forenbeiträge

Updates der Daten, Fehlermeldung
vor 2 Tagen von Egzon 1 / 65
Zwischensumme Adobe Forms
letzen Monat von Lucyalison 1 / 271
Group Items auf einer Filterbar
letzen Monat von Bright4.5 1 / 324