Ist ein dynamischer Methodenaufruf möglich?

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Ist ein dynamischer Methodenaufruf möglich?

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
Hallo Community,

ich versuche mal, mein Anliegen zu erklären.

Voraussetzung:
Ich hab ein Dynpro erstellt und mit Hilfe des Screen-Painters drei Container angelegt. In diese Container sollten drei TextEdit-Controls angelegt werden.

Code: Alles auswählen.

DATA: container TYPE REF TO cl_gui_custom_container,
      editor1   TYPE REF TO cl_gui_textedit,
      editor2   TYPE REF TO cl_gui_textedit,
      editor3   TYPE REF TO cl_gui_textedit.

CREATE OBJECT: container EXPORTING container_name = 'DYNPRO_CONTAINER',
               editor1   EXPORTING parent = container.

CREATE OBJECT: container EXPORTING
               container_name = 'DYNPRO_CONTAINER_2',
               editor2   EXPORTING parent = container.

CREATE OBJECT: container EXPORTING
               container_name = 'DYNPRO_CONTAINER_3',
               editor3   EXPORTING parent = container.
Jetzt habe ich ein Unterprogramm erstellt, welches prüfen soll, ob sich ein TextEdit-Control vom Inhalt her verändert hat.

Ich übergebe Ihm ein Objekt und bekomme den Wert 1 (true) oder 0 (false) zurück.

Code: Alles auswählen.

FORM pruefe_textedit USING name_editor TYPE REF TO cl_gui_textedit CHANGING is_modified TYPE i.

  CALL METHOD name_editor->get_textmodified_status
    IMPORTING
      status = is_modified
    EXCEPTIONS
      OTHERS = 1.
  IF sy-subrc <> 0.
    RAISE error_cntl_call_method.
  ENDIF.


ENDFORM.                    " pruefe_textedit
Ich rufe das Unterprogramm folgendermaßen auf:

Code: Alles auswählen.

      PERFORM PRUEFE_TEXTEDIT
                  USING
                     EDITOR1
                  CHANGING
                     IS_MODIFIED.

      IF is_modified EQ 1.
        tmp = 'X'.
      ENDIF.
Das funktioniert wunderbar. Später frag ich die Variable tmp ab, ob sich etwas geändert hat und zeige dann ggf. das Speicher-Dialog an.

Das ganze muss ich aber für jedes Textfeld machen und da kam mir die sensationelle Idee, dies dynamisch zu machen. Ich sehe ein, für drei Textfelder ist das nicht wirklich sinnvoll, aber es interessiert mich halt.

Jetzt hab ich meinen Quelltext modifiziert und zwar, das ich mir in einer Schleife den Objektname "backe":

Code: Alles auswählen.

      DATA: tmp TYPE c VALUE ' '.
      DATA: textobjekt(6) type c VALUE 'EDITOR'.
      DATA: tmpobjekt(8) TYPE c. 
      DATA: zaehler TYPE c.

      DO 3 TIMES. "derzeit 3 Textfelder

        ADD 1 TO zaehler.

        CONCATENATE textobjekt zaehler INTO tmpobjekt. 

        PERFORM PRUEFE_TEXTEDIT
                USING
                   tmpobjekt
                CHANGING
                   IS_MODIFIED.

        IF is_modified EQ 1.
          tmp = 'X'.
        ENDIF.

      ENDDO.
Mein Unterprogramm hab ich folgendermaßen modifiziert:

Code: Alles auswählen.

FORM pruefe_textedit USING name_editor
CHANGING is_modified TYPE i.

  DATA: name_editor_class TYPE REF TO cl_gui_textedit.

  MOVE name_editor TO name_editor_class.

*  field-symbols: <text> type ref to cl_gui_textedit,
*                 <editor> type any.

*  assign name_editor to <editor>.
*  assign <editor> to <text>.

*  CALL METHOD <text>->get_textmodified_status
   CALL METHOD name_editor_class->get_textmodified_status
    IMPORTING
      status = is_modified
    EXCEPTIONS
      OTHERS = 1.
  IF sy-subrc <> 0.
    RAISE error_cntl_call_method.
  ENDIF.
ENDFORM.                    " pruefe_textedit
Soviel zur Theorie, klappt natürlich nicht. Wie vielleicht ersichtlich, habe ich auch mehrere Möglichkeiten durchprobiert (daher das "gewusel" an Kommentaren).

Gibt es irgendeine Möglichkeit die Variable tmpobjekt in ein "richtiges" Objekt zu konvertieren?

Wie kann ich mein Vorhaben evtl. anderes lösen und geht sowas überhaupt?

Über eine kleine Hilfe wäre ich sehr erfreut.

Mit freundlichem Gruß

Michael

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


Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Mal ein kleiner workaround:)

speicher die 3 editorobjekte in eine Tabelle und loop über die tabelle und übergebe immer die aktuelle zeile an die Form:)

Oder du rufst die Form die du zuerst hattest auf:

perform blabla using (objektname) changing blub

könnte auch funktionieren.

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
Hallo Flo,

