-
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.
-
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.
-
Dabei ist natürlich darauf zu achten, dass die Prozedur auch definiert ist (siehe meine Beispiele in obigem Link zu CREATE PROCEDURE).
-
 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
-
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.
-
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.
-
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.
-
Auch auf die Gefahr, dass ich mich wiederhole, hier ist immer noch eine geschweifte Klammer {{...}} zuviel !!!!!
Sven
-
@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.
-
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
-
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
-
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.
Similar Threads
-
By matjesfilet in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 03-11-05, 16:02
-
By Neptun in forum IBM i Hauptforum
Antworten: 11
Letzter Beitrag: 28-07-05, 12:54
-
By Neptun in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 21-07-05, 11:39
-
By tschroeder in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 04-05-05, 09:21
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks