Visual Basic 2005 - syntaxfehler (fehlender operator) in abfrageausdruck

xX Hardy Xx

Mitglied
Hallo liebe Forengemeinde,

ich programmiere gerade an einer Kundenverwaltung und habe dort ein Problem, welches ich trotz mehrstündigen probierens, nicht gelöst bekomme. Grundlage ist eine Access Datenbank *.mdb.

Zu der Kundenverwaltung gibt es ein Form, welches eine Übersicht mit allen Kunden in einem ListView Element anzeigt.

In dieser Kundenübersicht gibt es verschiedene Kriterien der Eingrenzung.
Z.B. Nur das Anzeigen von Privat und/oder Unternehmen, wobei man die Unternehmen wiederum zwischen Lieferanten und Händlern unterscheiden und anzeigen lassen kann.
Des weiteren gibt es Möglich sich nur die die Unternehmen einer gewissen Branche anzeigen zu lassen.

Das alles funktioniert einwandfrei. Er zeigt mir alle Datensätze an so wie ich dies möchte. Er zeigt mir jedoch Datensätze mit dem selben Namen auch jedesmal an. Um dies zu Unterdrücken habe ich im SQL Querry versucht den Befehl 'GROUP BY' zu verwenden.


Code:
Function Datensaetze_Laden()
        Dim con As New OleDbConnection
        Dim cmd As New OleDbCommand
        Dim reader As OleDbDataReader
        Me.lstvUebersicht.Clear()
        con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDATASource
        cmd.Connection = con
        strTemp = "SELECT  ID, Kundenname FROM Kundenstamm WHERE Deaktiviert = False"
        If Me.cboTaetigkeitsbereich.Text <> "" Then
            If cboTaetigkeitsbereich.Text <> "Alle" Then
                strKunde_Taetigkeitsbereich = Me.cboTaetigkeitsbereich.Text
                strTemp = strTemp & " AND Taetigkeitsbereich = '" & strKunde_Taetigkeitsbereich & "'"
            End If
        End If
        If bolKundesuche_Privatperson = False Then
            strTemp = strTemp & " AND Privatperson = False"
        End If
        If bolKundensuche_Unternehmen = False Then
            strTemp = strTemp & " AND Unternehmen = False"
        End If
        If Me.chkHaendler.Checked = False Then
            strTemp = strTemp & " AND Haendler = False"
        End If
        If Me.chkLieferant.Checked = False Then
            strTemp = strTemp & " AND Lieferant = False"
        End If
        strTemp = strTemp & " ORDER BY Kundenname"
        cmd.CommandText = strTemp
        Try
            con.Open()
            reader = cmd.ExecuteReader()
            Do While reader.Read()
                intKunde_ID = reader("ID")
                strKunde_Name = reader("Kundenname")
                intKunde_Anzahl = Me.lstvUebersicht.Items.Count
                If intKunde_Anzahl = 0 Then
                    Me.lstvUebersicht.Columns.Add("ID", 44, HorizontalAlignment.Left)
                    Me.lstvUebersicht.Columns.Add("Kundenname", 550, HorizontalAlignment.Left)
                End If
                Me.lstvUebersicht.Items.Add(intKunde_ID)
                Me.lstvUebersicht.Items(intKunde_Anzahl).SubItems.Add(strKunde_Name)
            Loop
            reader.Close()
            con.Close()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        Return Nothing
    End Function

So funktioniert der Code.

Erweitere ich jedoch jetzt eine Befehlszeile um

Code:
strTemp = strTemp & " ORDER BY Kundenname GROUP BY Kundenname"

wird der im Betreff genannte Fehler angezeit.
Ich habe alle möglichen Notationen probiert auch [] oder ' '

An anderen Stellen des Programms funktioniert diese Anweisung. Wieso hir nicht? Hat jemand eine Idee?

Vielen Dank im Voraus für eure Hilfe

Gruß

Hardy
 
Zuletzt bearbeitet:
Ja ich habe ich Probiert, auch an anderen Positionen.

Auch bei der Folgenden Notation funktioniert es auch nicht. Wenn ich nur
Code:
strTemp = "SELECT  ID, Kundenname FROM Kundenstamm WHERE Deaktiviert = False GROUP BY Kundenname ORDER BY Kundenname"

Kommt der selbe Fehler.

Bei meinen Recherchen im Netz bin ich darauf gestoßen, dass dieser Fehler auftreten kann, wenn man eine Tabellenspalte wie eine Funktion oder einen Befehl benennt.
Aus diesem Grund habe ich die Spalte in der DB auch Kundenname und nicht nur Name genannt. Dann passiert soetwas, hatte zu Anfags dieses Problem.
 
Zuletzt bearbeitet:
Du musst ID auch in die GROUP BY mit aufnehmen.
Wenn du GROUP BY verwendest müssen auch alle Spalten mit in die Group by regel aufgenommen werden die du zurück geben willst.
Ausnahmen sind wie du schon sagtest wenn es sich um Aggregatfunktionen handelt.
 
Vielen Dank Spyke,

habe ich probiert. Hat auch keine Fehlermeldung gegeben, jedoch hatte es den selben Effekt wie ohne GROUP BY.

Ich denke aber ich habe eine Erklärung für die Enstehung des Problems. Jedenfalls hast du Recht, ich muss die ID mit einbeziehen.

- ich habe eine Datenbanktabelle Kundenstamm in der Kundennamen jedoch auch doppelt vorkommen können.
- ich wollte eine Ausgabe der Datensätze ohne Doppelte Einträge, so das jeder Kundenname nur einmal angezeigt wird
- nach einer Selektion des Kunden über die Liste solle der Kunde anhand der ID geladen werden.
- die SQL-Abfrage gibt einen Kundennamen jedoch mehrere ID zurück. Ich denke hier ist das Problem. Weil mit ID in GROUP BY hat er ja für jeden Kundennamen auch eine Möglichkeit dann die ID zu speichern.

Lasse ich die ID in der Abfrage weg, erhalte ich das gewünschte Ergebniss.

In diesem Zusammenhang ist mir jedoch ein genereller Gedankenfehler meinerseits aufgefallen. Hatte wohl zu kompliziert gedacht.
Ich wollte erst eine Übersicht der Kundennamen; ist der ausgewählt Kundenname mehrfach in der Datenbank vertreten, wird ein neues Form geöffnet und alle Kunden des Namens mit Ort werden angezeigt.
Ich mache es nun so das mir direkt alle Kunden mit Ort als Unterscheidungskriterium angezeitgt werden.
 
Zurück