danke für die Antwort, aber entweder wir reden aneinander vorbei, oder ich bin zu blöd Deinen Workaround zu verstehen.

Das Problem besteht darin, das ich mir die Objektnamen in einer Schleife aus Präfix (in diesem Fall 'editor') und einem Schleifen-Zähler mittels CONCATENATE zusammensetze.

//Edit: Wenn ich tmpobjekt mit REF TO cl_gui_textedit deklariere, kann ich leider (Typen unverträglich) nicht mit CONCATENATE den Objektnamen zusammensetzen.

Jetzt hab ich den Objektnamen aber nicht das Objekt (ich denke, da liegt der Hund begraben).

Wenn ich mir die Objektnamen in eine Tabelle sichere, hab ich wiederum nur die Namen, aber nicht die eigentlichen Objekte.

Oh, hab gerade Dein Edit gesehen, aber das hilft mir auch nicht wirklich weiter (oder halt, ich versteh es nicht).

Meine FORM erwartet ein Objekt und ich übergebe Ihm einen Objektnamen (der identisch mit dem Objekt ist), aber schmecken tuts dem Interpreter leider nicht. Wenn ich Ihm das Objekt übergebe (also nicht den zusammengewürfelten Namen), funktioniert auch alles.

Also, ich habe den Objektname, aber ich müsste das eigentliche Objekt übergeben.

Nur, wie löse ich sowas?

Gruß Michael
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Achso Workaround war so gemeint:

Du machst dir eine Tabelle mit der Zeilenstruktur objekt type cl_gui_textedit

dann hängst du deine objekte an die tabelle ran.

dann mit einem loop über die tabelle schleifen und die form aufrufen.

Das ist insofern dynamisch, das es egal ist wieviele Objekte in der Tabelle sind die Form durchlaufen wird.
//Edit
Mir ist keine Möglichkeit bekannt über den Namen des Objektes das Objekt aus dem Speicher auszulesen. Du brauchst soweit ich weis immer eine Referenz auf das Objekt um damit arbeiten zu können.

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
Flo hat geschrieben: //Edit
Mir ist keine Möglichkeit bekannt über den Namen des Objektes das Objekt aus dem Speicher auszulesen. Du brauchst soweit ich weis immer eine Referenz auf das Objekt um damit arbeiten zu können.
Das hab ich befürchtet, einen FuBa z.B. GET_OBJECT_FROM_OBJECTNAME konnte ich leider auch nicht finden. :twisted: :lol:

Danke & Gruß

Michael
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

Beitrag von Flo (Specialist / 161 / 0 / 0 ) »
Habs doch noch hinbekommen:)

Code: Alles auswählen.

field-symbols: <editor> TYPE REF TO cl_gui_textedit.

DO 3 TIMES. "derzeit 3 Textfelder

  ADD 1 TO zaehler.

  CONCATENATE textobjekt zaehler INTO tmpobjekt.

  assign (tmpobjekt) to <editor> .

  PERFORM pruefe_textedit
          USING
             <editor>.

Beitrag von Michael.Nett (ForumUser / 17 / 0 / 0 ) »
Flo hat geschrieben:Habs doch noch hinbekommen:)
:shock:

Ziemlich cool! Danke!

Gruß Michael
"3 Haie? Das macht 4810 Zähne!" (Findet Nemo)

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2130
Views
Dynamischer Methodenaufruf mit dynamischer Tabelle
von mark.thk » 12.12.2018 10:34 • Verfasst in ABAP Objects®
5
Antw.
4914
Views
Dynamischer Methodenaufruf mit dynamischer Tabelle
von Tommy Nightmare » 08.09.2017 13:23 • Verfasst in ABAP Objects®
4
Antw.
20092
Views
Dynamischer Methodenaufruf
von Cola » 20.08.2009 14:55 • Verfasst in ABAP Objects®
11
Antw.
5172
Views
Dynamischer Methodenaufruf (Teil 327)
von Icke0801 » 30.04.2022 08:28 • Verfasst in ABAP Objects®
2
Antw.
2679
Views
Dynamischer Methodenaufruf: Methode nicht gefunden
von ralf.wenzel » 08.09.2014 18:20 • Verfasst in ABAP Objects®

Über diesen Beitrag


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

Aktuelle Forenbeiträge

Hilfe zum FB MATERIAL_MAINTAIN_DARK
vor 23 Stunden von black_adept gelöst 8 / 1728
HR-Entgeltnachweis
Gestern von ChrisB 4 / 2289

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

Hilfe zum FB MATERIAL_MAINTAIN_DARK
vor 23 Stunden von black_adept gelöst 8 / 1728
HR-Entgeltnachweis
Gestern von ChrisB 4 / 2289

Unbeantwortete Forenbeiträge

Export von Spools in XLSX
vor 4 Tagen von abapamateur 1 / 261
Feldberechnung ME32K
vor einer Woche von ZF_SAPler 1 / 847
MS-Word als Editor
letzen Monat von tekko 1 / 4364