PDA

Vollständige Version anzeigen : Typkonflikt


hallo1112
03.07.2015, 14:52
Hallo Leute,

ich möchte Datensätze von meiner Datenbank in die ComboBox füllen, nur kommt beim Debuggen immer ein Laufzeitfehler: Typkonflikt

Die Connection zum Server funktioniert. Die im Code rotmarkierte Zeile verursacht den Fehler. In meiner Tabelle Produkt gibt es einen Feld mit dem Namen Titel.

Private Sub CommandButton1_Click()
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
Dim strQuery As String
Dim rs As Recordset


UserForm1.ComboBox1.Clear
cnn.Provider = "MSDASQL"
cnn.ConnectionString = "driver={SQL Server};" & _
"server=servername;uid=username;pwd=passwort;database=datenbank"
cnn.Open
strQuery = "SELECT * FROM Produkt"
Set rs = cnn.Execute(strQuery)

While rs.EOF = False
UserForm1.ComboBox1.AddItem rs!TITEL
rs.MoveNext
Wend

rs.Close
cnn.Close
End Sub


Hat jemand eine Idee, wie ich mein Problem lösen kann?

Grüße

Michael

IngGi
03.07.2015, 15:17
Hallo Michael,

du bist in Excel, nicht in Access:

UserForm1.ComboBox1.AddItem rs.Fields("TITEL")

Gruß Ingolf

hallo1112
03.07.2015, 15:28
Hallo Ingolf,

ich weiß, dass ich in Excel bin oder funktioniert das nur in Access?

Ich will von meinem MSSQL Server datensätze lesen und diese dann in die eine Combobox einfügen(in Excel). Ich hoffe das funktioniert in Excel auch. :boah:

Aufjedenfall hab ich deine Zeile eingefügt, aber es kommt leider immer noch der gleiche Laufzeitfehler: Typkonflikt

Private Sub CommandButton1_Click()
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
Dim strQuery As String
Dim rs As Recordset


UserForm1.ComboBox1.Clear
cnn.Provider = "MSDASQL"
cnn.ConnectionString = "driver={SQL Server};" & _
"server=servername;uid=username;pwd=passwort;database=datenbank"
cnn.Open
strQuery = "SELECT * FROM Produkt"
Set rs = cnn.Execute(strQuery)

While rs.EOF = False
UserForm1.ComboBox1.AddItem rs.Fields("TITEL")
rs.MoveNext
Wend

rs.Close
cnn.Close
End Sub

IngGi
03.07.2015, 15:35
Hallo Michael,

es geht um die Referenz auf das Recordset. Die Syntax mit dem Ausrufezeichen kenne ich nur aus Access, nicht aber aus Excel. Grundsätzlich funktioniert das Ganze aber auch in Excel. Versuch mal über den Index statt über den Feldnamen auf die Daten zuzugreifen:

UserForm1.ComboBox1.AddItem rs.Fields(0) '0 für das 1. Feld im Recordset

Gruß Ingolf

hallo1112
03.07.2015, 15:37
Super Ingolf. Danke für deine Hilfe.

Das war mein Problem. Habe nicht gewusst, dass Excel/Access VBA-technisch unterschiedliche Referenzen haben.

hallo1112
06.07.2015, 09:55
Hallo Excelgemeinde,

ich habe ein neues Problem entdeckt in meinem Projekt. Mein zweiter Select (strQuery1) wird nicht ausgeführt, weil in der nähe des '=' ein Syntaxfehler ist, welchen ich aber nicht sehen kann. Ich habe die Stelle im Code rot markiert. gesellnummer ist eine zehnstellige primärschulüsselnummer

Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
Dim strQuery As String
Dim strQuery1 As String
Dim rs As Recordset
Dim rs2 As Recordset
Dim selectvalue As String
Dim gesellnummer As String



'Set the provider property to the OLE DB Provider for ODBC.
cnn.Provider = "MSDASQL"

