Anmelden

View Full Version : Variable Length Fields



hteufl
17-10-13, 13:24
Hallo!

Ich habe wieder einmal ein Problem. Ich lese die Datei QUSRSYS/QAOKL12A für den Familien-/Vornamen eines Benutzers. Mein Problem ist nun, dass ich die Variable-Length-Fields nicht korrekt per Modul in ein Programm übermitteln kann.
Im aufrufenden Programm wird das Module wie folgt aufgerufen:

Dmd_emailu pr extproc('MD_EMAILU')
D puser 10a const
D pemailadr 300a varying
D pFName 42a varying
D pVName 22a varying
D prtnsts 1a
D*
D puser s 10a
D pemailadr s 300a varying
D pFName s 42a varying
D pVName s 22a varying

Das Module für die Namensermittlung empfängt folgende Parameter:

Dinput pr extproc('MD_EMAILU')
D pusernm 10a const
D pemailadr 300a varying
D pFName 42a varying
D pVName 22a varying
D prtnsts 1a


Mit pFName = wok9srcl wird immer die komplette Feldlänge in pFName eingetragen (42Byte). Mit pFName = %trimr(wok9srcl) wird immer das Längenfeld mitgespeichert und somit die Länge von pFName um 2 Byte zu lang.


Außerdem dachte ich immer, dass wenn ein Variable-Length-Field in ein Zeichenfeld übertragen wird dies immer ohne der Längenangaben erfolgt?!? Text = W0K9SRCL ergibt aber immer eine 1:1 Kopie des Inhaltes von WOK9SRCL.
Beide Module habe mit CVTOPT(*VARCHAR) umgewandelt.

Wie bekomme ich jetzt den Inhalt der Variable-Length-Fields einfach in ein normales Zeichenfeld?

Danke für Eure Antworten im voraus

Hermann

Anton Gombkötö
17-10-13, 15:19
"Beide Module habe mit CVTOPT(*VARCHAR) umgewandelt."

Und warum?
Was erhoffst Du Dir davon?

Fuerchau
17-10-13, 15:25
Ein Varying-Feld beinhaltet immer 2-byte-Längeninformation zusätzlich!

"MyVarField 30 varying" ist also tatsächlich 32 Bytes lang, kann aber nur max. 30 Zeichen aufnehmen.
Die Anpassungen regelt das Programm automatisch:

D MyField 30
D MyVarField 30 varying

MyField = MyVarField; // übertragen und ggf. mit Leerzeichen auffüllen
MyVarField = MyField; // Zielfeld ist immer mit 30 zeichen gefüllt
MyVarField = %trimr(myField); // Blanks entfernen und übertragen, die Länge ist nun die Anzahl der Zeichen

Nun kommt es auf dein aufzurufendes Programm an, ob es tatsächlich mit Varying-Feldern arbeitet!
Prüfe also mal die Definitionen.

Einen Fehler zur Laufzeit (MCH....) kann es im empfangenden Programm bei varying geben, wenn das Empfangsfeld zu klein definiert ist.

D Empfang 100 varying
D Sender 200 varying

Bis 100 Zeichen funktioniert das, ab 101 nicht mehr.

camouflage
17-10-13, 15:28
Na ja, wieso nicht so:

Text = %subst(W0K9SRCL:1:%len(W0K9SRCL)) ?
ps. Baldur hat natürlich, wie fast immer, recht ;-)

hteufl
18-10-13, 11:10
Hallo und danke an Alle!

Die Lösung war natürlich die einfachste. Ich habe beide Module ohne CVTOPT(*VARCHAR) compiliert und alles ist gelaufen wie es sollte.
Die Felder aus QAOKL12A wurden beim DEBUG ohne Längenangaben angezeigt und ein pFNAME = WOK9SRCL funktioniert auch ohne dass die Längenangabe in PFName steht!!!


Danke für eure Hilfe und ein schönes Wochenende

Hermann

Fuerchau
18-10-13, 11:33
Wie war das noch mal mit dem Lesen?

*VARCHAR
Gibt an, daß Datenarten für Zeichenfelder variabler
Länge als Zeichenfelder fester Länge deklariert werden sollen.

Lässt man diese Option weg, werden die Felder eben wieder als varying definiert, so wie es sein sollte.

Eigentlich stammt diese Option aus OPM-RPG, als varying nicht unterstützt wurde und man sich da mit etwas Aufwand selber helfen musste.
Wird nun ein OPM per CVTRPGSRC in ILERPG überführt, wird die Option natürlich benötigt, damit die Programme ohne Änderung weiter funktionieren.

Für neue ILE's braucht man keine der CVTOPT's mehr, da alles native von ILERPG unterstützt wird.