-
Das Triggerprogramm selber kann einen ADDLIBLE per QCMDEXC ausführen (in der *INZSR). Dadurch dürfte das Problem behoben sein.
Oder per SQL dann folgendes:
With cmd400
Str = "ADDLIBLE LIB(lib2)"
.Execute "{{call qcmdexc ('" & Str & "', " & format$(len(Str), "0000000000.00000") & ")}}"
end with
Wobei es besser ist, wenn das Triggerprogramm es macht, da auch auf anderem Wege SQL (e.g. STRSQL) aufgerufen werden könnte.
-
Hallo Herr Furchau,
Ich habe den Hinweis umgesetzt.
nachfolgender Programm-Code bring den gleichen Fehler
wie gehabt..
strSQL1 = _
"INSERT INTO lib1.file1 (TSACHN) VALUES(" & Sachn & ")"
With cmd400
strSQL2 = "ADDLIBLE LIB(lib2)"
.Execute "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & Format$(Len(strSQL2), "0000000000.00000") & ")}}"
strSQL2 = "ADDLIBLE LIB(lib3)"
.Execute "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & Format$(Len(strSQL2), "0000000000.00000") & ")}}"
.CommandText = strSQL1
.CommandType = adCmdText
.Execute
End With
ich habe den Programmcode geändert in dem ich ein SQL Statement
mit STRQMQRY aufrufe. Nachfolgender Code
With cmd400
strSQL2 = "ADDLIBLE LIB(lib2)"
.Execute "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & Format$(Len(strSQL2), "0000000000.00000") & ")}}"
strSQL2 = "ADDLIBLE LIB(lib3)"
.Execute "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & Format$(Len(strSQL2), "0000000000.00000") & ")}}"
strSQL2 = "STRQMQRY QMQRY(lib1/file1) SETVAR((SACHN " & Sachn & "))"
.Execute "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & Format$(Len(strSQL2), "0000000000.00000") & ")}}"
End With
Dieser VBA-Code wird ohne Fehler abgearbeitet aber Sachn ist in lib1/file1
nicht vorhanden. Das Jobprotokoll zum Job QZDASOINIT sagt auch nichts aus.
????????
-
Der Execute muss auf dem Connection-Object erfolgen, da er ja direkt ausgeführt wird.
Als Command-Objekt gilt folgendes:
with cmd400
strSQL2 = "ADDLIBLE LIB(lib2)"
.Commandtext = "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & Format$(Len(strSQL2), "0000000000.00000") & ")}}"
.execute
end with
Der Execute eines Command führt Commandtext aus !
Der Execute eines Connection führt den Argument-Text direkt aus !
Überprüfe doch im Job, ob die Lib hinzugefügt wurde.
Gibt es einen Fehler ?
Warum kann das Triggerprogramm das nicht selber machen ?
-
Hallo Herr Fuerchau,
Ich habe beides ausprobiert..
mittels Connection Object:
With cnn400
strSQL2 = "ADDLIBLE LIB(Lib1)"
strsql1 = "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & "0000000023.00000)}}"
.Execute strsql1
End With
mittels Command Objekt:
Set cmd400 = New ADODB.Command
Set cmd400.ActiveConnection = cnn400
With cmd400
strSQL2 = "ADDLIBLE LIB(Lib1)"
strsql1 = "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & "0000000023.00000)}}"
MsgBox strsql1
.CommandText = "{{CALL QSYS.QCMDEX('" & strSQL2 & "'," & "0000000023.00000)}}"
.CommandType = adCmdText
.Execute
End With
VB6 bringt mir einen Laufzeitfehler
CPF0006 - Im Befehl ist ein Fehler.
Ich hoffe Sie haben noch einen Tipp.
-
Zumindest bist du da einen Schritt weiter !
QCMDEXC wird mit 2 Parametern aufgerufen, 1. Zeichen, 2. gepackt 15.5.
Daher die vielen Nullen, da der DB-Server Zahlen "as is" in gepackt formatiert (hier also 10 VK + 5 NK = 15.5).
Der 2. Parameter muss GENAU die Länge des Kommandos enthalten !!!
Ich komme nur auf 18 Stellen und nicht auf 23, daher hatte ich auch die FORMAT$-Anweisung vorgeschlagen, die ich dir auch empfehlen würde.
Damit könntest du dir dann eine variable Funktion stricken:
public sub ExecCmd(MyCmd as string, myCnn as ADODB.Connection)
dim mySql as string
mySql = "{{CALL QSYS.QCMDEX('" & myCmd & "'," & format$(len(MyCmd), "0000000000.00000") & ")}}"
myCnn.Execute mySql,,adExecuteNoRecords
end sub
Ein Fehlerbehandlung ist nicht nötig, da der Aufrufer dies übernehmen sollte.
-
Hallo Herr Fuerchau
mein Original String ist natürlich 23 stellig.
Ich habe die Länge fix angegeben, da Format$
0000000023,00000 zurückgibt also stadt einen Punkt ein
Komma. Aber egal ob ich eine 23, 10, 18 , Komma oder Punkt
einsetze bzw. mit ihrer Procedure arbeite und den zusätzlichen
Parameter im Execute, es kommt immer der gleiche Fehler.
CPF0006 - Im Befehl ist ein Fehler.
Also im VB6 Code.
Der Job Qzdasoinit auf der As400 ist noch nicht vorhanden.
-
Kleiner Tippfehler ?
Das Programm heißt natürlich QCMDEXC !
Die FORMAT$ ist natürlich korrekt, da auch Dezimalwerte mit Dezimal-Komma angegeben werden. Dies ist allerdings von der IBMDA400-Einstellung abhängig, ob mit Dezimalpunkt oder -komma gearbeitet wird.
Der Job auf der AS/400 muss natürlich da sein, sonst käme die CPF0006 nicht !
Nachzuprüfen per "WRKOBJLCK MYUSER *USRPRF", dort im Joblog nachsehen.
Wenn das alles nichts hilft, habe ich auch noch Beispiele per "CREATE PROCEDURE" hier im Forum (was das Dezimalkomma-Problem löst).
Siehe hierzu: http://www.rlpforen.de/showthread.ph...hlight=qcmdexc
-
Ich selber habe das Programm in der qsys überprüft und dann
prompt aus Ihren Vorschlag die falsche schreibweise übernommen.
Um das Ganze zu Testen habe ich es jetzt auf der AS400 probiert!!
folgender Befehl:
CALL QSYS/QCMDEXC('ADDLIBLE LIB(LIB1)',0000000018.00000)
Fehlernachricht:
Nachricht . . . : Zeichen im Qualifikationsmerkmalsanfang 'QCMDEXC('A'
ungültig.
Ursache . . . . . : Das Qualifikationsmerkmal muß aus einer gültigen
Zeichenfolge, einem numerischen oder vordefinierten Wert bestehen.
aus dem Jobprotokoll:
Bibliothek QSYS2929 nicht gefunden.
Client-Anforderung - Ausführen des Befehls 'CALL
'.
Zeichen im Qualifikationsmerkmalsanfang 'QCMDEXC('A' ungültig.
Fehler in Befehl *N gefunden.
Im Befehl ist ein Fehler aufgetreten.
-
Hallo ,
mit dem VB kenne ich mich nicht aus
aber hier die Syntax des qcmdexc von einer Befehlszeile
CALL QSYS/QCMDEXC PARM('ADDLIBLE LIB(MK)' 0000000018,00000)
Wichtig ist eigentlich das Schlüsselwort Parm
und einen Leerstelle zwischen dem ersten und zweiten Parameter.
gruss Michael
-
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.
-
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.
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