Perfrom und Rückgabe von Werten

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

Perfrom und Rückgabe von Werten

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
Hallo zusammen,

folgendes Problem beschäftigt mich jetzt schon seid einer Weile.

Ich möchte aus einer Methode meiner Klasse ein Unterprogramm aus einem anderen Programm aus aufrufen. Zurückgeben soll mir dieses Programm eine Referenz auf eine interne Tabelle, da in der Methode der Klasse diese Tabelle noch nicht bekannt ist. Jedoch ist diese Refernz nach der Rückgabe immer leer bzw. in der Referenz steht "FREED STACK".

Hier meine Frage ist es nicht möglich eine Referenz gefüllt bei einem Perform mitzugeben?

Wenn nicht, wie kann ich mein Problem dann lösen? Es soll eine interne Tabelle (oder Referenz) aus dem Unterprogramm an die Methode zurück gegeben werden. Jedoch ist die Tabelle in der Methode nicht bekannt. Ich bin für jede Hilfe dankbar.

Hier der Aufruf des Unterprogramms:

Code: Alles auswählen.

  Perform Test in program SUBMIT_PROG
          changing <l_fs_table>.
Gruß
Steffi

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


Beitrag von BlackMail (ForumUser / 79 / 0 / 0 ) »
Hallo.
Wenn du die Formroutine selbst schreibst, solltest du als Übergabeparameter ein REF TO DATA vereinbaren. Z. B.

Code: Alles auswählen.

FORM test CHANGING cz_ref TYPE REF TO data.

  GET REFERENCE OF gt_table INTO cz_ref.

ENDFORM. 
Danach kannst du diese Referenz einem Feldsymol zuweisen:

Code: Alles auswählen.

ASSIGN lz_ref->* TO <feldsymbol>.
Hab's nicht ausprobiert, aber sollte schon klappen.

Gruß BlackMail.
Zuletzt geändert von BlackMail am 05.11.2007 13:52, insgesamt 1-mal geändert.

Beitrag von Krueger ( / / 0 / 3 ) »
Was macht man allerdings mit einer unbekannten Tabelle.. nur mal so aus neugier :roll:

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
danke für den Tipp, aber das hab ich auch schon ausprobiert. War ja mein erster Gedanke. Nur leider ist das Referenzobjekt bei der Rückkehr in die Methode leer.

Und das ist ja mein Problem.

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
:lol: also das programm erstellt die Tabelle erst und soll an die methode angegeben werden. ich weiß da gibts schon ne Methode von der SAP "CREATE_ALV_TABLE" oder so. Aber da ist das Problem das die nen Generate Subroutine Pool machen und der kann ja nur 36 mal aufgerufen werden. Deshalb versuch ich was eigenes zu bauen.

Re: Perfrom und Rückgabe von Werten

Beitrag von BlackMail (ForumUser / 79 / 0 / 0 ) »
Steffi221185 hat geschrieben: danke für den Tipp, aber das hab ich auch schon ausprobiert. War ja mein erster Gedanke. Nur leider ist das Referenzobjekt bei der Rückkehr in die Methode leer.
Ich habs auch ausprobiert und bei mir gehts:

Report 1:

Code: Alles auswählen.

REPORT  z001.

DATA:
  lz_data TYPE REF TO data.

FIELD-SYMBOLS:
  <lt_data>  TYPE ANY TABLE.


DO 3 TIMES.
  CLEAR lz_data.
  UNASSIGN <lt_data>.
  PERFORM getref(z002) CHANGING lz_data.

  ASSIGN lz_data->* TO <lt_data>.
ENDDO.
Report 2:

Code: Alles auswählen.

REPORT  z002.

DATA:
  gt_data TYPE TABLE OF mara.

FORM getref CHANGING cz_ref TYPE REF TO data.
  DATA:
    ls_mara TYPE mara.
  SELECT SINGLE * FROM mara INTO ls_mara.
  APPEND ls_mara TO gt_data.
  GET REFERENCE OF gt_data INTO cz_ref.
ENDFORM.
Bei Dir sieht es ja so aus, dass du schon ein Feldsymbol an die FORM übergibst.
Steffi221185 hat geschrieben: Hier der Aufruf des Unterprogramms:

Code: Alles auswählen.

  Perform Test in program SUBMIT_PROG
          changing <l_fs_table>.
