[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Nennewitz Besucher/Guest
    Zitat Zitat von Fuerchau
    execute "call qcmdexc('dspfd myfile ... outfile(qtemp/mymbr)' 0000000nnn.00000)"

    nnn = Länge des Commands mit 10 Vorkomma und 5 Nachkomma

    Open "Select * from qtemp/mymbr"
    Also ich habe jetzt mal versucht die Teildateien der Tabelle GES.S8 in die temporäre Datei GES.KANNWEG auszugeben.

    Ich nehme mal an das 'Länge des Commands' bedeutet, wieviel Zeichen zwischen den beiden Hochkomma vorkommen hier also 33. Das "..." habe ich ignoriert.

    Mein Versuch war folgender:

    CALL QCMDEXC('DSPFD GES.S8 OUTFILE(GES.KANNWEG)' 0000000033.00000)

    Alternative habe ich auch die Variante mit / statt . probiert also so:

    CALL QCMDEXC('DSPFD GES/S8 OUTFILE(GES/KANNWEG)' 0000000033.00000)

    Die AS/400 meint darauf:

    [IBM][Client Access Express ODBC-Treiber (32-Bit)][DB2/400 SQL]SQL0104 - Token 000000033.00000 ungültig. Gültige Token: ),.(#-104)

    Außerdem habe ich noch statt "000000033.00000" "000000033,00000" probiert. Geht aber auch nicht.

    Was mache ich falsch?

    Grüße,
    Christian Nennewitz

  2. #2
    Registriert seit
    Apr 2002
    Beiträge
    792
    Moin,

    falsch machst du das du bevor du den eigentlichen Befehl ausführst nicht die Stored Procedure erstellst wie Baldur es beschrieben hat. Du musst dir die SP erstellen
    PHP-Code:
    CREATE PROCEDURE QTEMP.QCMDEXC
    (IN PARM1 CHAR (512), IN PARM2 DEC(155))
    LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL
    NAME QSYS
    .QCMDEXC PARAMETER STYLE GENERAL 
    und im Anschluss kannst du die SP per Call aufrufen. Du übergibst im Parameter 1 deinen richtigen Befehl und dann im Parameter 2 die Länge. Wichtig "/" statt "." im Befehl!

    Gruß

    Sascha

  3. #3
    Nennewitz Besucher/Guest
    Zitat Zitat von JonnyRico
    CREATE PROCEDURE QTEMP.QCMDEXC
    (IN PARM1 CHAR (512), IN PARM2 DEC(15, 5))
    LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL
    NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL
    Hallo Sascha.

    Ich habe das mit dem CREATE PROCEDURE ausprobiert. Das wurde anstandslos verarbeitet. Hurra!

    Dann habe ich wieder probiert:

    CALL QCMDEXC('DSPFD GES/S8 OUTFILE(GES/KANNWEG)' 0000000033.00000)

    Aber leider ist die AS/400 immernoch der Meinung: "Token 000000033.00000 ungültig. Gültige Token: ),.(#-104)".

    Kannst Du mir nochmal weiterhelfen?

    Grüße,
    Christian

  4. #4
    Registriert seit
    Apr 2002
    Beiträge
    792
    Der Command ist auch falsch und das Komma fehlt!
    CALL QCMDEXC('DSPFD FILE(GES/S8) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*ALL) OUTFILE(GES/KANNWEG)', LÄNGE)

  5. #5
    Nennewitz Besucher/Guest
    Hallo Sascha.

    Juhuu!

    Es hat funktioniert. Vielen herzlichen Dank für Deine Hilfe. Dank auch an Baldur.

    Damit sich auch andere daran erfreuen können habe ich die Lösung hier nochmal zusammengefaßt:

    Teildateien per SQL auflisten
    =============================

    Aufgabenstellung: Es soll aus der Tabelle S8 in der Bibliothek GES die Teildateien ermittelt werden. Natürlich geht das auch mit anderen Bilbiotheks bzw. Tabellennamen.

    1.) Stored Procedure "QCMDEXC" erstellen.
    -----------------------------------------
    CREATE PROCEDURE QTEMP.QCMDEXC (IN PARM1 CHAR (512), IN PARM2 DEC(15, 5)) LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL

    2.) Stored Procedure "QCMDEXC" aufrufen um damit eine temporäre Tabelle zu erstellen, die die Namen der Teildateien enthält. Der Parameter "OUTFILE(GES/KANNWEG)" bedeutet, daß die temporäre Tabelle "KANNWEG" heißt und in der Bibliothek "GES" erstellt wird. Die Zahl 81 ist die Anzahl Zeichen die zwischen den beiden Hochkommas stehen. Muß man abzählen.
    -----------------------------------------
    CALL QTEMP.QCMDEXC('DSPFD FILE(GES/S8) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*ALL) OUTFILE(GES/KANNWEG)', 81)

    3.) Der Inhalt der temporären Datei kann jetzt ganz normal per SELECT selektiert werden. Die Namen der Teildateien befinden sich im Feld "MBNAME".
    -----------------------------------------
    SELECT * FROM GES.KANNWEG

    4.) Nachdem man alles gesehen hat, kann man die temporäre Tabelle wieder entfernen.
    -----------------------------------------
    DROP TABLE GES.KANNWEG

    5.) Und die Stored Procedure, die in Punkt 1 erstellt wurde, ebenfalls.
    -----------------------------------------
    DROP PROCEDURE QTEMP.QCMDEXC

    << ENDE DES TEXTES >>

  6. #6
    Registriert seit
    Jun 2001
    Beiträge
    727
    Zitat Zitat von JonnyRico
    Der Command ist auch falsch und das Komma fehlt!
    CALL QCMDEXC('DSPFD FILE(GES/S8) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*ALL) OUTFILE(GES/KANNWEG)', LÄNGE)
    Korrekt JonnyRico!
    Noch ein Hinweis:
    Das *PGM-Objekt QCMDEXC muss nicht mit store procedure registriert werden, sondern funktioniert auch so, wenn sie mit QSYS.QCMDEXC qualifizert angegeben wird. Das funktioniert bei der DB2/400 im Prinzip mit allen *PGM-Objekten, sofern keine Parameter/Result Sets zurückgegeben werden müssen.
    Und wenn du die im Parameter OUTFILE angegebene Tabelle in der QTEMP erstellst kannst du dir auch das drop table sparen, sofern du das connect-Objekt am Ende ordentlich schliesst.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.782
    Na geht doch

    Die Prozedur ist tatsächlich nicht nötig, erleichtert aber einfach den Aufruf.
    Ich kann dann den Call auch per Command mit Parametern ausführen (Beispiel ADO):
    myCmd.CommandText="call qtem.qcmdexc (?, ?)"
    mycmd(0)="das Kommando"
    myCmd(1)=len(mycmd(0))

    Ohne Prozedur (siehe ClientFehlermeldung):
    "call lib.prog (parm1, parm2, ....)

    Dabei werden die Parameter automatisch in eine korrekte Form übersetzt:
    Zeichenketten immer in der angegebenen Länge
    Zahlen immer gepackt in der angegebenen Länge !
    - also um dec(15,5) zu erhalten eben 0000000000.00000

    In meinem obigen Beispiel habe ich halt mal das Komma vergessen, sorry
    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. per SQL Feld ändern...
    By svente in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 23-01-07, 10:49
  2. Teildateien mit sql auslesen
    By chrisssiie in forum NEWSboard Programmierung
    Antworten: 19
    Letzter Beitrag: 09-01-07, 11:53
  3. update per sql
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 25-09-06, 09:22
  4. Kopieren per SQL
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 18-07-06, 10:36
  5. Sortierung per SQL
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-05-06, 13:40

Berechtigungen

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