PDA

View Full Version : Ungültige Zeichen im Übergabeparamter bei CL



hs
27-08-08, 20:38
Hallo AS400-Experten,

ich brauche mal eure Unterstützung, weil ich mit meinem Latein am Ende bin:

Ich habe ein CL, dem ich 5 Parameter übergebe.

PGM PARM(&LIB &PF &DATEI &EMAIL &NACHRICHT)

DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&PF) TYPE(*CHAR) LEN(10)
DCL VAR(&DATEI) TYPE(*CHAR) LEN(10)
DCL VAR(&EMAIL) TYPE(*CHAR) LEN(32)
DCL VAR(&NACHRICHT) TYPE(*CHAR) LEN(64)


Dieses CL rufe ich wie folgt aus einem anderen CL auf:

CALL MEINPG('MEINELIB' &MEINDAT 'DATNAM.XLS' &EMAIL 'Das ist der Betreff der Email')

%MEINDAT ist als char(10) und &EMAIL asl Char(32) definiert.
Inhalt sind eine AS400-Tabelle (max 10 zeichen) und eine Emailadresse (max. 32 Zeichen)

Das Problem ist jetzt, das im Programm MEINPG der Text 'Das ist der Betreff der Email' mit nicht darstellbaren Zeichen am Ende ankommt. D.h. es werden einfach scheinbar beliebige Zeichen hinten mit übergeben.
Scheinbar sind diese Zeichen jedesmal anders, je nachdem, welcher Text übergeben wird bzw. wie lange dieser ist.

Eine weitere Verarbeitung (SQL Insert in eine Logdatei) funktioniert dann nicht mehr.

Woran liegt das bzw. was mache ich falsch?

Vielen Dank für eure Antworten
HS

BenderD
27-08-08, 20:56
CLs (und nicht nur die) übergeben Literale per Reference (= Pointer) und ein AS/400 Pointer weiß nicht auf was er da zeigt, was bei der Übergabe von Literalen Nebeneffekte haben kann. Mit anderen Worten: weise 'Das ist der Betreff einer eMail' einer Variablen zu und übergebe diese als Parameter.
D*B


Hallo AS400-Experten,

ich brauche mal eure Unterstützung, weil ich mit meinem Latein am Ende bin:

Ich habe ein CL, dem ich 5 Parameter übergebe.

PGM PARM(&LIB &PF &DATEI &EMAIL &NACHRICHT)

DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
DCL VAR(&PF) TYPE(*CHAR) LEN(10)
DCL VAR(&DATEI) TYPE(*CHAR) LEN(10)
DCL VAR(&EMAIL) TYPE(*CHAR) LEN(32)
DCL VAR(&NACHRICHT) TYPE(*CHAR) LEN(64)


Dieses CL rufe ich wie folgt aus einem anderen CL auf:

CALL MEINPG('MEINELIB' &MEINDAT 'DATNAM.XLS' &EMAIL 'Das ist der Betreff der Email')

%MEINDAT ist als char(10) und &EMAIL asl Char(32) definiert.
Inhalt sind eine AS400-Tabelle (max 10 zeichen) und eine Emailadresse (max. 32 Zeichen)

Das Problem ist jetzt, das im Programm MEINPG der Text 'Das ist der Betreff der Email' mit nicht darstellbaren Zeichen am Ende ankommt. D.h. es werden einfach scheinbar beliebige Zeichen hinten mit übergeben.
Scheinbar sind diese Zeichen jedesmal anders, je nachdem, welcher Text übergeben wird bzw. wie lange dieser ist.

Eine weitere Verarbeitung (SQL Insert in eine Logdatei) funktioniert dann nicht mehr.

Woran liegt das bzw. was mache ich falsch?

Vielen Dank für eure Antworten
HS

KM
28-08-08, 05:57
mit anderen Worten...

Es gibt immer Probleme, wenn die Länge der einzelnen Parameter zwischen rufendem und gerufenem Programm nicht übereinstimmen.

Erstelle am besten einen CMD für das gerufene Programm. Das wäre die sauberste Lösung.

Gruß,
KM

hs
28-08-08, 07:51
Danke für eure Antworten.

Habe das Problem verstanden, wenn ich den Text erst in eine Variable schreibe, funktionierts.

Werde es aber beser in ein CMD ändern.

Gruß
HS

B.Hauser
28-08-08, 07:58
Solange Du das Programm aus einem anderen CL/RPG oder was auch immer Programm aufrufst, macht das Umladen in eine Variable Sinn. In diesem Fall ist ein zusätzlicher Command nicht erforderlich.

Das Erstellen eines Commands ist dann sinnvoll, wenn das Programm von einer Befehlszeile oder einem Menü heraus mit Parameter aufgerufen oder submittet werden soll. Der Command sorgt dafür, dass die Parameter korrekt übergeben werden.

Werden CL-Programme direkt aufgerufen, werden numerische Parameter mit einer Definition von 15P 5 angenommen und alphanumerische Felder mit 32A. Ist Dein Parameter kürzer, wird der folgende Speicherbereich übernommen.

Birgitta

Fuerchau
28-08-08, 08:09
Zu diesem Thema hatten wir schon verschiedene Beiträge.

Beim CALL-Kommando werden Alpha-Zeichen in der angegebenen Länge, mindestens jedoch 32 Zeichen übergeben.

Erwartest du längere Argumente musst du entsprechend viele Leerzeichen anhängen.
Das Programm bekommt, wie Dieter schon sagt, nur eine Adresse auf den Wert.
Ist deine Variable länger definiert, greifst du eben auf irgendwas dahinter zu.

Bei CMD's wird automatisch die erwartete Länge reserviert (Ausnahme: variabel lange Felder mit Längeninformation), bei direktem Call mit Variable, reservierst du ja den Speicher bereits selber, was auch manchmal zu den selben Effekten führen kann.

hs
28-08-08, 08:23
Das Problem tritt jedoch nur beim letzten Parameter auf.
Bei den ersten 4 funktionierts einwandfrei.

Da ich keine große Lust habe, alle Programme mit Call auf dieses CL zu ändern:

Könnte ich einen 6. Parameter optional in das CL MEINPG einfügen?

Dann müsste ich die aufrufenden Programme nicht ändern?

Fuerchau
28-08-08, 09:04
Nein, das geht leider nicht.
CLP kennt keine optionalen Parameter.