Gruß
Steffi

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
Danke nochmal.

Also das mit dem Feldsymbol kommt aus nen weiteren Versuch den ich gestartet hatte. Das konnte ja nicht klappen, da das Feldsymbol noch nicht zugewiesen wurde.

Das deine Referenz übergeben wird wundert mich. Ich hab das auch so aber es funzt nicht. immer steht in der Variable wenn man aus dem Perform zurück kommt Freed Stack und dann die Adressspeicher bei dem die Daten abgelegt wurden.

Aber mich motiviert es, dass es bei dir funktioniert. Dann muss es ja bei mir auch funktionieren. Also ich hab ne Methode und ruf dann nen Unterprogramm in nen anderen Report auf. Ich werd mal Report zu Report probieren und gucken ob das funktioniert.

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
Supi es hat funktioniert zu mindestens ein mal danach bekomm ich immer einen dump. Also der Fehler war, dass ich meine Variable(itab) nicht global definiert habe sondern lokal. Echt dummer Fehler :oops:

Aber warum das ganze jetzt nur einmal funktioniert weiß ich nicht. Beim 2. Mal macht er erst gar nicht das "Get reference.."
Kann mir denken das er sich das ganze merkt. Bei dir funktioniert das vielleicht weil der Aufbau der Tabelle immer gleich ist. Bei mir ist der unterschiedlich.

Hab die Tabellen auch bei jedem Aufruf anders benannt aber irgendwie reagiert ja darauf nicht. [/code]

Beitrag von BlackMail (ForumUser / 79 / 0 / 0 ) »
Also bei mir gehts auch mit unterschiedlichen Tabellen. Mir ist aber auch noch nicht klar, wie du die internen Tabellen erzeugst.

Code: Alles auswählen.

DATA:
  g_mara   TYPE xfeld,
  gt_data1 TYPE TABLE OF mara,
  gt_data2 TYPE TABLE OF aenr.

FORM getref CHANGING cz_ref TYPE REF TO data.

  IF g_mara IS INITIAL.
    SELECT * FROM aenr UP TO 1 ROWS INTO TABLE gt_data2.
    GET REFERENCE OF gt_data2 INTO cz_ref.
    g_mara = 'X'.
  ELSE.
    SELECT * FROM mara UP TO 1 ROWS INTO TABLE gt_data1.
    GET REFERENCE OF gt_data1 INTO cz_ref.
    CLEAR g_mara.
  ENDIF.
ENDFORM.

Beitrag von BlackMail (ForumUser / 79 / 0 / 0 ) »
Also bei mir gehts auch mit unterschiedlichen Tabellen. Mir ist aber auch noch nicht klar, wie du die internen Tabellen erzeugst.

Code: Alles auswählen.

DATA:
  g_mara   TYPE xfeld,
  gt_data1 TYPE TABLE OF mara,
  gt_data2 TYPE TABLE OF aenr.

FORM getref CHANGING cz_ref TYPE REF TO data.

  IF g_mara IS INITIAL.
    SELECT * FROM aenr UP TO 1 ROWS INTO TABLE gt_data2.
    GET REFERENCE OF gt_data2 INTO cz_ref.
    g_mara = 'X'.
  ELSE.
    SELECT * FROM mara UP TO 1 ROWS INTO TABLE gt_data1.
    GET REFERENCE OF gt_data1 INTO cz_ref.
    CLEAR g_mara.
  ENDIF.
ENDFORM.
Gruß BlackMail.

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
Also warum es nicht geht ist mir mittlerweile klar. Beim ersten Aufruf liest er die globalen Variabeln ein. Beim erneuten Aufruf macht er das nicht mehr (steht in der Hilfe zu Perform).

Also bei mir ist alles dynamisch programmiert und der Report wird immer dynamisch angepasst aber beim aufruf siehts ca. so aus.

Methode:

Code: Alles auswählen.

  Perform Test in program SUBMIT_PROG
          changing  l_ptr_table_help.
Report:

Code: Alles auswählen.

Report SUBMIT_PROG

TYPES: BEGIN OF STRUC_NEW_TABLE,
              Test(10) type c,
             End OF STRUC_NEW_TABLE.

DATA: L_IT_TABLE TYPE STANDARD table of STRUC_NEW_TABLE.

