PDA

View Full Version : free rpg xml-into Abbruch CPE3025 (Parameterübergabe für xml-into)



fdh
14-01-20, 11:12
Hallo Forum,
Ich bin verwirrt..


folgendes Statements:
clear orders;
xml-into orders %xml(LocFile:LocOptions);


ich fülle einmal fix:
LocFile = '/XMLOrderIN/20210921_235825_1SRDXU_1.xml'
Alles ist bestens.

Dann fülle ich LocFile über Parameter, die an das Programm übergeben werden:
LocFile = parameter;
Abbruch CPE3025 Kein Pfad oder keine Bibliothek mit diesem Namen
Die Inhalte sind identisch lt. debug.


Die Feldlängen ebenfalls.
dcl-s LocFile char(128);
dcl-pi Order02 extpgm('Order02');
parameter char(128);
end-pi;


Parameter kommt aus einem CLLE dcl var(&parameter) type(*char) len(128)


Stelle ich PI auf varchar um … zerlegt es mir den Parameter
dcl-s LocFile varchar(128);
dcl-pi Order02 extpgm('Order02');
parameter char(128);
end-pi;
....5...10...15...20...25...30...35...40...45...50 ...55...60
1 'MLOrderIN/20210921_235825_1SRDXU_1.xml '
61 ' '
121 ' /X'


Mit der Bitte um Entwirrung.

Franco

manuel.marcos
14-01-20, 12:16
Hallo,

du füllst im CL eine Char Variable im RPG Interface verwendest du aber einen Varchar... Daher dürfte die Zerlegung kommen, im Varchar wird in den ersten Bytes die Länge des String gespeichert.

Gruß,
Manuel

B.Hauser
14-01-20, 12:32
VarChar und Char sind unterschiedliche Datentypen.
Solange wir nur mit RPG und entsprechenden Prototypen arbeiten, ist es zumindest bei Input/Only Parametern (CONST / VALUE) egal, ob der übergebene Parameter mit fixer oder variabler Länge definiert ist.

Erfolgt der Aufruf aus CL, funktioniert dieser Mechanismus nicht. D.h. von CL werden die Daten mit fixer Länge übergeben, was im Untergrund bedeutet es wird ein Pointer auf dem Anfang des Feldes übergeben. Solange beide Felder mit fixer Länge definiert sind ist das auch kein Problem.
Wenn jedoch ein Feld mit variabler Länge definiert ist, werden 2 (oder bei großen Feldern) 4 führende (unsichtbare) Bytes in der die variable Länge hinterlegt wird hinzugefügt.
Wird jetzt das Programm aus CL aufgerufen und nur ein Pointer übergeben, zeigt dieser jetzt auf den Anfang des variablen Feldes, also auf das erste der beiden führenden Bytes. Damit werden u.U. nicht numerische Werte übertragen und das Programm macht den Abflug.

Am einfachsten ist es du definierst die Variable LocFile mit variabler Länge lädst den Parameter-Wert um und entfernst dabei die führenden und folgenden Blanks.


DCL-S LocFile VarChar(128);

LocFile = %Trim(Parameter);


Birgitta

Fuerchau
14-01-20, 17:09
Vom CLLE kannst du auch eine Struktur definieren.
Die ersten 2 Stellen sind %BIN gefolgt von den Daten in der Länge.
Bei CLP kann man auch einen
CHGVAR %bin(&ziel 1 2) = 128
CHGVAR %sst(&ziel 3 128) = 'Name der Datei'
verwenden.
Dies intspricht dann VARCHAR in ILERPG.

fdh
15-01-20, 08:13
Hallo Manuel,

vielen Dank für den Hinweis.

Franco

fdh
15-01-20, 08:15
Hallo Birgitta,

%trim und schon wars gut.

Danke.

Gruß Franco

fdh
15-01-20, 08:17
Hallo Fuerchau,

das probiere ich natürlich auch...

Gruß Franco