Die gefüllte interne Tabelle an Form als parameter weitergeben.

Getting started ... Alles für einen gelungenen Start.
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von HH_ABAP (Specialist / 262 / 144 / 1 ) »
Hallo,

ich habe eine interne Tabelle, die schon gefüllt ist (lt_split).

wenn ich die Tabelle (lt_split) mit Perform an Form weitergebe, die Tabelle im Form ist leer. Warum?

TYPES: BEGIN OF t_split,
customer(10) TYPE c,
material(10) TYPE c,
purchaseorder(10) TYPE c,
wunschlieferdatum(10) TYPE c,
menge(5) TYPE c,
werk(5) TYPE c,
END OF t_split.

DATA: lt_split TYPE TABLE OF t_split,
ls_split LIKE LINE OF lt_split.

DATA: lv_order_nr TYPE vbeln.
...
<Die Tabelle lt_split wurde mit Daten gefüllt>
...

PERFORM create_order USING lt_split CHANGING lv_order_nr.

Form create_order USING lt_split CHANGING lv_order_nr TYPE vbeln.

...

Endform.

Danke im Voraus!
Vg

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


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Wenn man lt_split in der Formroutine als Tabelle typisiert dürfte es funktionieren.

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
HH_ABAP


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
du verschattest die Variable lt_split in der FORM-Routine!!
benenne den Parameter um in it_split, dann funktioniert es auch.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
HH_ABAP


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
Das Verschatten sollte aber eigentlich keine Rolle spielen, weil er die Tabelle ja mit sich selber verschattet. Es spielt also keine Rolle, ob ABAP die verschattete Version oder die originale verwendet. Der PERFORM exportiert auf jeden Fall die originale, und für die Formroutine spielt es in diesem Programm keine Rolle, ob sie die globale Tabelle oder die gleichnamige von Aufrufer verwendet (zumal der Aufrufer in diesem Codefragment selber in einer Unterroutine stecken könnte. Dann wäre gar nichts verschattet).

Insofern klingt PeterPalettis Erklärung wahrscheinlicher. Auch wenn es mich wundert, da ein nicht typisierter USING-Parameter eigentlich als TYPE ANY deklariert sein müsste und daher auch eine Tabelle enthalten dürfen müsste (nur dass man halt statisch nicht drüber loopen kann).

Würde man mit etwas rumtesten sicherlich rausbekommen, bin ich nur gerade zu faul zu.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
HH_ABAP


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Stimmt, das mit der Verschattung ist Quatsch.
Das andere aber auch.
Folgendes Coding funktioniert einwandfrei:

Code: Alles auswählen.

TYPES: BEGIN OF t_split,
         customer(10) TYPE c,
         material(10) TYPE c,
       END OF t_split.

DATA: lt_split TYPE TABLE OF t_split.

lt_split = VALUE #(
  ( customer = 'A' material = '1' )
  ( customer = 'B' material = '2' )
  ( customer = 'C' material = '3' ) ).

PERFORM create_order USING lt_split.

FORM create_order USING lt_split.

  cl_demo_output=>display_data( lt_split ).

ENDFORM.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
HH_ABAP


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Jein.
cl_demo_output=>display_data( lt_split ). Funktioniert.

Aber mach mal in der Formroutine bitte ein LOOP auf lt_split. Bei mir funktioniert das nicht.

Folgende Benutzer bedankten sich beim Autor PeterPaletti für den Beitrag:
HH_ABAP


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
das ist ja "cool"...
der cl_demo_output nimmt die korrekte Tabelle LT_SPLIT.
Als LOOP meckert der Compiler: LT_SPLIT ist keine interne Tabelle. Klar, weil er das zur Laufzeit auch nicht wissen kann, denn der USING-Parameter ist untypisiert.

Korrekt muss es also heißen:

Code: Alles auswählen.

TYPES: BEGIN OF ts_split,
         customer(10) TYPE c,
         material(10) TYPE c,
       END OF ts_split,
       tt_split type STANDARD TABLE OF ts_split with DEFAULT KEY.

DATA: lt_split TYPE tt_split.

lt_split = VALUE #(
  ( customer = 'A' material = '1' )
  ( customer = 'B' material = '2' )
  ( customer = 'C' material = '3' ) ).

