View Full Version : SQL aus Excel
Hallo,
nachdem das mit "call" nur eine Übergangslösung sein darf möchte ich aus Excel VBA SQL Befehle auf der AS400 ausführen, leider kommen da immer wieder Fehlermeldungen :
Option Explicit
Sub as400_SQL()
Dim cnn As ADODB.Connection
Dim CallCmd As String
Set cnn = New ADODB.Connection
' Verbindungsdaten
cnn.Open "Provider=IBMDA400;" & _
"Data Source=192.***.***.***;" & _
"User ID=*****;" & _
"Password=*****;"
Hier soll mit SQL z.B. ausgeführt werden : „create table … …“
' Verbindung schliessen
cnn.Close
End Sub
Mit Bitte um Hilfe und vielen Dank im voraus, ERIC
Es wäre sehr hilfreich, die Fehlermeldung mal zu posten.
Hallo Eric,
versuch es mal so:
Option Explicit
Sub as400_SQL()
Dim cnn As ADODB.Connection
Dim CallCmd As String
Dim SQL As String
Set cnn = New ADODB.Connection
'Verbindungsdaten
cnn.Open "Provider=IBMDA400;" & "Data Source=192.***.***.***;" & "User ID=*****;" & "Password=*****;"
'SqlStatement
SQL = "CREATE TABLE [MyTable] (" & _
"[FieldA] [int] NOT NULL , " & _
"[FieldB] [varchar] (30) NOT NULL)"
'.. ausführen
cnn.Execute SQL
' Verbindung schliessen
cnn.Close
End Sub
Lass aber vor allem die eckigen Klammern weg.
Hallo,
hab das jetzt so eingetippt und esklappt :
Sub as400_SQL()
Dim cnn As ADODB.Connection
Dim SQL As String
Set cnn = New ADODB.Connection
'Verbindungsdaten
cnn.Open "Provider=IBMDA400;" & _
"Data Source=192.***.***.***;" & _
"User ID=*****;" & _
"Password=******;"
'SqlStatement
SQL = "create table blabla.sql001(feld1 integer not null, feld2 varchar(15), primary key (feld1))"
'.. ausführen
cnn.Execute SQL
' Verbindung schliessen
cnn.Close
End Sub
Vielen Dank ERIC
Hallo,
gibt es eine Möglichkeit vorab zu prüfen ob die Datei vorhanden ist und wenn nein, dann "create table ..." wenn ja dann z.B."insert into ..." ?
Vielen Dank.
ERIC
Dafür gibt es die Schema-Abfragen des Connection-Object's.
Man kann auch einfach per Try und Error einen Select lostreten, bei Fehler dann einen Create erstellen.
on error resume next
err.clear
set rcd = cnn.execute("select ...")
if err.number <> 0 then
' ggf. auch andere Fehler berücksichtigen
end if
Hallo,
danke für die schnelle Antwort, ohne Abfrage "knallt" es beim 2.Lauf, denn die Tabelle ist ja schon da, dann:
Dim RCD As ADODB.Recordset oder?
und dann den Select, worauf ???
(select lib/file)
es lief durch und keine Fehlermeldung mehr, hatte :
...
'SqlStatement
SQL = "create table blabla.sql001(feld1 integer not null, feld2 varchar(15), primary key (feld1))"
'.. ausführen
on error resume next
err.clear
set rcd = cnn.execute("select blabla/sql001")
if err.number <> 0 then
SQL = "create table blabla.sql012(feld1 integer not null, feld2 varchar(15), primary key (feld1))"
'.. ausführen
cnn.Execute SQL
end if
' Verbindung schliessen
cnn.Close
End Sub
Eine sql012 gibt es leider nicht und auch keine Fehler ! Wo ist mein Fehler ?
Danke im Voraus ERIC
Wie beim Create muss auch der Select bei qualifizierter Benennung einen Punkt verwenden "libname.tblname".
Alternativ kannst du den CREATE ja genauso abfangen. Du bekommst in der err.Description einen Fehlercode geliefert.
Das CNN-Object enthält auch genauere SQLSTATE-Codes nach einem Fehler.
Hallo,
vielen Dank für die Rückinfo, nur ich
komm da nicht weiter :confused: , kannst Du mir bitte mal den vollständigen Script geben ?
...
wenn "lib/sql001" vorhanden,
dann erstelle "lib/sql011", wenn "lib/sql011 vorhanden, dann EXIT
hab da hin und her probiert, über den Fehler läuft er, nur dann auch wenn "lib/sql011" vorhanden, keine Fehlermeldungen mehr.
Vielen Dank im voraus ERIC