Dynamischer Methodenaufruf mit dynamischer Tabelle

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

Dynamischer Methodenaufruf mit dynamischer Tabelle

Beitrag von Tommy Nightmare (ForumUser / 28 / 5 / 1 ) »
Hallo,

ich habe mehrere Methoden, die jeweils eine Tabelle zurückgeben.
Jede Methode gibt eine andere Tabelle zurück.

Das möchte ich dynamisch machen und generiere deswegen eine passende Tabelle für den Rückgabewert zur Laufzeit.
Der dynamische Methodenaufruf löst aber immer eine Ausnahme aus der Klasse cx_sy_dyn_call_error aus.
Hier ein Beispiel Quelltext:

Code: Alles auswählen.

DATA:
  obj_data TYPE REF TO data,
  obj_table TYPE REF TO cl_abap_tabledescr,
  lr_struc TYPE REF TO cl_abap_structdescr,
  lt_parameters TYPE abap_parmbind_tab,
  l_meth TYPE string VALUE 'GET_MARA'.

FIELD-SYMBOLS <tab> TYPE table.

* itab generieren
lr_struc ?= cl_abap_structdescr=>describe_by_name( 'mara' ).
obj_table ?= cl_abap_tabledescr=>create( lr_struc ).
CREATE DATA obj_data TYPE HANDLE obj_table.
ASSIGN obj_data->* TO <tab>.

* Parameter für dynamischen Methodenaufruf definieren
 lt_parameters = VALUE #( name  = 'R_TAB' 
                         kind  = cl_abap_objectdescr=>receiving
                         value = REF #( <tab> ) ).

      TRY.
* Aufruf einer Beispielmethode get_mara, die eine Tabelle R_TAB vom Typ mara zurückgibt
          CALL METHOD zclass=>(l_meth) PARAMETER-TABLE lt_parameters.
        CATCH cx_sy_dyn_call_error.
      ENDTRY.
Die Fehlermeldung ist DYN_CALL_METH_PARAM_TYPE .
Anscheinend kann er mit der dynamischen Tabelle nichts anfangen.

Hat jemand eine Idee, wie ich das hinbekomme?

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


Re: Dynamischer Methodenaufruf mit dynamischer Tabelle

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Wahrscheinlich ist der Parameter R_TAB deinre Methode Z_CLASS=>GET_MARA kein Returning-Parameter.
Ach ja - und ich wundere mich, dass deine Variable lt_parameters gefüllt wird - da fehlt doch noch ein Satz Klammern, damit eine Zeile eingefügt wird.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dynamischer Methodenaufruf mit dynamischer Tabelle

Beitrag von Tommy Nightmare (ForumUser / 28 / 5 / 1 ) »
Doch, er ist ein Returning Parameter. Ich habe ihn auch mal als Exporting Parameter getestet, bring aber nichts.
Der Code aus dem ersten Beitrag war nur als Beispiel gedacht, hier nochmal:

(Globale Klasse, aufgerufen wird die Methode main)

Code: Alles auswählen.

CLASS zclass DEFINITION
  PUBLIC
  FINAL
  CREATE PUBLIC .

  PUBLIC SECTION.

    CLASS-METHODS main
      IMPORTING
        !i_matnr TYPE matnr .

  PRIVATE SECTION.

    CLASS-METHODS get_mara
      IMPORTING
        !i_matnr              TYPE matnr
      RETURNING
        VALUE(r_tab) TYPE zmara_t . "Tabellentyp mara (Standardtabelle, default key)

    CLASS-METHODS create_itab
      IMPORTING
        !i_strucname        TYPE string
      RETURNING
        VALUE(r_tabledescr) TYPE REF TO cl_abap_tabledescr .
ENDCLASS.


CLASS zclass IMPLEMENTATION.

  METHOD main.

    DATA:
      obj_table             TYPE REF TO cl_abap_tabledescr, "Beschreibung einer Tabelle
      obj_data              TYPE REF TO data,                      "Zum kreieren einer internen Tabelle
      lt_parameters       TYPE abap_parmbind_tab,           "Übergabeparameter für Methode
      lt_abap_parmbind TYPE TABLE OF abap_parmbind,  "Tabelle Übergabeparameter
      ls_abap_parmbind TYPE abap_parmbind,                 "Struktur Übergabeparameter
      l_method                TYPE string VALUE 'GET_MARA'.  

    FIELD-SYMBOLS:
      <tab> TYPE table.

