[NEWSboard IBMi Forum]
  1. #1
    hs is offline [professional_User]
    Registriert seit
    Jun 2001
    Beiträge
    364

    Angry Ungültige Zeichen im Übergabeparamter bei CL

    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

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.288
    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

    Zitat Zitat von hs Beitrag anzeigen
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    KM is offline [professional_User]
    Registriert seit
    Apr 2003
    Beiträge
    1.005
    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

  4. #4
    hs is offline [professional_User]
    Registriert seit
    Jun 2001
    Beiträge
    364
    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

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.879
    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
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.270
    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.
    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

  7. #7
    hs is offline [professional_User]
    Registriert seit
    Jun 2001
    Beiträge
    364
    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?

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.270
    Nein, das geht leider nicht.
    CLP kennt keine optionalen Parameter.
    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. Dynamisches SQL in einem CL erstellen
    By Sony in forum IBM i Hauptforum
    Antworten: 27
    Letzter Beitrag: 20-07-09, 21:48
  2. Programmbibliothek in einem Cobol oder CL Programm ermitteln
    By schatte in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 10-01-07, 11:32
  3. Java, JDBC, iSeries und Tschechische/Russische/Chinesische Zeichen
    By Christian.Hesse in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 04-08-06, 10:04
  4. Übergabeparameter im CL Script
    By bo1 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 23-06-06, 15:00
  5. Objektnamen dynamisch dem SAVOBJ im CL zuordnen
    By becama in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 11-08-05, 15:05

Berechtigungen

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