Live-Forum - Die aktuellen Beiträge
Datum
Titel
15.07.2024 16:00:57
15.07.2024 15:41:38
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Oracle abfrage gewünscht=Tabellennamen keine Werte

Oracle abfrage gewünscht=Tabellennamen keine Werte
chris
Hallo VBA experten,
ich habe dieses mal ein für mich unlösbares probelm.
es geht um eine Oracle abfrage mit VBA.
Was ich bereits kann ist alle werte aus vorgegebenen Tabellennamen auszugeben.
Aktueller Tabellenname = "Nummer"
Aber wie schaffe ich es aus dieser test Oraclebank alle Tabellennamen angezeigt zu bekommen weil es da noch mehere gibt auser nur "Nummer"
Würde mich sehr über eure Hilfe freuen.
Hier meine bischerige version.
'In einem Modul
Option Explicit
Dim strSQL_teil As String
Dim strSQL As String
Dim xx As Integer
Dim datenbank
Dim werte

Sub update()
strSQL = "SELECT Nummer FROM KA.P1" 'View
Set datenbank = New cdatenbank
Call datenbank.db_verbinden("username", "passwort") 'übergabe Username und Passwort um  _
datenbank zu verbinden
werte = datenbank.db_abfrage(strSQL)
Call datenbank.db_trennen
Call daten_eintragen
Erase werte
End Sub


'In einem Klassenmodul
Option Explicit
Private Declare


Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private ADOC As New ADODB.Connection


Sub db_verbinden(Viewname, pass)
Dim x As Integer
Dim fehler As Boolean
Dim is_shown As Boolean
Dim frm_status
x = 1
fehler = True
is_shown = False
Do While fehler = True
If x 



Function db_abfrage(statement As String, Optional ByRef fehler As Boolean = False) As Variant
Dim DBS As New ADODB.Recordset
Dim datenmenge As Variant
On Error Resume Next
DBS.ActiveConnection = ADOC
DBS.LockType = adLockOptimistic
DBS.CursorType = adOpenKeyset
DBS.Source = statement
DBS.Open
If ADOC.Errors.Count > 0 Then fehler = True
datenmenge = DBS.GetRows
DBS.Close
db_abfrage = datenmenge
On Error GoTo 0
End Function



Function db_ausfuehren(DB_Name As String, uebergabe() As Variant) As Integer
On Error Resume Next
Dim DBS As New ADODB.Recordset
With DBS
.ActiveConnection = ADOC
.LockType = adLockPessimistic
.CursorType = adOpenKeyset
.Source = DB_Name
.Open
.AddNew
Dim ID_rs As New ADODB.Recordset
ID_rs.ActiveConnection = ADOC
ID_rs.LockType = adLockPessimistic
ID_rs.CursorType = adOpenKeyset
ID_rs.Source = "SELECT CASE WHEN MAX(ID) IS NULL THEN 1 ELSE MAX(ID)+1 END AS ID FROM  " _
& DB_Name
ID_rs.Open
DBS.Fields("ID") = ID_rs.Fields("ID")
ID_rs.Close
For x = LBound(uebergabe, 1) To UBound(uebergabe, 1)
.Fields(uebergabe(x)(0)) = uebergabe(x)(1)
Next x
.update
If Err.Number 



Sub db_trennen()
On Error Resume Next
ADOC.Close
On Error GoTo 0
End Sub


Vielen Dank im vorraus für eure Hilfe !!
gruß Chris