* itab generieren
      obj_table = create_itab( 'MARA' ).
      CREATE DATA obj_data TYPE HANDLE obj_table.
      ASSIGN obj_data->* TO <tab>.

** Importparameter definieren
        ls_abap_parmbind-name = 'I_MATNR'.
        GET REFERENCE OF i_matnr INTO ls_abap_parmbind-value.
        ls_abap_parmbind-kind = cl_abap_objectdescr=>exporting.
        APPEND ls_abap_parmbind TO lt_abap_parmbind.

** Returning Parameter definieren
      ls_abap_parmbind-name = 'R_TAB'.
      ls_abap_parmbind-kind = cl_abap_objectdescr=>receiving.
      GET REFERENCE OF <tab> INTO ls_abap_parmbind-value.
      APPEND ls_abap_parmbind TO lt_abap_parmbind.

* Angegebene Methode aufrufen
      TRY.
          lt_parameters = lt_abap_parmbind.
          CALL METHOD zclass=>(l_method) PARAMETER-TABLE lt_parameters.
        CATCH cx_sy_dyn_call_error INTO DATA(lo_sy_dyn_call_error).
          MESSAGE lo_sy_dyn_call_error->kernel_errid TYPE 'E'.
      ENDTRY.

  ENDMETHOD.


  METHOD create_itab. "Eine interne Tabelle vom Typ des übergebenen Tabellennamens erstellen

    DATA:
      lr_struc TYPE REF TO cl_abap_structdescr.

    lr_struc ?= cl_abap_structdescr=>describe_by_name( i_strucname ).

    r_tabledescr ?= cl_abap_tabledescr=>create( lr_struc ).

  ENDMETHOD.


  METHOD get_mara. 

    SELECT *
      FROM mara
      INTO TABLE r_tab
     WHERE matnr = i_matnr.

  ENDMETHOD.


ENDCLASS.
Da sind natürlich noch ein Haufen mehr Methoden und Tabellen, sodass der dynamische Aufruf auch Sinn macht.
Habe aber die anderen Methoden und die Loops rausgenommen, weil die ja nichts mit dem Problem an sich zu tun haben.

LG Tommy
Zuletzt geändert von Tommy Nightmare am 11.09.2017 15:28, insgesamt 2-mal geändert.

Re: Dynamischer Methodenaufruf mit dynamischer Tabelle

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Da sind aber einige Macken drin.
  • Du hast 2x die Methode MAIN definiert ( 1x public, 1x private )
  • Der Rückgabeparameter der Methode get_mara hat den Namen r_tab aber im Coding füllst du einen Parameter rt_mara
  • Der Type ZMARA_T ist nicht definiert ( aber der könnte bei euch im DDIC vorhanden sein )
Wenn man das alles korrigiert funktioniert das auch.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dynamischer Methodenaufruf mit dynamischer Tabelle

Beitrag von Tommy Nightmare (ForumUser / 28 / 5 / 1 ) »
Ups ;)

Der Fehler kam beim kopieren, hab ich geändert.
Und ja, e sgibt einen DDIC Typen für eine Standardtabelle vom Typ mara

Re: Dynamischer Methodenaufruf mit dynamischer Tabelle

Beitrag von Tommy Nightmare (ForumUser / 28 / 5 / 1 ) »
OK hab den Fehler gefunden. Das Programm soll ein IDoc erzeugen und ich hatte mich in der Parametertabelle auf die Segmente und nicht auf die Strukturen bezogen

Seite 1 von 1

Vergleichbare Themen

2
Antw.
1561
Views
Dynamischer Methodenaufruf mit dynamischer Tabelle
von mark.thk » 12.12.2018 10:34 • Verfasst in ABAP Objects®
4
Antw.
19487
Views
Dynamischer Methodenaufruf
von Cola » 20.08.2009 14:55 • Verfasst in ABAP Objects®
11
Antw.
1321
Views
Dynamischer Methodenaufruf (Teil 327)
von Icke0801 » 30.04.2022 08:28 • Verfasst in ABAP Objects®
6
Antw.
2868
Views
Ist ein dynamischer Methodenaufruf möglich?
von Michael.Nett » 14.11.2005 15:21 • Verfasst in ABAP® Core
2
Antw.
2380
Views
Dynamischer Methodenaufruf: Methode nicht gefunden
von ralf.wenzel » 08.09.2014 18:20 • Verfasst in ABAP Objects®

Ü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.