[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2005
    Beiträge
    81

    Variable Length Fields

    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

  2. #2
    Registriert seit
    Nov 2012
    Beiträge
    51

    Warum?

    "Beide Module habe mit CVTOPT(*VARCHAR) umgewandelt."

    Und warum?
    Was erhoffst Du Dir davon?

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Na ja, wieso nicht so:

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

  5. #5
    Registriert seit
    Apr 2005
    Beiträge
    81
    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

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. exec sql drop variable
    By Robi in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 17-01-13, 15:31
  2. STRPCCMD mit einer Variable steuern
    By stoerfang in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 28-11-06, 14:32
  3. Variable Zahlenkonvertieren
    By Xanas in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 28-08-06, 12:21
  4. cl declare variable
    By TARASIK in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-08-06, 10:09
  5. String mit HexInhalt muss als Hex-Wert in Variable
    By cheffe1008 in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 16-05-06, 07:45

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •