Unterprogramm erstellen - Abweichende Parameteranzahl Thema ist als GELÖST markiert

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

Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von Sonne1234 (ForumUser / 25 / 12 / 1 ) » 13. Jan 2020 08:31

Hallo zusammen,

in meinem Programm, das ich versuche zu schreiben, muss ich öfters mit jeweils anderen Daten auf eine Tabelle zugreifen.
Ich würde dies nun gerne über ein Unterprogramm einbauen.
Allerdings bekomme ich hier immer wieder Fehlermeldungen.
Folgender Code:

Code: Alles auswählen.

Perform f_nast using gt_sap changing gt_nast. 

Form f_nast 
 using p_table type STANDARD TABLE ty_vbrk changing p_nast.
  
  SELECT objky kschl erdat vstat parnr
         INTO CORRESPONDING FIELDS OF TABLE p_nast
         FROM nast FOR ALL ENTRIES IN p_table 
         WHERE objky EQ p_table-vbeln AND
                     kschl EQ 'X'.
    
endform.     
Derzeit bekomme ich die Meldung, dass es eine abweichende Parameteranzahl in FORM und PERFORM gibt. (Formalparameter: 3, Aktualparameter: 2)

Ich weiß nicht so richtig, an welcher Stelle ich hier nun ansetzen soll, um das ganze anzupassen.

Inhaltlich fragt am besten nicht, warum ich das überhaupt tue. Ich weiß selbst noch nicht genau, ob das alles so Sinn ergibt :D Aber Ziel ist es erstmal, dass keine Fehler mehr hochkommen und die gt_nast Tabelle mit Werten gefüllt wird.

Danke für eure Unterstützung.
Viele Grüße
Julia


Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von Aba (ForumUser / 49 / 6 / 1 ) » 13. Jan 2020 08:49

Hallo Julia,

versuche mal anstatt mit dem Type Standard table in

Code: Alles auswählen.

Form f_nast 
 using p_table type STANDARD TABLE ty_vbrk changing p_nast.

mit einem Tabellentypen zu arbeiten. Dann funktioniert das bei mir.

Aba

Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von Sonne1234 (ForumUser / 25 / 12 / 1 ) » 13. Jan 2020 11:27

Hallo Aba,

kannst du mir bitte noch einen Tipp geben, wie ich das dann deklarieren muss?

Ich komme leider nicht so richtig weiter.

Vielen Dank.

Gruß
Julia

Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von gtoXX (Specialist / 123 / 26 / 18 ) » 13. Jan 2020 11:32

Hi Julia,

deinen Fehler bekommst du so weg wie im unten stehenden Coding. Du bekommst aber einen Problem mit "objky" und "p_tabl-vbeln". Das funktioniert bei FOR ALL ENTRIES so nicht, da hier zwingend der selbe Typ verlangt wird.

Ungünstig ist immer auch mehr zu übergeben als man braucht. Auch eine Form
sollte sich wie im OO daran halten -> 1 Methode = 1 Aufgabe -> Klare Parameterübergabe.

Lösung :
1. Definiere einen strukturierten Tabellentyp (ty_objky) mit dem Feld objky, falls es noch keinen im Dictionary
gibt.
2. Rufe die Form wie auf :
PERFORM fnast USING CORRESPONDING ty_objky( tab_sap MAPPING objky =
vbeln ) CHANGING p_nast
.

Code: Alles auswählen.

TYPES:
 ty_vbrk TYPE TABLE OF vbrk.

DATA:
  tab_sap TYPE STANDARD TABLE OF vbrk,
  tab_nast TYPE STANDARD TABLE OF nast.

Perform f_nast using tab_sap changing tab_nast.



Form f_nast
 using p_table type ty_vbrk changing p_nast.

  SELECT objky,kschl,erdat, vstat,parnr
         INTO CORRESPONDING FIELDS OF TABLE @p_nast
         FROM nast FOR ALL ENTRIES IN @p_table
         WHERE objky EQ @p_table-vbeln AND
                     @kschl EQ 'X'.

endform.
"Code lügt nicht ^^"

Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von jocoder (Specialist / 126 / 2 / 31 ) » 13. Jan 2020 11:59

Zudem würde ich noch die Variablen tab_sap in billing_header und p_table in p_billing_header umbenennen.
Dann wird das ganze Coding besser nachvollziehbar. In einem Monat weiß niemand mehr, was die Variable tab_sap jetzt genau enthält.

Den änderbaren Parameter p_nast sollte noch typisiert werden. Verhindert auch eine Menge unnötiger Fehler.

Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von Sonne1234 (ForumUser / 25 / 12 / 1 ) » 14. Jan 2020 07:34

Guten Morgen zusammen,

leider komme ich noch nicht so richtig weiter.

Wenn ich grundsätzlich versuche mit corresponding zu arbeiten, erhalte ich die Meldung, dass das Feld "Corresponding" unbekannt ist.

Code: Alles auswählen.

perform f_nast using CORRESPONDING ty_objky(gt_sap mapping objky = vbeln) changing gt_nast.
Also habe ich versucht das von dir genannte Coding umzusetzen.

Code: Alles auswählen.

types: BEGIN OF ty_nast,
         objky      TYPE c LENGTH 50,
         kschl      TYPE nast-kschl,
         erdat      TYPE nast-erdat,
         vstat      TYPE nast-vstat,
         parnr      TYPE c LENGTH 10,
        END OF ty_nast,

 BEGIN OF ty_vbrk,
         vbeln TYPE c LENGTH 30,
         fkart TYPE vbrk-fkart,
         fkdat TYPE vbrk-fkdat,
         rfbsk TYPE vbrk-rfbsk,
       END OF ty_vbrk.

