View Full Version : DQY Problem
Moin,
war etwas im stress gestern.
Fehlermeldung: Laufzeitfehler: 1004 (Allgemeiner ODBC-Fehler).
Mein Code:
Sub TEST()
Dim qt As QueryTable
Dim Eingabe As String
Dim Fehler As String
Fehler = "Leer nicht erlaubt"
Eingabe = InputBox("Eingeben:")
If Eingabe = "" Then GoTo ERRORHANDLER
ConnectionTimeout = 6000
AsyncRetryInterval = 6000
sqlstring = "SELECT * FROM bbb, aaa left outer join ccc on SIT=SIT and DEP=DEP and NENP =NENP, dddd WHERE E1NENT = NENT and SIT = SIT and DEP = DEP and BCHE = BCHE and SIT=SIT and DEP=DEP and NENP = NENP and SIT= 'FF' and DEP ='LEICA'and E3NEXT like ('%'||" + Eingabe + "||'%')"
connstring = _
"ODBC;DSN=xxx;UID=USERID;PWD=Pass;Database=96Sales"
With ActiveSheet.QueryTables.Add(Connection:=connstring , _
Destination:=Range("E1"), Sql:=sqlstring)
.Refresh
End With
Exit Sub
ERRORHANDLER:
MsgBox Fehler
End Sub
SQL funktioniert in der SQL umgebung ohne Problem, wenn ich diese VBA laufen lasse und mir den sqlstring überwache sehe ich leider nicht alles in dem string!
Hallo,
also hier wäre ein Beispiel von mir, das funktioniert (das ist hier nur eine fiktive SQL-Anweisung). Die Variable "firma" wird aus einer Excel-Zelle gefüllt.
Der Benutzername und das Kennwort kann hier direkt mitgegeben werden. Ich arbeite viel lieber mit diesen kleinen VBAs als mit DQY-Dateien, da ich damit wesentlich flexibler bin. Ich kann hier z.B. über weitere Module das Tabellenblatt entsprechend vorbereiten bzw. die Ausgabe nachträglich formatieren.
Gruß,
KM
Sub Artikelzusatztexte()
' Variablen definieren
Dim firma As Variant
Dim sql As String
Dim qt As QueryTable
firma = Range("B1").Text
' SQL-Abfrage auf der AS/400 vorbereiten
sql = "select blabla "
sql = sql & "from artstamm "
sql = sql & "where finr = " & firma & " "
sql = sql & "order by artn"
' Tabellenblatt für Ergebnisliste vorbereiten
Ergebnisliste_vorbereiten
' Abfrage auf der AS/400 ausführen und Ergebnisliste füllen
Set qt = ActiveSheet.QueryTables.Add(Connection:=Array( _
"ODBC;DRIVER={iSeries Access ODBC Driver};CONNTYPE=2;TRANSLATE=1;CMT=0;PKG=QGPL/DEFAULT(IBM),2,0,1,0,512;LANGUAGEID=ENU;DFTPKGLIB= QGPL;DBQ=LIB;SYSTEM=ISERIES;UID=Benutzername;PWD=K ennwort;BLOCKFETCH=1;BLOCKSIZE=512"), Destination:=Range("A2"))
qt.CommandText = sql
qt.Name = "Artikelzusatztexte"
qt.FieldNames = False
qt.RowNumbers = False
qt.FillAdjacentFormulas = True
qt.PreserveFormatting = True
qt.RefreshOnFileOpen = False
qt.BackgroundQuery = False
qt.RefreshStyle = xlInsertDeleteCells
qt.SavePassword = True
qt.SaveData = True
qt.AdjustColumnWidth = False
qt.RefreshPeriod = 0
qt.PreserveColumnInfo = True
qt.Refresh
End Sub
Hallo,
das scheint nur an der Syntax Deines SQL zu liegen.
Versuche doch mal statt
E3NEXT like ('%'||" + Eingabe + "||'%')
folgendes
E3NEXT like ('%" & Eingabe & "%')
Gruß,
KM
Da du als Eingabe eine Zeichenkette abgibst, gehe ich hier von einem Syntaxfehler aus:
like ('%'||" + Eingabe + "||'%')
In diesem Fall musst du die Variable Eingabe wieder in Hochkomma einbetten und ggf. vorhandenen Hochkomma verdoppeln, ausserdem kannst du "||" vergessen da du den String ja zusammenbaust.
" ... like '%" & replace(Eingabe, "'", "''") & "%' ..."
Habe eure Anmerkung versucht um zusetzen hat leider nicht funktioniert.
Wegen dem LIKe Problem habe ich auch mal mit „=“ gearbeitet und funktioniert leider nicht. Ich vermute das dieser String nicht richtig übergeben wird eventuelle ein BUG?
Diese (Like ('%'||" + Eingabe + "||'%')) funktioniert bei einer Datei aber leider nicht bei meinem großem SQL.
Aber noch mal Danke
Mach doch mal einen MsgBox auf Deinen SQL-String. Dann siehst Du doch wo das Problem liegt bzw. wie der SQL im Endeffekt aussieht. Du füllst die Variable aus einer Inputbox. Kannst sie testweise ja mal aus einem Zellinhalt füllen.
Gruß,
KM
Funktionier immer noch nicht! so ein schei...
Habe mir eine msgbox gebaut SQL sieht gut aus.
Habe den Wert über Eingabe via Zelleninhalt gefüllt aber immer noch das gleiche Problem.
wenn ich aber das SQL per SQL auf der AS400 laufen lasse und nur "+ Eingabe +" ersetze funktioniert es ohne Problem.
Kann es sein das ein Left outer join oder mehrere Dateien per SQL via Query nicht funktioniert?
Weil wenn ich es über QDY laufen lasse mit like ? funktioniert diese SQL auch, jetzt habe ich die Vermutung, dass es über QueryTables nicht funktioniert.
Hast du schon mal mehrere Dateien über QueryTables eingebunden?
Gruss
Miles
Ich vermute das Problem ist die Double Pipe (||) diese ist nicht international. In manchen Umgebungen muss dafür ein doppeltes Ausrufezeichen gesetzt werden. Um dem Ganzen aus dem Weg zu gehen, versuch doch einfach mal || durch concat zu ersetzen.
E3NEXT like ('%' concat " + Eingabe + " concat '%')
Birgitta
Versuch's doch erst mal mit einem konstanten Wert anstatt der Variablen "Eingabe". Nur um zu sehen, dass die Abfrage überhaupt funktioniert.
Was kommt denn genau für ein Fehler? Was sagt das Joblog des ODBC-Jobs (QZDASOINIT)?
Natürlich funktioniert das SQL mit mehreren Dateien und Joins. Du kannst die komplexesten SQLs ausführen.
Kannst Du das SQL-Statement mal posten?
Gruß,
KM
QZDASOINIT wird noch nicht mal aufgebaut bei diesem SQL:
sqlstring = "SELECT * FROM G72GDEDSD/ENT04P b, G72GDEDSD/ENT03P a left outer join G72GDEDSD/ENT01P c on E3SIT=E1SIT and E3DEP=E1DEP and E3NENP =E1NENP, G72GDEDSD/ENT02P d WHERE E1NENT = E2NENT and E1SIT = E2SIT and E1DEP = E2DEP and E1BCHE = E2BCHE and E3SIT=E4SIT and E3DEP=E4DEP and E3NENP = E4NENP and E3SIT= 'FF' and E3DEP ='LEICA'and E3NEXT like ('%'||" + Eingabe + "||'%')"
Bei diesem SQL was funktioniert wir auch ein QZDASOINIT aufgebaut.
SELECT * FROM G72GDEDSD.Ent03P WHERE E3SIT= 'FF' and E3DEP ='LEICA' and E3NEXT like ('%'||" + Eingabe + "||'%')
Hier funktinoiert auch das Like ohne Probleme.