PERFORM create_order USING lt_split.

FORM create_order USING lt_split type tt_split.

  LOOP AT lt_split INTO DATA(split).
    WRITE: / split-customer, split-material.
  ENDLOOP.

ENDFORM.
Und ganz korrekt sollte der Using-Parameter natürlich IT_SPLIT heißen... ;)

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
HH_ABAP


Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
ewx hat geschrieben:
27.04.2023 12:02
Und ganz korrekt sollte der Using-Parameter natürlich IT_SPLIT heißen... ;)
Und da USING-Parameter auch geändert werden können, sollte man lieber auf USING verzichten und gleich CHANGING nehmen und dann CT_SPLIT nennen. Oder am Besten ganz auf FORMs verzichten und Methoden verwenden....

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

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Die gefüllte interne Tabelle an Form als parameter weitergeben.

Beitrag von DeathAndPain (Top Expert / 1952 / 259 / 413 ) »
ewx hat geschrieben:
27.04.2023 12:02
das ist ja "cool"...
der cl_demo_output nimmt die korrekte Tabelle LT_SPLIT.
Als LOOP meckert der Compiler: LT_SPLIT ist keine interne Tabelle. Klar, weil er das zur Laufzeit auch nicht wissen kann, denn der USING-Parameter ist untypisiert.
Richtig, das Verhalten ist erwartungsgemäß. In dem Moment, in dem man statisch über einen Parameter LOOPen möchte, muss man ihn auch als Parameter typisieren. Für Faule hätte es freilich ausgereicht, den USING-Parameter per TYPE ANY TABLE zu deklarieren (jedenfalls solange man statisch nicht auf konkrete Spalten zugreifen möchte). Besser ist natürlich das, was Du gemacht hast.
black_adept hat geschrieben:Und da USING-Parameter auch geändert werden können, sollte man lieber auf USING verzichten und gleich CHANGING nehmen
Finde ich nicht. Es ist zwar schade, dass ABAP das Ändern von USING-Parametern zumindest in statischer Form nicht verhindert, aber dennoch kann man als Programmierer mit USING dem Leser kommunizieren, welche Verwendung des Parameters angedacht (bzw. nicht angedacht) ist. CHANGING hingegen kommuniziert explizit, dass eine Änderung des Parameters in der Unterroutine vorgesehen ist. Daher halte ich CHANGING für verwirrend und nicht ratsam, wenn die Unterroutine den Parameter nur nutzen und nicht ändern soll.

Aber ja, die hässliche USING/CHANGING-Bauform von Formroutinen sind ein wesentlicher Grund, weshalb Methodenaufrufe sich bedeutend verständlicher lesen und damit drastisch zur Lesbarkeit des Codes beitragen. Schade, dass man bei Methoden dafür so einen Wasserkopf eingebaut hat, der es unnötig aufwendig macht, sie zu programmieren. Das hätte man besser lösen können.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
HH_ABAP


Seite 1 von 1

Vergleichbare Themen

2
Antw.
3351
Views
Änderungen im ALV an die interne Tabelle weitergeben
von Gast » 16.02.2006 18:48 • Verfasst in ABAP® für Anfänger
3
Antw.
6423
Views
interne Tabelle an Form übergeben
von Andrzej » 17.05.2017 14:14 • Verfasst in ABAP® für Anfänger
17
Antw.
9101
Views
Interne Tabelle an Form übergeben innerhalb eines FuBa's
von shapoc » 09.05.2006 14:36 • Verfasst in ABAP® Core
3
Antw.
2784
Views
Parameter in interne Tabelle speichern
von hmaxi96 » 18.12.2015 11:16 • Verfasst in ABAP® für Anfänger
1
Antw.
3997
Views
interne Tabelle als Parameter zu übergeben?
von oo » 25.05.2006 10:46 • Verfasst in Web-Dynpro, BSP + BHTML

Aktuelle Forenbeiträge

Regex in where
vor 20 Stunden von tar 8 / 367
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1636
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 285
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 528

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

Regex in where
vor 20 Stunden von tar 8 / 367
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1636
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 285
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 528

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 2 Tagen von snooga87 1 / 221
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 3403
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9953