Form Test changing c_ptr_table type ref to data.
get reference of l_it_table into c_ptr_table.
endform.
Das heißt der Globale Teil sieht beim nächsten Aufruf der Methode anders aus z.B.: mit zwei Spalten oder so. Das dumme ist nur das dieser Teil nur beim ersten Aufruf geladen wird. und ich ruf die Methode aus einer anderen Methode mehrmals hintereinander auf.

Beitrag von BlackMail (ForumUser / 79 / 0 / 0 ) »
Hallo Steffi,

vielleicht stellst Du kurz noch mal dar, was das eigentliche Ziel ist und vor allem mit welchem Basisrelease ihr arbeitet. Ab 6.40 kann man sehr viel über die RTTI/RTTC-Klassen machen. Die Lösung ist dann eventuell einfacher...?

Viele Grüße BlackMail.

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
Was sind denn die RTTI/RTTC-Klassen? Kenn ich noch gar nicht.

Release: 6.40

So nun zu dem was ich mache.

Ich habe eine Klasse zum dynamischen Programmieren erstellt.
Eine Methode dieser Klasse soll eine interne Tabelle erstellen und an den Aufrufer der Methode zurückgeben.
Übergeben bekomm ich an die Methode den Feldcatalog, der zu erstellenden internen Tabelle.

Diese Tabelle soll dann halt in nen anderen Programm erstellt werden. Damit ich die Daten zurückbekomme, hab ich ein Unterprogramm erstellt. Dieses gibt mir dann die Referenz auf die itab zurück.

Ich hoffe du verstehts was ich machen möchte.

Wie gesagt die Klassen kenn ich nicht. Was kann man da genau machen bzw. für was sind die da.

Gruß
Steffi

Beitrag von BlackMail (ForumUser / 79 / 0 / 0 ) »
Hallo Steffi,

wenn sich die Zeilenbeschreibung der Tabelle auf einen DDIC-Typ stützen würde, wär's natürlich am einfachsten:

Code: Alles auswählen.

DATA:
  gz_tab_ptr     TYPE REF TO data.

FIELD-SYMBOLS:
  <gt_table>     TYPE ANY TABLE.

START-OF-SELECTION.

  PERFORM get_table_ptr USING 'MARA' CHANGING gz_tab_ptr.

  ASSIGN gz_tab_ptr->* TO <gt_table>.


FORM get_table_ptr USING u_name TYPE string CHANGING cz_tab_ptr TYPE REF TO data.

  CREATE DATA cz_tab_ptr TYPE TABLE OF (u_name).

ENDFORM.                    "get_table_ptr
Mit Feldkatalog fällt mir keine einfache Lösung ein. Stützt sich die Felddefinition im Feldkatalog wenigstens aufs DDIC?

RTTS (run time type services) können zur Laufzeit, einfache Datentypen, Strukturen und Tabellen anaylsieren und beschreiben. Seit 6.40 kann man so auch zur Laufzeit Typobjekte erzeugen. Organisiert ist das in einer Klassenhierarchie, deren Root cl_abap_typedescr ist.

Gruß BlackMail.

Beitrag von Steffi221185 (Specialist / 132 / 0 / 0 ) »
ne leider bezieht sich der Feldkatalog nicht immer auf DDIC -Objekte. Es können DDIC-Objekte sein müssen aber nicht.

die Klasse kannt ich doch schon..benutzt nen Arbeitskollege in seinen Klassen.

Gruß
Steffi

Vergleichbare Themen

2
Antw.
3066
Views
JCO - Rückgabe an SAP Dateiinhalt
von steffi_ma » 22.12.2004 14:40 • Verfasst in Java & SAP®
3
Antw.
4722
Views
Verbuchungsbaustein - Rückgabe?
von xJeNnYx » 21.09.2009 14:53 • Verfasst in ABAP® für Anfänger
9
Antw.
4989
Views
Rückgabe von Datenreferenzen
von SaskuAc » 02.06.2017 11:01 • Verfasst in ABAP® Core
0
Antw.
720
Views
SMARTFORM Rückgabe des Druckoutputs
von SAP_ENTWICKLER » 12.12.2017 06:03 • Verfasst in ABAP® Core
5
Antw.
7104
Views
SOAP Aufruf mit Content Rückgabe
von eschi78 » 19.02.2013 15:33 • Verfasst in Web Application Server

Über diesen Beitrag


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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 770
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2392
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8977