PDA

View Full Version : Problem mit Parameterübergabe aus SRVPGM



CrazyJoe
12-02-07, 13:52
Hallo,

hoffentlich kann mir jemand weiterhelfen.

Ich habe ein SRVPGM aus dem ich ein bereits seit längerem bestehendes Programm aufrufen will, allerdings werden die Aufrufparameter nicht richtig übergeben. Nachfolgend ein Beipiel:

* --- Prozedurbeschreibung / Ermittlung Sonderkonditionen ---------------------------------- *

d Call_SLTSK pr extpgm('SLTSK')
d sk_Makecode 1
d sk_Teile# 18
d sk_Kunden# 6s 0
d sk_KundenRG 1
d sk_skArt 2
d sk_VerkaufsPR 13s 2
d sk_Rabatt 5s 2
d sk_Text 30
d sk_TextKZ 1
d sk_Status 1


* --- Prozedur - Beginn -------------------------------------------------------------------- *

p Rtv_RB_Daten b export

* --- Prozedurinterface -------------------------------------------------------------------- *

d Rtv_RB_Daten pi 256
d p_Betrieb 3
d p_Kunde 6s 0
d p_Makecode 1
d p_Teilenummer 18
d p_Rabatt_GRP 2
d p_Euro_PB 1
d p_WAE_PreisB 3 0
d p_Alt_RBL 1

/free
....
....
....

Callp Call_SLTSK(sk_Makecode:sk_Teile#:sk_Kunden#:
sk_KundenRG:sk_SKArt:
sk_VerkaufsPR:sk_Rabatt:sk_Text:
sk_TextKZ:sk_Status);

...
...
...
/end-free


Im Programm SLTSK erhalte ich immer einen Dezimaldatenfehler, da im 3.Übergabeparameter (Kundennummer) teilweise Fragezeichen enthalten sind, obwohl ich keine übergebe (z.B. aus 123456 wird 1?2?3?).

Was mache ich da falsch???

Joe

Fuerchau
12-02-07, 13:57
Wie hast du denn die Felder definiert ?
In deinem Aufruf sehe ich zwar Feldnamen aber in deinem Auszug nicht die Definition derselben.

Die Deklaration der PR-Routine definiert die nachfolgenden Felder NICHT !!!


Ich nehme mal an, dass eigentlich die p_-Felder für die Übergabe gemeint sind.

mdhl
12-02-07, 14:01
Hallo Joe,

wie füllst du denn die Variable Kundennummer?
Um das herauszufinden, solltest du mal mit dem Debugger in dei Variable reinschauen, bevor das Programm aufgerufen wird.
Eine Erklärung könnte sein, dass der Parameiter im aufgerufenen Programm die Kundennummer gepackt deffiniert ist.

mdhl

CrazyJoe
12-02-07, 14:10
Die Felder sind folgendermaßen definiert:


d SonderKon_ds ds INZ
d sk_Makecode 1 inz(' ')
d sk_Teile# 18 inz(' ')
d sk_Kunden# 6s 0 inz(0)
d sk_KundenRG 1 inz(' ')
d sk_SKArt 2 inz(' ')
d sk_VerkaufsPR 13s 2 inz(0)
d sk_Rabatt 5s 2 inz(0)
d sk_Text 30 inz(' ')
d sk_TextKZ 1 inz(' ')
d sk_Status 1 inz(' ')


Eingangsparameterliste des aufgerufenen Programmes:

* Entrylist - Empfangen von Parametern. *
*--------------------------------------------------------------------------------------------*
*
C *ENTRY PLIST
C PARM C#ETMC
C PARM C#ETNR
C PARM C#KDNR
C PARM C#KDRG
C PARM C#SART
C PARM C#VPRS
C PARM C#RABP
C PARM C#TEXT
C PARM C#TXKZ
C PARM C#STAT



c#kdnr ist ein gezontes Feld 6S 0


Das Feld sk_kunden# wird mit der aus der Datenbank gelesenen Kundennummer gefüllt (ist auch 6s 0 definiert)

Joe

mdhl
12-02-07, 14:20
Was sagt der Debugger, wie wird die Kundennummer an das PGM übergeben?

CrazyJoe
12-02-07, 14:35
Der Debugger sagt folgendes:

Aufrufendes Programm:
> EVAL SonderKon_ds
SK_MAKECODE OF SONDERKON_DS = '1'
SK_TEILE# OF SONDERKON_DS = 'U0807717 '
SK_KUNDEN# OF SONDERKON_DS = 259785.
SK_KUNDENRG OF SONDERKON_DS = ' '
SK_SKART OF SONDERKON_DS = 'ET'
SK_VERKAUFSPR OF SONDERKON_DS = 00000000000.00
SK_RABATT OF SONDERKON_DS = 000.00
SK_TEXT OF SONDERKON_DS = ' '
SK_TEXTKZ OF SONDERKON_DS = ' '

Aufgerufenes Programm:
file:///C:/Temp/moz-screenshot.jpg 71 *
72 C *ENTRY PLIST
73 C PARM C#ETMC
74 C PARM C#ETNR
75 C PARM C#KDNR
Weitere ...
Testhilfe

F3=Programm beenden F6=Unterbrechungspunkt hinzufügen/löschen F10=Step
F11=Variable anzeigen F12=Wiederaufnehmen F24=Weitere Tasten
C#KDNR = 2?5?9?.

B.Hauser
12-02-07, 14:59
Hallo,

das Problem liegt darin, dass alle standalone Felder (auch Parameter-Felder), die gezont oder binär definiert sind von RPG in gepackte Felder konvertiert werden. Das ist nichts Neues, das war zumindest seit ich auf der AS/400 programmiere (und das sind immerhin 15 Jahre) schon immer so.

Gezonte Felder und Binär-Felder werden nur dann nicht in gepackte Felder konvertiert, wenn sie als Datenstruktur-Unterfelder definiert sind.

In Deiner Parameter-Definition gibst Du zwar gezonte Felder an, diese werden jedoch, da es sich um keine Datenstruktur-Unterfelder handelt in gepackte Felder konvertiert. Die Felder in Deiner Datenstruktur, die Du übergibst werden jedoch nicht konvertiert.

Im Klartext heißt das:
Du übergibst gezonte Werte, obwohl gepackte Werte erwartet werden. (die ? sind übrigens Vorzeichen, die bei gezonten Feldern jeweils in einem Halb-Byte gespeichert werden).

Folgende Lösungen sind möglich:
1. Sollte es sich bei den übergebenen Parametern um echte Input-Only-Parameter handeln, die in der aufgerufenen Prozedur nicht verändert werden, genügt es das Schlüssel-Wort CONST im Prozedur-Interface und im Prototyp anzugeben. Durch dieses Schlüssel-Wort werden die Parameter korrekt in das erwartete Format konvertiert.
2. Handelt es sich nicht um Input-Only-Parameter müssen die Parameter vor der Übergabe in gepackte Felder umgeladen werden.
3. Sollte die Definition der Datenstruktur nicht erforderlich sein, und die Felder als standalone Felder definiert werden können, würde auch das richtige Format übergeben werden.

Birgitta

CrazyJoe
12-02-07, 15:36
Hallo Birgitta,

vielen Dank für deine Hilfe.

Ich habe jetzt die Übergabefelder als gepackte Felder definiert, und siehe da, es funktioniert.

Für mich war der Sachverhalt, dass die gezonten standalone Felder umkonvertiert werden neu, allerdings arbeite ich noch nicht so lange auf der AS/400.

Das Thema wwerde ich mir auf alle Fälle im hinterstübchen behalten.

Nochmals Danke,

Joe