[NEWSboard IBMi Forum]
Seite 2 von 2 Erste 1 2
  1. #13
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wenn du das über STRSQL direkt auf der AS/400 ausprobierst:
    "CALL QSYS/QCMDEXC('ADDLIBLE LIB(LIB1)', 0000000018.00000)"
    "CALL QSYS/QCMDEXC('ADDLIBLE LIB(LIB1)', 0000000018,00000)"

    funktionieren beide ! (Decimal-Komma oder -Punkt sind egal)
    Wichtig ist, dass die Parameter durch KOMMA UND LEERZEICHEN getrennt werden.

    Über IBMDA400 gilt:
    "{{CALL QSYS.QCMDEXC('ADDLIBLE LIB(LIB1)', 0000000018.00000)}}"
    Aufrufkonventionen SQL statt SYSTEM (d.h., Qualifizierung mit Punkt statt Schrägstrich).

    Ich hatte allerdings auch diverse Schwierigkeiten und habe deshalb eine Prozedur erstellt, die ich dann direkt per CALL (ohne geschweifte Klammern) aufrufen konnte.
    Ausserdem verwende ich nicht IBMDA400 sondern den ODBC-Treiber von CA, der ist einfach besser als IBMDA400.
    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

  2. #14
    Registriert seit
    Jun 2001
    Beiträge
    727
    Also ich hab das mal getestet :

    Wenn ein Command wie QCMDEXC über das ADODB.Command Objekt aufgerufen wird, sind folgende Hostserver im Zugriff.

    1. Remote-Command Server QZRCSRVS, wenn
    .CommandText = "{{CALL QSYS/QCMDEXC PARM('ADDLIBLE LIB(LIBRARY1)' 0000000022.00000)}}"
    oder
    .CommandText ={{CALL /QSYS.LIB/QCMDEXC.PGM('ADDLIBLE LIB(LIBRARY1)' 0000000022.00000)}}

    2. Database Server QZDASOINIT, wenn
    .CommandText = "{CALL QSYS.QCMDEXC('ADDLIBLE LIB(LIBRARY1)', 0000000022.00000)}"
    oder
    .CommandText = "CALL QSYS.QCMDEXC('ADDLIBLE LIB(LIBRARY1)', 0000000022.00000)"

    Da der ADDLIBLE ja im QZDASOINIT erfolgen soll, damit die Triggerprogramme gefunden werden, ist in den Beispielen eine {..} zu viel.
    Zwei geschweifte Klammern rufen immer den Remote-Command Server, weile der CommandText dann von IBMDA400 als Command interpretiert wird und nicht als SQL-String !!!.

    Hab das eben auch in der technischen Doku zu OLE DB für IBMDA400 gefunden (ist bei iSeries access als Windows-Hilfe Dokument cwbzmtch.hlp dabei):

    "Einfache geschweifte Klammern geben an, dass eine gespeicherte SQL-Prozedur aufgerufen werden soll. Doppelte geschweifte Klammern geben an, dass ein iSeries-Programm aufgerufen werden soll."


    Sven.

  3. #15
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Dabei ist natürlich darauf zu achten, dass die Prozedur auch definiert ist (siehe meine Beispiele in obigem Link zu CREATE PROCEDURE).
    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. #16
    Registriert seit
    Jun 2001
    Beiträge
    727
    Zitat Zitat von Fuerchau
    Dabei ist natürlich darauf zu achten, dass die Prozedur auch definiert ist (siehe meine Beispiele in obigem Link zu CREATE PROCEDURE).
    Sorry Baldur, dem muss ich wiedersprechen.
    Externe Prozeduren müssen nicht registriert sein, SQL-Prozeduren werden automatisch erstellt (C-PGM-Objekt) und registriert. DB2 kann externe Prozeduren trotzdem per SQL-Call aufrufen.

    Einen Nachteil hat das aber schon. Als Entwickler kann ich dann nicht auf die Parameter (z.B. .parameters(1)) zugreifen, d.h. ich muss die Parameter immer im Call direkt und im richtigen Format füllen. Ein prepared SQL-Call geht damit nicht.

    Deswegen funktionieren die oben angegebenen SQL-CALLs auch. (ADDLIBLE)

    Und wenn ich das ganze in doppelte {{.. }} setze, dann wird sowieso der remote command server aufgerufen und hier hat CREATE PROCEDURE eh keine Bedeutung.

    Aber noch mal zurück zum Thema.
    Das Problem war das im QZDASOINIT-Job die Triggerprogramme der zu aktualisierenden Tabelle nicht gefunden wurden.
    Hier geht also nur ein SQL-Call mit ADDLIBLE im aktuellen QZDASOiNIT-Job.
    Weil Triggerprogrgramme nicht die DB2-Namingkonventionen (*SYS oder *SQL) sondern immer in der *LIBL suchen, wenn in den Triggerprogrammen dynamische unqualifizierte CALLS existieren.

    Und leider gibt es bei IBMDA400 nur die properties "default collection" und "catalog library list, welche aber beide keine Auswirkungen auf die Bibliotheksliste haben.
    Im Gegensatz zum ODBC-Treiber, wo ich mit dem Parameter DBQ die Bibliotheksliste setzen kann.
    Deswegen auch noch mal die Empfehlung von Baldur Fürchau den CA-ODBC-Treiber in Verbindung mit den ADO-Objektenklassen zu verwenden:

    cn400.Provider = "MSDASQL"
    cn400.Open "DSN=MEINEDSN; DBQ=LIB1,LIB2"

    Wenn man keine ODBC-Datenquelle anlegen will, geht dann sogar :

    cn400.Open "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=MEINEAS400;DBQ=LIB1,LIB2"

    Hinweis :
    Falls kein Provider festgelegt wird, wird die Eigenschaft standardmäßig mit MSDASQL (Microsoft OLE DB Provider für ODBC) vorgegeben.


    Sven

  5. #17
    Registriert seit
    Jun 2004
    Beiträge
    13
    Ich habe die Syntax in VBA übernommen, ist so OK.

    strSQL2 = "ADDLIBLE LIB(LIB1)"
    ExecCmd strSQL2, cnn400

    strSQL2 = "ADDLIBLE LIB(LIB2)"
    ExecCmd strSQL2, cnn400

    strSQL2 = "ADDLIBLE LIB3)"
    ExecCmd strSQL2, cnn400

    Public Sub ExecCmd(MyCmd As String, myCnn As ADODB.Connection)
    Dim mySql As String
    mySql = "{{CALL QCMDEXC PARM('" & MyCmd & "' " & Format$(Len(MyCmd), "0000000000.00000") & ")}}"
    mySql = Mid(mySql, 1, Len(mySql) - 9) & "." & Right(mySql, 8)
    myCnn.Execute mySql, , adExecuteNoRecords
    End Sub

    Nach Ausführen des Codes kommt es weiter zum gleichen Fehler,
    die Bibliotheken sind nicht im Zugriff...


    Mit Objektsperren arbeiten

    System: MeineAS400

    Objekt: QNUTZER1 Bibliothek: QSYS Art: *USRPRF



    Auswahl eingeben und Eingabetaste drücken.

    4=Job beenden 5=Mit Job arbeiten 8=Mit Jobsperren arbeiten



    Aus-

    wahl Job Benutzer Sperre Status Bereich Thread

    QZRCSRVS QUSER *SHRRD HELD *JOB



    Objekt: QNUTZER1 entspricht der user id.





    Mit Auswahl 5 und 13.Bibliotheksliste anzeigen



    Bibliotheksliste anzeigen

    System: MeineAS400

    Job: QZRCSRVS Benutzer: QUSER Nummer: 165347



    Auswahl eingeben und Eingabetaste drücken.

    5=Objekte in Bibliothek anzeigen



    Aus-

    wahl Bibliothek Art Text

    QSYS SYS Systembibliothek

    QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

    QHLPSYS SYS

    QUSRSYS SYS

    LIB1 USR Installation-Bibliothek ..

    LIB2 USR Installation-Bibliothek ..

    LIB3 USR Installation-Bibliothek ..

    QTEMP USR

    QGPL USR



    Die Bibliotheken LIB1,LIB2,LIB3 wurden hinzugefügt….

    Dieser Job QZRCSRVS läuft in Subsystem QUSRWRK.





    Alle Zugriffe per SQL laufen über den JOB QZDASOINIT.



    Bibliotheksliste anzeigen

    System: MeineAS400

    Job: QZDASOINIT Benutzer: QUSER Nummer: 165348



    Auswahl eingeben und Eingabetaste drücken.

    5=Objekte in Bibliothek anzeigen



    Aus-

    wahl Bibliothek Art Text

    QSYS SYS Systembibliothek

    QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

    QHLPSYS SYS

    QUSRSYS SYS

    QIWS PRD

    QTEMP USR

    QGPL USR





    Dieser Job der den SQL Zugriff startet fehlen die Bibliotheken LIB1,LIB2,LIB3

    Wie kann man dieses Probelm lösen.

  6. #18
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Siehe obige Hinweise, dass "{{call ..}}"-Aufrufe per SBMRMTCMD gelöst werden und daher NICHT im SQL-Serverjob laufen.
    Folge also den Hinweisen von Sven und lass eine {-Klammer weg !!!
    Oder erstelle halt eine Prozedur für QCMDEXC und verwende sie wie in meinem anderen Link.
    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. #19
    Registriert seit
    Jun 2004
    Beiträge
    13
    Ich habe heute nach meinem Urlaub diese Syntax übernommen
    Sie ist so Ok und läuft unter VBA (PARM hat gefehlt).
    Allerdings tritt immer noch der gleiche Fehler auf,
    die Bibliotheken sind für den SQL Zugriff nicht vorhanden.

    VBA-Code

    Set cnn400 = New ADODB.Connection
    cnn400.Open cnnstr400

    strSQL2 = "ADDLIBLE LIB(LIB1)"
    ExecCmd strSQL2, cnn400

    strSQL2 = "ADDLIBLE LIB(LIB2)"
    ExecCmd strSQL2, cnn400

    strSQL2 = "ADDLIBLE LIB(LIB3)"
    ExecCmd strSQL2, cnn400


    Public Sub ExecCmd(MyCmd As String, myCnn As ADODB.Connection)
    Dim mySql As String
    mySql = "{{CALL QCMDEXC PARM('" & MyCmd & "' " & Format$(Len(MyCmd), "0000000000.00000") & ")}}"
    mySql = Mid(mySql, 1, Len(mySql) - 9) & "." & Right(mySql, 8)
    myCnn.Execute mySql, , adExecuteNoRecords
    End Sub


    Auf der AS400:



    Mit Objektsperren arbeiten

    System: MeineAS400

    Objekt: QNUTZER1 Bibliothek: QSYS Art: *USRPRF



    Auswahl eingeben und Eingabetaste drücken.

    4=Job beenden 5=Mit Job arbeiten 8=Mit Jobsperren arbeiten



    Aus-

    wahl Job Benutzer Sperre Status Bereich Thread

    QZRCSRVS QUSER *SHRRD HELD *JOB



    Objekt: QNUTZER1 entspricht der user id.





    Mit Auswahl 5 und 13.Bibliotheksliste anzeigen



    Bibliotheksliste anzeigen

    System: MeineAS400

    Job: QZRCSRVS Benutzer: QUSER Nummer: 165347



    Auswahl eingeben und Eingabetaste drücken.

    5=Objekte in Bibliothek anzeigen



    Aus-

    wahl Bibliothek Art Text

    QSYS SYS Systembibliothek

    QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

    QHLPSYS SYS

    QUSRSYS SYS

    LIB1 USR Installation-Bibliothek ..

    LIB2 USR Installation-Bibliothek ..

    LIB3 USR Installation-Bibliothek ..

    QTEMP USR

    QGPL USR



    Die Bibliotheken LIB1,LIB2,LIB3 wurden hinzugefügt….

    Dieser Job QZRCSRVS läuft in Subsystem QUSRWRK.





    Alle Zugriffe per SQL laufen über den JOB QZDASOINIT.



    Bibliotheksliste anzeigen

    System: MeineAS400

    Job: QZDASOINIT Benutzer: QUSER Nummer: 165348



    Auswahl eingeben und Eingabetaste drücken.

    5=Objekte in Bibliothek anzeigen



    Aus-

    wahl Bibliothek Art Text

    QSYS SYS Systembibliothek

    QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

    QHLPSYS SYS

    QUSRSYS SYS

    QIWS PRD

    QTEMP USR

    QGPL USR





    Dieser Job der den SQL Zugriff startet fehlen die Bibliotheken LIB1,LIB2,LIB3

    ich denke hier ligt das Problem!!!!

    Hat noch jemand einen Tip.

  8. #20
    Registriert seit
    Jun 2001
    Beiträge
    727
    Auch auf die Gefahr, dass ich mich wiederhole, hier ist immer noch eine geschweifte Klammer {{...}} zuviel !!!!!

    Sven

  9. #21
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    @Sven
    Wie heißts so schön: wer lesen kann ist klar im Vorteil !
    Wahrscheinlich sollte man die Fehler in 10-facher Schriftgröße mit dick Rot markeiren. Also mehr als auf die doppelte {-Klammer hinzuweisen geht wirklich nicht.
    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

  10. #22
    Registriert seit
    Jun 2004
    Beiträge
    13
    In der Eile habe ich übersehen, dass es mehrere Seiten zu diesem Thema gibt
    und dadurch auch den Beitrag von Sven nicht gelesen.
    Ich probiere es sofort aus.

    rst

  11. #23
    Registriert seit
    Jun 2004
    Beiträge
    13
    Danke Sven für den Tipp.

    Dein Antworttext.
    Zwei geschweifte Klammern rufen immer den Remote-Command Server, weile der CommandText dann von IBMDA400 als Command interpretiert wird und nicht als SQL-String !!!.

    Ich habe es mit einer geschweiften Klammer probiert.
    Es ist richtig das dann der Database Server Job QZDASOINIT angesprochen wird,
    aber wie Du schon schreibst "von IBMDA400 als Command interpretiert wird und nicht als SQL-String !!!." er wird als SQL interpretiert und bringt mir somit einen SQL Fehler.

    Der Zweite Tipp war Super...

    Mit dem ODBC Treiber kann mann das Problem Lösen.
    folgender Link gibt noch nützliche Hinweise (Listing3):
    http://www-106.ibm.com/developerworks/db2/library/techarticle/dm-0402chong2/index.html#listing2


    Beispiel Programm:
    ODBC-Treiber in Verbindung mit den ADO-Objektklassen.

    Sub Artikel_anlegen()

    Dim Sachn$, strSQL1$
    Dim Merk1 As Boolean
    Sachn = "'1234-0235'"

    Const IP = "192.1.1.xxx"
    'Const cnnstr400 = "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=" & IP & ";DBQ=LIB1,LIB2,LIB3,LIB4"

    Dim cnn400 As ADODB.Connection
    Dim cmd400 As ADODB.Command
    Dim rst400 As ADODB.Recordset

    Merk1 = True

    On Error Resume Next

    'Open Connection
    Set cnn400 = New ADODB.Connection
    cnn400.ConnectionString = "DRIVER={Client Access ODBC Driver (32-bit)};SYSTEM=" & IP & ";DBQ=Lib1,LIB2,LIB3,LIB4"
    cnn400.Provider = "MSDASQL"
    cnn400.CursorLocation = adUseClient
    cnn400.Open , "user", "pwd"

    strSQL1 = _
    "SELECT TSACHN " & _
    "FROM LIB1.Artikelstamm " & _
    "WHERE (Artikel =" & Sachn & ") "

    'Set the command text
    Set cmd400 = New ADODB.Command
    Set cmd400.ActiveConnection = cnn400
    With cmd400
    strSQL1 = _
    "SELECT Artikel " & _
    "FROM LIB1.Artikelstamm " & _
    "WHERE (Artikel =" & Sachn & ") "
    .CommandTimeout = 100
    .CommandText = strSQL1
    .CommandType = adCmdText
    .Execute
    End With

    'Open the recordset
    Set rst400 = New ADODB.Recordset
    Set rst400.ActiveConnection = cnn400
    rst400.Open cmd400
    'Prüfen ob Artikelnummer im Teilestamm vorhanden ist.
    While Not rst400.EOF
    MsgBox "Sachnummer ist im Artikelstamm vorhanden."
    Merk1 = False
    rst400.MoveNext
    Wend

    If Merk1 = True Then
    strSQL1 = _
    "INSERT INTO LIB1.Artikelstamm (Artikel) VALUES(" & Sachn & ")"
    With cmd400
    .CommandText = strSQL1
    .CommandType = adCmdText
    .Execute
    End With
    End If
    'close the connection
    cnn400.Close
    Set cmd400 = Nothing
    Set rst400 = Nothing
    Set cnn400 = Nothing
    End Sub

    Dieses Programm läuft unter VB6.

    Der Database Server Job QZDASOINIT hat somit die gewünschten Bibliotheken
    im Zugriff..

    Bibliotheksliste anzeigen

    System: MeineAS400

    Job: QZDASOINIT Benutzer: QUSER Nummer: 165496



    Auswahl eingeben und Eingabetaste drücken.

    5=Objekte in Bibliothek anzeigen



    Aus-

    wahl Bibliothek Art Text

    QSYS SYS Systembibliothek

    QSYS2 SYS Systembibliothek für einh. Anwendungsunterstützung

    QHLPSYS SYS

    QUSRSYS SYS

    QIWS PRD

    LIB1 USR

    LIB2 USR

    LIB3 USR

    LIB4 USR

  12. #24
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Der IBMDA400 hat noch ein paar weitere Nachteile:

    Journalisierung wird NICHT unterstützt (warum auch immer) und, was ich in der Verbindungsfolge IMMER einstelle (inzwischen Default): COMPRESSION=1 um die Datenkomprimierung einzuschalten (von IBMDA400 nicht unterstützt).

    Bei LAN's gibt es nämlich keine Einstellmöglichkeit (wäre schön) sondern nur bei WAN's. Das Abrufen der Daten erfolgt tatsächlich schneller.
    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. Zugriff mit MSAccess auf AS400 via OLE-DB
    By matjesfilet in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 03-11-05, 16:02
  2. SQL-Befehl "DELETE" macht Probleme
    By Neptun in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-07-05, 12:54
  3. Bibliotheks-Angabe bei OLE DB Verbindung mit IBMDA400
    By Neptun in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 21-07-05, 11:39
  4. Hartcodierter OLE DB Zugriff auf AS/400-Datenbank
    By tschroeder in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-05-05, 09:21
  5. EASYCOM OLEDB
    By Suomi in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 02-03-05, 09:34

Berechtigungen

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