[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Mar 2003
    Beiträge
    35

    Angry QCMDEXC und Parameterlänge

    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)));


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

    Was mache ich falsch ?

    Für Anregungen wäre ich echt Dankbar

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    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

  3. #3
    Registriert seit
    Mar 2003
    Beiträge
    35
    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 ?

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Mar 2003
    Beiträge
    35
    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 ?

  6. #6
    Registriert seit
    May 2002
    Beiträge
    1.121
    schau bei dem dieter seine HP nach. da ist ein beispiel für die C-Funktion system(). ich nutze nur noch diese.

    tschau ronald

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo


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


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

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


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

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.875

    Fixe Länge

    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.
    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

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.875

    system()

    Und dann auch noch falsch geschrieben!
    Es heisst natürlich system() und nicht System().

    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

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Mar 2003
    Beiträge
    35
    Hallo Herr Bender,

    Ich bin nun mal ein "Augenmensch" . in welchem Handbuch finde ich denn

    system() beschrieben.

    Gruß Franz

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo Herr Franz,

    ILE C runtime library reference

    mfg

    Dieter Bender
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Parameterlänge bei crtcmd
    By TARASIK in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 23-08-06, 14:11
  2. QCMDEXC & OVRPRTV
    By muadeep in forum NEWSboard Programmierung
    Antworten: 9
    Letzter Beitrag: 24-06-06, 23:59
  3. RCVMSG nach QCMDEXC
    By flytokiwi in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 29-03-06, 13:49
  4. Nachrichtenbehandlung nach QCMDEXC in COBOL/400
    By Lichtblitz in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 25-07-05, 12:44
  5. V5R3 & QCMDEXC
    By Freezer in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 02-12-04, 13:38

Berechtigungen

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