' Open a connection using an ODBC DSN.
cnn.ConnectionString = "driver={SQL Server};" & _
"server=test;uid=test;pwd=test;database=test"
cnn.Open
selectvalue = "'" & ComboBox1.Value & "'"
strQuery = "Select [nvnr] from gesell where " & selectvalue & "= match"
strQuery1 = "Select titel from produkt inner join gesell on produkt.gesellnr = gesell.nvnr where " & gesellnummer & " = produkt.gesellnr and [titel] is not null"
Set rs = cnn.Execute(strQuery)

While rs.EOF = False
' ComboBox1.AddItem rs.Fields(0)
gesellnummer = rs.Fields(0)
Set rs2 = cnn.Execute(strQuery1)
While rs2.EOF = False
ComboBox7.AddItem rs2.Fields(0)
rs2.MoveNext
Wend
rs.MoveNext
Wend

rs.Close
r2.Close
cnn.Close

IngGi
06.07.2015, 10:39
Hallo Michael,

die Variablen gesellnummer und strQuery1 werden in der falschen Reihenfolge mit Werten bestückt. Bei der Zusammensetzung des SQL-Strings verwendest du die Variable gesellnummer. Die hat aber an der Stelle noch gar keinen Inhalt.

Gruß Ingolf

hallo1112
07.07.2015, 14:59
Hallo Ingolf, danke für deinen Tipp, hat mir wieder sehr geholfen.

Nun hab ich noch eine aller letzte Frage

Ich möchte mehrere Felder selektieren und in eine Listbox adden. Nur wird Index 0 in die Listbox eingefügt, aber Index 1 2 und 3 haben keinen Wert(NULL).

...

strQuery2 = "Select frei.cna, FREI.CWE, FREI.MWE, FREI.LWE " & _
"From frei " & _
"LEFT JOIN vert on frei.tnr = vert.tnr " & _
"INNER JOIN vertrag on vert.ver = vertrag.tnr " & _
"INNER JOIN produkt on vertrag.prod = produkt.tnr " & _
"INNER JOIN gesell on produkt.ges = gesell.tnr " & _
"Where produkt.ges = " & gesellnummer & " AND produkt.tnr = " & produktvalue
Set rs2 = cnn.Execute(strQuery2)
While rs2.EOF = False
ListBox2.AddItem rs2.Fields(0)
ListBox2.AddItem rs2.Fields(1)
ListBox2.AddItem rs2.Fields(2)
ListBox2.AddItem rs2.Fields(3)
rs2.MoveNext
Wend

...

Der Select passt schon, könnte sein, dass ich beim Kürzen Fehler reingemacht hab. Habs auch schon mit einer For-Schleife probiert, statt untereinander ListBox2.AddItem rs2.Fields(i) reinzuschreiben, hat aber auch nicht funktioniert, da ab index 1 keine werte drin sind. Währe sehr dankbar für einen letzten Tipp.

Grüße

Michael

IngGi
07.07.2015, 15:28
Hallo Michael,

was sofort auffällt: In der SELECT-Klausel wird für das erste Feld Kleinschreibung verwendet und für die restlichen Felder Großschreibung, und zwar jeweils sowohl für den Tabellennamen als auch für den Feldnamen. Ich habe noch nie mit T-SQL gearbeitet und kann daher nicht beurteilen, ob bei diesen Angaben zwischen Groß- und Kleinschreibung unterschieden wird. Ich glaube das eigentlich nicht, aber du solltest das auf jeden Fall prüfen.

Ansonsten würde ich noch prüfen, ob es eventuell ein Problem mit der Listbox gibt. Dazu würde ich mir die Inhalte der Felder in einer Schleife in Messageboxen oder über Debug.Print im Direktbereich des VBA-Editors ausgeben lassen. Des Weiteren würde ich die 4 Felder auf IS NULL überprüfen lassen. Dazu steht auch in Excel die Funktion IsNull(rs2.Fields(1)) zur Verfügung. Bei der Ausgabe kann ich nämlich nicht zwischen NULL und Leerstring als Feldinhalt unterscheiden.

Gruß Ingolf