data: gt_sap type Standard table of ty_vbrk, 
        gt_nast type Standard table of ty_nast. 

perform f_nast using gt_sap changing gt_nast. 

form f_nast

  using p_table type ty_vbrk changing p_nast type ty_nast.

  SELECT objky kschl erdat vstat parnr
         INTO CORRESPONDING FIELDS OF table p_nast
         FROM nast FOR ALL ENTRIES IN p_table
         WHERE objky EQ p_table-vbeln AND
               kschl EQ 'x'.

endform.
Nun bekomme ich aber die folgende Meldung:

Bei PERFORM bzw. CALL FUNCTION "F_NAST" ist der Aktualparameter "GT_SAP" zum Formalparameter "P_TABLE" inkompatibel.

Aber eigentlich sind doch gt_sap und p_table komplett gleich deklariert.

Das Problem ist, wenn ich an der zunächst genannten Datendeklaration etwas ändere, bekomme ich im Programm an anderer Stelle Schwierigkeiten.

Könnt ihr mir hier bitte nochmal weiterhelfen?

Danke :)
Gruß
Julia

Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von Aba (ForumUser / 49 / 6 / 1 ) » 14. Jan 2020 08:13

Hallo Julia,

Bei PERFORM bzw. CALL FUNCTION "F_NAST" ist der Aktualparameter "GT_SAP" zum Formalparameter "P_TABLE" inkompatibel.

Aber eigentlich sind doch gt_sap und p_table komplett gleich deklariert.
gt_sap und p_table sind bei dir aktuell nicht gleich deklariert.
Bei gt_sap handelt es sich um eine Tabelle, da du sie mit "type standard table of ty_vbrk" definierst. Bei p_table dagegen handelt es sich lediglich um eine Struktur, da du sie nur mit "type ty_vbrk" definierst. Daher sind die beiden Variablen nicht direkt kompatibel.
Bei gt_nast und p_nast müsste auch die gleiche Fehlermeldung erscheinen.

Wenn beides eine Tabelle sein soll, könntest du dafür einen Tabellentypen wie folgt definieren:

Code: Alles auswählen.

types: tty_vbrk type table of ty_vbrk,
tty_nast type table of ty_nast.
Deine Deklarationen für gt_sap und p_table könnten dann beide wie folgt darauf basieren:

Code: Alles auswählen.

types: BEGIN OF ty_nast,
         objky      TYPE c LENGTH 50,
         kschl      TYPE nast-kschl,
         erdat      TYPE nast-erdat,
         vstat      TYPE nast-vstat,
         parnr      TYPE c LENGTH 10,
        END OF ty_nast,

 BEGIN OF ty_vbrk,
         vbeln TYPE c LENGTH 30,
         fkart TYPE vbrk-fkart,
         fkdat TYPE vbrk-fkdat,
         rfbsk TYPE vbrk-rfbsk,
       END OF ty_vbrk.

types: tty_vbrk type table of ty_vbrk,
          tty_nast type table of ty_nast.

data: gt_sap   type tty_vbrk, 
         gt_nast type tty_nast. 

perform f_nast using gt_sap changing gt_nast. 

form f_nast

  using p_table type tty_vbrk changing p_nast type tty_nast.

  SELECT objky kschl erdat vstat parnr
         INTO CORRESPONDING FIELDS OF table p_nast
         FROM nast FOR ALL ENTRIES IN p_table
         WHERE objky EQ p_table-vbeln AND
               kschl EQ 'x'.

endform.


Ich hoffe das hilft dir weiter.

Aba

Re: Unterprogramm erstellen - Abweichende Parameteranzahl

Beitrag von DeathAndPain (Top Expert / 1239 / 137 / 283 ) » 16. Jan 2020 09:05

Obenstehendes ist richtig. Ergänzend noch folgendes:
Wenn ich grundsätzlich versuche mit corresponding zu arbeiten, erhalte ich die Meldung, dass das Feld "Corresponding" unbekannt ist.
Das liegt daran, dass CORRESPONDING() aus der neuen 7.40-Syntax stammt. Der alte PERFORM-Befehl unterstützt diese jedoch nicht. Du musst also entweder OO machen oder Deine Werte vor dem PERFORM in eine Struktur kopieren, die der Typisierung des entsprechenden FORM-Parameters entspricht.

Seite 1 von 1

Aktuelle Forenbeiträge

BUSXXXX für PM Meldung gelöst
vor 11 Stunden von tekko 3 / 80
Operieren mit zwei Tabellen
vor 13 Stunden von SaskuAc 4 / 96
Bestimmte Felder dynamisch in eine zweite Struktur überführen gelöst
vor 14 Stunden von DeathAndPain 6 / 164
Updaten von Feld AUSWK in VIQMEL
vor 15 Stunden von Abapanfänger 5 / 129
ASCII/BIN Art aus JPEG
Gestern von edwin 10 / 294

Unbeantwortete Forenbeiträge

Auspacken von Handling Units im Transport
vor 3 Tagen von Bastian.Reitz 1 / 69
Funktionsbaustein MD_PEGGING_NODIALOG
vor einer Woche von christof 1 / 71
IDOC ist nicht angekommen
vor einer Woche von cuncon 1 / 101
Auftrag Vorgängerbeziehung entfernen
vor einer Woche von ichse18577 1 / 78