AW: Oracle abfrage gewünscht=Tabellennamen keine Werte
01.07.2009 12:41:00
Helmut
Ganz klar ist mir nicht, was Du meinst. Gegenwärtig liest Du aus der Tabelle KA.P1 die Spalte Nummer aus.
Willst Du alle Tabellen einer Datenbank sehen, benutze SHOW TABLES.
Willst Du alle Spalten der Tabelle KA.P1 sehen, benutze SHOW COLUMNS FROM KA.P1.
Willst Du alle Daten der Tabelle KA.P1 auslesen, benutze SELECT * FROM KA.P1.
Willst Du spezielle Spalten der Tabelle KA.P1 auslesen, benutze SELECT Spaltenname1, Spaltenname2, ... from KA.P1.
AW: Oracle abfrage gewünscht=Tabellennamen keine Werte
01.07.2009 13:00:04
chris
Halle Helmut,
also mit deiner Antwort hast du alle meine fragen fast beantwortet.
Ich weiß nur nicht wie man diese zeilen von dir:
-Willst Du alle Tabellen einer Datenbank sehen, benutze SHOW TABLES.
-Willst Du alle Spalten der Tabelle KA.P1 sehen, benutze SHOW COLUMNS FROM KA.P1.
-Willst Du alle Daten der Tabelle KA.P1 auslesen, benutze SELECT * FROM KA.P1.
-Willst Du spezielle Spalten der Tabelle KA.P1 auslesen, benutze SELECT Spaltenname1, Spaltenname2, from KA.P1.
in VBA schreiben kann bzw.soll.
eigentlich wollte ich nur dies lösen aber die anderen Ansätze wären mir auch sehr Hilfreich.
Nur wie schreibe ich diese in VBA so das ich das ergebniss ausgeben kann in einer Exceltabelle ?
Vielen dank noch einmal
Anzeige
AW: Oracle abfrage gewünscht=Tabellennamen keine Werte
01.07.2009 13:11:52
Helmut
Ich habe das noch nie gemacht, aber Deine Makrovorlage deutet darauf hin, dass nur die Zeile
strSQL = "SELECT Nummer FROM KA.P1"
zu ändern ist, e.g. strSQL = "SELECT * FROM KA.P1"
AW: Oracle abfrage gewünscht=Tabellennamen keine Werte
01.07.2009 13:19:11
chris
Dasklappt gut.
Aber so bekomme ich alle daten ohne die Tabellenüberschriften zu sehen.
oder Columns überschrifften.
Weißt du was ich meine ?
Habe es so versucht aber das klappt nicht ?
strSQL = "SHOW TABLES FROM KA.P1"
?
Danke noch einmal
AW: Oracle abfrage gewünscht=Tabellennamen keine Werte
01.07.2009 13:37:14
Helmut
Beides Zusammen ist nicht so einfach zu bewerkstelligen.
Ich würde mir erst die Spaltennamen verschaffen, also Dein Makro mit
strSQL = "SHOW COLUMNS FROM KA.P1"
laufen lassen (ich hoffe, Oracle versteht inzwischen den Befehl, sonst frag Deinen DBAdmin oder nimm irgendwelche Tools, e.g. Toad).
Jetzt kennst Du die Spaltennamen.
Dann laß das Macro mit Deiner Auswahl von Spalten laufen.
strSQL = "SELECT Nummer, sfsdf, fgdgdg FROM KA.P1
Jetzt hast Du die Daten, die Dich interessieren und kannst manuell die Spaltennamen ergänzen.
Anzeige
AW: noch keine Lösung gefunden
01.07.2009 13:41:50
chris
Genau da kommt nichts ?
bei dieser zeile: strSQL = "SHOW COLUMNS FROM KA.P1"
und ich denke das wäre genau das was ich brauche.
ein Kollege sagt mir ich brauche die Spaltenüberschriften
Weißt du rat ?
AW: noch keine Lösung gefunden
01.07.2009 13:53:17
Helmut
wahrscheinlich ist für Oracle dies der richtige Befehl, um die Spaltennamen zu bekommen
strSQL = "select column_name from USER_tab_columns where table_Name = KA.P1"
frag Deinen DBAdmin, der kann Dir entweder eine Liste der Spalten geben oder die richtige SQL Syntax für Oracle
AW: geht nicht
01.07.2009 14:00:16
chris
Hallo Helmut,
auch so klappt es ledier nicht.Weiß noch jemand Rat ?
strSQL = "select column_name from USER_tab_columns where table_Name = dbname"
Kann auch keinen anderen Fragen.
Weil VBA mein eigenes Gebiet ist.
Anzeige
AW: geht nicht
01.07.2009 14:02:12
Helmut
sorry
strSQL = "select * from USER_tab_columns where table_Name = KA.P1"
oder
select * from all_tab_columns where table_name = KA.P1
AW: geht immer noch nicht
01.07.2009 14:10:50
chris
Klappt beides nicht :(
Sorry aber ist leider so.
AW: geht immer noch nicht
01.07.2009 14:14:21
Helmut
Ich kann nicht mehr helfen.
Frag den Datenbankadministrator entweder nach einer Liste der Spalten oder nach der richtigen Syntax des SQL Commands zum Auslesen der Spaltennamen. Meiner Ansicht nach ist das an dieser Stelle kein VBA Problem.
AW: noch offen. Bitte um Hilfe
01.07.2009 14:18:08
chris
Danke Helmut,
ich lass trotzdem noch einmal offen.
Vielleicht weiß noch jemadn eine Lösung ?
Danke an dich und alle anderen Helfer!
Anzeige
AW: noch offen. Bitte um Hilfe
02.07.2009 06:11:16
Coach
Hallo Chris,
Oracle ist textsensitiv, unterscheidet also auch bei Tabellennamen nach Gross- und Kleinschreibung.
Folgendes sollte funktionieren:
SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper('xxx')
xxx dann durch den Namen der Tabelle ersetzen.
Gruß Coach
AW: noch offen. Bitte um Hilfe
02.07.2009 06:53:25
Coach
Hallo Chris,
nach Lesen des ganzen Threads wäre m.E. folgendes sinnvoller weil flexibler (egal ob Abfrage von Tabellen, Views, allen Spalten (*), einigen Spalten, mit geänderter Reihenfolge etc.):
Im Modul:
Option Explicit
Dim werte As Variant, felder$()

Sub update()
Dim strSQL$, Datenbank  As cDatenbank
strSQL = "Select ..."
Set Datenbank = New cDatenbank
Call Datenbank.db_verbinden("username", "passwort")
werte = Datenbank.db_abfrage(strSQL, felder)
Call Datenbank.db_trennen
Call Daten_eintragen
Erase werte
Erase felder
End Sub



Sub Daten_eintragen()
With ActiveSheet
.Cells.ClearContents
.Cells(1, 1).Resize(1, UBound(felder)) = felder
.Cells(2, 1).Resize(UBound(werte, 2) - LBound(werte, 2) + 1, UBound(werte, 1) - LBound( _
werte, 1) + 1) = werte
End With
End Sub


Im Klassenmodul


Function db_abfrage(statement As String, fields$(), Optional ByRef fehler As Boolean = False)  _
As Variant
Dim DBS As New ADODB.Recordset
Dim datenmenge As Variant
Dim x&
On Error Resume Next
DBS.ActiveConnection = ADOC
DBS.LockType = adLockOptimistic
DBS.CursorType = adOpenKeyset
DBS.Source = statement
DBS.Open
If ADOC.Errors.Count > 0 Then fehler = True
datenmenge = DBS.GetRows
ReDim fields(1 To DBS.fields.Count)
For x = 1 To DBS.fields.Count
fields(x) = DBS.fields(x - 1).Name
Next
DBS.Close
db_abfrage = datenmenge
On Error GoTo 0
End Function


Noch anzupassen wären:
* strSQL = "Select ..."
* Call Datenbank.db_verbinden("username", "passwort")
* Daten_eintragen (sollte nur das Prinzip verdeutlichen)
Gruß Coach

Anzeige
AW: noch offen. Bitte um Hilfe
02.07.2009 07:09:06
chris
Hi Coach,
vielen dank für deine Antwort.Wolte den Code gerade testen.
Habe auch alles so gemacht wie beschrieben.
Aber bei mir kommt wenn ich dieses makro update ausführen will folgender fehler. ?
fehler beim Kompilieren
Argumenttyp byREF unverträglich.
und es wir in dieser zeile werte = Datenbank.db_abfrage(strSQL, felder)
das wort felder gelb angezeigt.
Kannst Du mal schauen was ich falsch machen könnte ?
Vielen dank
AW: noch offen. Bitte um Hilfe
02.07.2009 09:43:43
Coach
Hallo chris,
hast du felder im Modul als globale Variable ergänzt?
Dim felder$()
Dim werte As Variant
Gruß Coach
Anzeige
AW: noch offen. Bitte um Hilfe
02.07.2009 10:23:08
chris
Hallo Coách,
habe es so in einem Modul stehen.
wenn ich dann update starte mit F8 einzelschritt kommt gleich der fehler. ?
Weißt du Rat ?
Er Meckert irgendetwas mit Byref an ?
'Ab hier steh es so in einem Modul Modul1
Dim werte As Variant
Dim felder$()

Sub update()
Dim strSQL$, Datenbank  As cdatenbank
strSQL = "Select ..."
Set Datenbank = New cdatenbank
Call Datenbank.db_verbinden("username", "passwort")
werte = Datenbank.db_abfrage(strSQL, felder)
Call Datenbank.db_trennen
Call Daten_eintragen
Erase werte
Erase felder
End Sub



Sub Daten_eintragen()
With ActiveSheet
.Cells.ClearContents
.Cells(1, 1).Resize(1, UBound(felder)) = felder
.Cells(2, 1).Resize(UBound(werte, 2) - LBound(werte, 2) + 1, UBound(werte, 1) - LBound( _
werte, 1) + 1) = werte
End With
End Sub


Anzeige
AW: noch offen. Bitte um Hilfe
02.07.2009 10:28:35
Coach
Hallo Chris,
hast Du die Funktion im Klassenmodul angepaßt?

Function db_abfrage(statement As String, fields$(), Optional ByRef fehler As Boolean = False)   _
_
As Variant
Dim DBS As New ADODB.Recordset
Dim datenmenge As Variant
Dim x&
On Error Resume Next
DBS.ActiveConnection = ADOC
DBS.LockType = adLockOptimistic
DBS.CursorType = adOpenKeyset
DBS.Source = statement
DBS.Open
If ADOC.Errors.Count > 0 Then fehler = True
datenmenge = DBS.GetRows
ReDim fields(1 To DBS.fields.Count)
For x = 1 To DBS.fields.Count
fields(x) = DBS.fields(x - 1).Name
Next
DBS.Close
db_abfrage = datenmenge
On Error GoTo 0
End Function


Gruß Coach

Anzeige
AW: noch offen. Bitte um Hilfe
02.07.2009 10:36:26
chris
Egal was und wie ich es mache.
Es kommt immer die Fehlermeldung:
Fehler beim Kompilieren
Argumenttyp Byref unverträglich
ich weiß nicht was ich falsch mache ?
gruß
AW: noch offen. Bitte um Hilfe
02.07.2009 10:44:40
chris
habe es zum laufen gebracht.
Habe in dieser zeile :
werte = Datenbank.db_abfrage(strSQL, felder)
Das felder am ende ersezt durch False
werte = Datenbank.db_abfrage(strSQL, False)
Jetzt ist es gelaufen.
Aber wie oder durch was muss ich diese zeile ersetzten um aus der Datenbank die Spaltennamen oder Tabellen Namen zu bekommen ?
danke Dir schon vielmals
AW: diese Zeile
02.07.2009 10:48:53
chris
Ich meinte durch was ich diese zeile ersezten muss um die spalten bzw. Tabellennamen zu bekommen.
strSQL = "SELECT testNummer,REGNummer FROM Kxxx.vxxxxP4" 'View
Also ich möchte dann sozusagen diese beiden Überschriften Tabellennamen
(testNummer,REGNummer)
aus dieser datenbank
(Kxxx.vxxxxP4)
bekommen.(Und eben alle Tabellennamen weil es nch mehr gibt als diese zwei.
ich brauche also nicht die Werte dieser Spaltenüberschriften sondern nur die Spaltenüberschriften.
und da eben alle.)
Weißt du was ich meine ?
Danke schon im vorraus
Anzeige
AW: diese Zeile
02.07.2009 11:37:00
Helmut
ich nehme an, Du meinst wieder die Spaltennamen und nicht die Tabellennamen und in diesem Fall die Spaltennamen der Tabelle Kxxx.vxxxxP4. Wenn das so ist verstehe ich Coach so
strSQL =“SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper('Kxxx.vxxxxP4')“
AW: Weiß noch jemand rat. Zusammenfassung
02.07.2009 12:21:05
chris
Hallo Helmut,
also bei mir bleibt das ergebniss leer:(
habe das Makro jetzt so fertig:Aber in Variable werte wo die Spaltenüberschriften rein sollen steht nimmer nichts.
'------------------------------------------ In einem Modul habe ich das:
Option Explicit
Dim strSQL_teil As String
Dim strSQL As String
Dim xx As Integer
Dim Datenbank
Dim werte As Variant, felder$()

Sub update()
Dim strSQL$, Datenbank  As cdatenbank
strSQL = "SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper( _
Datenbank.name')“"
'wofür das TC steht weiß ich nicht.Ist das eine variable oder woher kommt die ?
Set Datenbank = New cdatenbank
Call Datenbank.db_verbinden("N1", "N2")
werte = Datenbank.db_abfrage(strSQL, felder)
Call Datenbank.db_trennen
Call Daten_eintragen
Erase werte
Erase felder
End Sub



Sub Daten_eintragen()
With ActiveSheet
.Cells.ClearContents
.Cells(1, 1).Resize(1, UBound(felder)) = felder
.Cells(2, 1).Resize(UBound(werte, 2) - LBound(werte, 2) + 1, UBound(werte, 1) - LBound( _
werte, 1) + 1) = werte
End With
End Sub


'------------------------------------------ In einem Klassen Modul habe ich das:
Option Explicit
Private Declare


Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private ADOC As New ADODB.Connection


Function db_abfrage(statement As String, fields$(), Optional ByRef fehler As Boolean = False)  _
As Variant
Dim DBS As New ADODB.Recordset
Dim datenmenge As Variant
Dim x&
On Error Resume Next
DBS.ActiveConnection = ADOC
DBS.LockType = adLockOptimistic
DBS.CursorType = adOpenKeyset
DBS.Source = statement
DBS.Open
If ADOC.Errors.Count > 0 Then fehler = True
datenmenge = DBS.GetRows
ReDim fields(1 To DBS.fields.Count)
For x = 1 To DBS.fields.Count
fields(x) = DBS.fields(x - 1).Name
Next
DBS.Close
db_abfrage = datenmenge
On Error GoTo 0
End Function



Sub db_verbinden(Viewname, pass)
Dim x As Integer
Dim fehler As Boolean
Dim is_shown As Boolean
Dim frm_status
x = 1
fehler = True
is_shown = False
Do While fehler = True
If x 



Function db_ausfuehren(DB_Name As String, uebergabe() As Variant) As Integer
On Error Resume Next
Dim DBS As New ADODB.Recordset
With DBS
.ActiveConnection = ADOC
.LockType = adLockPessimistic
.CursorType = adOpenKeyset
.Source = DB_Name
.Open
.AddNew
Dim ID_rs As New ADODB.Recordset
ID_rs.ActiveConnection = ADOC
ID_rs.LockType = adLockPessimistic
ID_rs.CursorType = adOpenKeyset
ID_rs.Source = "SELECT CASE WHEN MAX(ID) IS NULL THEN 1 ELSE MAX(ID)+1 END AS ID FROM  " _
& DB_Name
ID_rs.Open
DBS.fields("ID") = ID_rs.fields("ID")
ID_rs.Close
For x = LBound(uebergabe, 1) To UBound(uebergabe, 1)
.fields(uebergabe(x)(0)) = uebergabe(x)(1)
Next x
.update
If Err.Number 



Sub db_trennen()
On Error Resume Next
ADOC.Close
On Error GoTo 0
End Sub


vielleicht weiß noch jemand rat.Sonst gebe ich auf :(

AW: Weiß noch jemand rat. Zusammenfassung
02.07.2009 12:36:29
Helmut
Diese Zeile kann synthaktisch einfach nicht richtig sein:
strSQL = "SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper( _
Datenbank.name')“"
und ich glaube, Du verwechselst immer wieder Datenbank und Tabelle.
der Underscore für den Zeilenumbruch im VBA Editor muß weg
es fehlt ein Hochkomma an anderer Stelle ist eins zu viel
statt Datenbank.name muß der Name Deiner Tabelle stehen
strSQL = "SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper('dernamemeinertabelle')"
teste mit msgbox strSQL mal, ob wirklich der folgende String entsteht:
SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper('dernamemeinertabelle')
Geh zu Euren DBAdmins und frage, ob der übergebene Textstring der Richtige ist und teste mit ihnen den Befehl im System, und frage, ob Du überhaupt die Rechte hast, das Datenbankschema auszulesen.
AW: Weiß noch jemand rat. Zusammenfassung
03.07.2009 14:40:06
chris
Hallo noch einmal an alle Helfer.
Wollte mich noch einmal bedanken für die Ansätze.
habe es jetzt so gelöst.
strSQL = "SELECT * FROM test.testname WHERE REGNR =" & "1" 'nicht vorhanden
Call datenbank.db_verbinden("usern", "pass") 'übergabe Username und Passwort um datenbank zu verbinden
werte = datenbank.db_abfrage(strSQL)
Und dann kann ich im Klassenmodul das einfügen und dann bekomme ich alle Spaltennamen.
.... .
....
datenmenge = DBS.GetRows
For x = 1 To DBS.Fields.Count
Cells(x, 1) = DBS.Fields(x).Name
Cells(x, 2) = DBS.Fields(x).OriginalValue
Cells(x, 3) = DBS.Fields(x).Status
Cells(x, 4) = DBS.Fields(x).Value
Next
AW: noch offen. Bitte um Hilfe
02.07.2009 07:17:20
chris
Und noch eine frage Coach,
was erreiche ich mit diesem Code ?
Was ich will ist doch die Column Namen meiner Oracle Datenbank ?
SELECT TC.Column_Name FROM USER_TAB_Columns TC Where Upper(TC.Table_Name)=Upper('xxx')
Und was muss ich ersetzen in meinem Code ?
AW: Oracle abfrage gewünscht=Tabellennamen keine Werte
01.07.2009 13:41:44
Jürgen
Hallo Chris,
bevor Du Dich noch lange mit VBA herumärgerst: kommst Du nicht mit der Funktionaliät zum Ziel, die Dir Excel unter "Daten - Externe Daten importieren -Neue Abfrage erstellen" anbietet?
Gruß, Jürgen
AW: ich suche eine VBA Lösung
01.07.2009 13:43:04
chris
Danke auch dir für deine Antwort.
Aber ich suche eine VBA Lösung.
Würde mich sehr über Hilfe freuen.
VieleN dank an alle helfer !?
gruß Chris
AW: ich suche eine VBA Lösung
01.07.2009 14:09:13
fcs
Hallo Chris,
unter den Eigenschaften des externe Datenimports kannst du aber zumindest die Syntax für den SQL-Befehl ablesen und du solltest dort auch die Namen der Felder auslesen können, soweit eben in der Datenbank externe Ansichten auf die Daten zugelassen sind.
Gruß
Franz

322 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige