PDA

View Full Version : QCMDEXC und Parameterlänge



Seiten : [1] 2

fabax
27-02-04, 08:05
Hallo zusammen ich habe da ein Problem mit der Parameterlänge von QCMDEXC

Problemstellung

Das Programm soll den Parameter 32700 Byte an ein Programm übergeben das erst zur Laufzeit (ObjCaller) bekannt ist. Und der Inhalt des Parameters ist nicht immer gleich lang.

D RunObjShell PR EXTPGM('QCMDEXC')
D Cmd 32000A Const Options(*Varsize)
D CmdLong 15P 5 const

.
.
RunString = 'CALL PGM(' + %TRIM(ObjCaller) +
') PARM(' + %trim(Datas) + ')';

RunObjShell(RunString : %len(%TRIM(RunString)));


:confused: Das Programm bricht an dieser Stelle mit "falscher Länge ab"

Was mache ich falsch ?

Für Anregungen wäre ich echt Dankbar

Robi
27-02-04, 08:20
mach den %Len(%trim(...)) in eine Variable


d cmdlen 15p 5 inz

eval cmdlen = %len(%trim(...))
RunObjShell(RunString : cmdlen)

'Const' kann kein Ausdruck sein

Robi

fabax
27-02-04, 08:27
Das hatte ich zuvor schon mal, hat auch nicht geholfen
') PARM(' + %TRIM(Datas) + ')';
// RunStrLenght = 32000;
RunStrLenght = %len(%TRIM(RunString));
RunObjShell(RunString : RunStrLenght);
// RunObjShell(RunString : %len(%TRIM(RunString)));
endif;
Ich Übergebe dabei das Ergebnis aus einem Trigger - also den kompletten Inhalt eines Datensatzes als String
kann hier das Problem liegen ?

BenderD
27-02-04, 08:31
Hallo,

ich sehe zwar momentan nicht, was da faul ist, bin mir aber nicht sicher ob der Prototyp mit den Options(*varsize) stimmt. Ich nehme hier eigentlich immer die C Funktion system(). Prototyp und Beispiel findest Du in meiner Freeware Abteilung auf meiner WebPage.

Dieter Bender

fabax
27-02-04, 08:58
:D Hallo das Problem liegt nicht an dem Sourcecode. Sondern wie ich herausgefunden habe an dem Inhalt des Strings.

(Auszug aus dem Datensatz)
170 " k "MFBA ID 1010


Ich denke das liegt an den beiden " . Die werden anscheinend beim EXC als Stringende interpretiert , was zur falschen Länge führt.

Was gleich zur nächsten Frage führt.

gibt es eine andere Möglichkeit ausser QCMDEXEC, ein Programm variabel zu callen ?

malzusrex
27-02-04, 09:05
schau bei dem dieter seine HP nach. da ist ein beispiel für die C-Funktion system(). ich nutze nur noch diese.

tschau ronald

BenderD
27-02-04, 09:37
Hallo

<quote>
Ich denke das liegt an den beiden " . Die werden anscheinend beim EXC als Stringende interpretiert , was zur falschen Länge führt.
</quote>

die müsstest Du escapen, sprich jeweils doppeln und dann nur einfach mitzählen

<quote
gibt es eine andere Möglichkeit ausser QCMDEXEC, ein Programm variabel zu callen ?
</quote>

system habe ich schon genannt, der hat obiges Problem nicht, da er mit Null terminated String arbeitet.

ansonsten natürlich noch dynamischer procedure call, habe ich mal einen Artikel zu in Midrange Magazin geschrieben und gibt es als Serviceprogramm ebenfalls in meiner Freeware Abteilung. Schau mal unter Stichwort REFLECTION nach.

Dieter Bender

B.Hauser
27-02-04, 09:52
Hallo Fabax,

ich gehe davon aus, dass Dein Feld RunString mit fixer Länge definiert ist.
(sonst würdest Du wahrscheinlich kein %Trim() verwenden.

Du hast 3 Möglichkeiten:
1. QCMDEXC(%Trim(RunString): %Len(%Trim(RunString));
2. QCMDEXC(RunString: %Len(RunString);
3. Das Feld RunString mit variabler Länge zu definieren
(Schlüssel-Wort varying)
Dann kannst Du den QCMDEXC wie folgt verwenden.
QCMDEXC(RunString: %Len(RunString)

Das Problem liegt daran, dass QCMDEXC nur über die übergebene Länge (2. Parameter) geht.
Und die stimmt nicht mit der tatsächlichen übergebenen Länge überein!

Options(*VarSize) im QCMDEXC ist eigentlich überflüssig, da Schlüsselwort CONST verwendet wird.

@Ronald und Dieter
System() hat nur einen kleinen Schönheitsfehler, die Fehlermeldung, die die iSeries schickt, kann nicht nur nicht abgefangen werden, sonder wird sogar aus dem Joblog gelöscht.

Die Message-Id kann importiert werden, aber sehr oft fehlen die variablen Message-Texte. Dies ist besonders schade, wenn die Escape-Message weiter gesendet werden soll.

B.Hauser
27-02-04, 09:55
Und dann auch noch falsch geschrieben!
Es heisst natürlich system() und nicht System().

Birgitta

BenderD
27-02-04, 10:22
Hallo,

wenn wir schon bei den Unterschieden von system und QCMDEXC sind:

system verhält sich in Bezug auf den Call Stack anders als QCMDEXC, was man bei OVRxxx im Hinterkopf haben muss.

@Birgitta: Lösung 1,2 und 3 funktionieren in diesem Fall nicht, da der Parameter String Hochkommas enthält
Das mit dem Fehler abfangen hast Du ja selber schon wieder gerade gestellt. Das geht schon, nur anders als bei QCMDEXC.

mfg

Dieter Bender