PDA

View Full Version : SQL aus Excel



Seiten : [1] 2

Eric
09-11-09, 19:06
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

Fuerchau
09-11-09, 19:31
Es wäre sehr hilfreich, die Fehlermeldung mal zu posten.

woki
10-11-09, 11:33
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

Fuerchau
10-11-09, 12:28
Lass aber vor allem die eckigen Klammern weg.

Eric
10-11-09, 16:42
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

Eric
10-11-09, 16:46
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

Fuerchau
10-11-09, 17:15
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

Eric
10-11-09, 19:28
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

Fuerchau
11-11-09, 08:02
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.

Eric
11-11-09, 19:24
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