Hilfe! Mein Listenfeld zeigt keine Daten an

Hallo,

Ich habe eine Suche nach vier Kriterien (Matrikelnummer, Name, Vorname, Ort), die im Formular eingegeben werden können und will die Ergebnisse im selben Formular in einem Listenfeld erscheinen lassen. Nach meinem Code tun sie das aber nicht. Woran liegt es? Die Trefferzahl wird angezeigt. Hier mein Code:

Private Sub Datensatz_suchen_Click()

Dim Krit(1 To 4) As String
Dim SQL As String
Dim Anz As Byte, i As Long, treffer As Long 'Anz zählt mit, wieviele Bedingungen es gibt
Dim ergebnis As Control

'bis zu vier Suchfelder als Kriterien merken

If Not IsNull(Me!Matrikelnummer) Then
Anz = Anz + 1
Krit(Anz) = „MNr LIKE '“ & Me!Matrikelnummer & „%’“
End If

If Not IsNull(Me!Name) Then
Anz = Anz + 1
Krit(Anz) = „strApplicantName LIKE '“ & Me!Name & „%’“
End If

If Not IsNull(Me!Vorname) Then
Anz = Anz + 1
Krit(Anz) = „strApplicantVorname LIKE '“ & Me!Vorname & „%’“
End If

If Not IsNull(Me!Ort) Then
Anz = Anz + 1
Krit(Anz) = „strApplicantOrt LIKE '“ & Me!Ort & „%’“
End If

Select Case Anz
Case 0 'es sind keine Kriterien erfaßt
MsgBox „Sie haben keine Suchkriterien erfasst!“, vbExclamation, „Eingabefehler“
Me!Matrikelnummer.SetFocus
Exit Sub

Case 1 'es ist ein Kriterium erfaßt
SQL = SQL & "WHERE " & Krit(1)

Case Else 'es gibt mehr als ein Kriterium
SQL = SQL & "WHERE " & Krit(1)
For i = 2 To Anz
SQL = SQL & " AND " & Krit(i)
Next
End Select

treffer = GetTreffer(SQL)

Set ergebnis = Me!lstSuchergebnis

Select Case treffer
Case 0
MsgBox „Leider keine Treffer.“, vbInformation, „Antragsuche“
Me!txtTreffer = treffer
ergebnis.RowSource = „“

Case Is > 100
MsgBox „Es können maximal 100 Treffer ausgegeben werden, Ihre Kriterien würden“ & _
„aber " & treffer & " Treffer ergeben.“ & vbCrLf & vbCrLf & „Geben Sie genauere“ & _
" Kriterien ein!", vbExclamation, „Antragsuche“

Me!txtTreffer = 0
ergebnis.RowSource = „“

Case Else

SQL = „SELECT MNr as Matrikelnummer, strApplicantName as Nachname,“ & _
" strApplicantVorname as Vorname, lngClaimAntrag_fuer as Semester," & _
„strClaimBearbeiterkürzel as Aktenzeichen FROM qry_frm_antrag“ & SQL & _
SQL = SQL & „ORDER BY strApplicantName“

ergebnis.RowSource = SQL
Me!txtTreffer = treffer
End Select

End Sub

'Trefferanzahl prüfen
Public Function GetTreffer(ByVal Krit As String) As Long

Dim SQL As String
Dim dbcon As ADODB.Connection
Dim rs As ADODB.Recordset
SQL = "SELECT Count(*) as treffer from qry_frm_Antrag "
SQL = SQL & Krit

Set dbcon = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open SQL, dbcon
GetTreffer = rs!treffer

rs.Close
Set dbcon = Nothing

End Function

Hallo,
auf den ersten Blick:

ersetz mal „%’“ durch „*’“

und ohne den kompletten Code analysiert zu haben.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo,

Woran liegt es?

Frage: warum machst du es nicht einfacher:

  • alle Suchfelder mit „*“ vorbelegen
  • eckige Klammern verwenden für Feldbezeichnungen der Tabelle
  • SQL-Kriterium fest programmieren, da du ja nur AND verwendest:

Beispiel:
SQL_Kriterium = _
„([MNr] LIKE '“ & Me!Matrikelnummer & "’) and " & _
„([strApplicantName] LIKE '“ & Me!xName & "’) and " & _
„([strApplicantVorname] LIKE '“ & Me!Vorname & "’) and " & _
„([strApplicantOrt] LIKE '“ & Me!Ort & „’)“

Die Eingabe würde dann z.B. so aussehen:
MNr = „123456“
xName = „*“
Vorname = „*“
Ort = „*“

So ist auch die Suche nach z.B. „*meier*“ möglich und nicht nur wie bei dir „meier*“. Das Sternchen muss halt vom User mit eingegeben werden!

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Platzhalter
Hallo Franz,

Danke für die Antwort.
Ich arbeite mit Access-Projekt und Sql-Server, daher % statt * als Platzhalter.
Gruß
Roter Adler

Hallo Netwolf,

danke für die Anregungen.

Name, da hast Du Recht, das habe ich übersehen

und Matrikelnummer ist eine Zahl, aber wenn nicht LIKE, was dann für ein Operator, damit auch Nummern, die nur mit der z.B. „1“ anfangen genommen werden?

An welcher Stelle sollte ein Requery hin?

Die Sache mit den Sternchen überall eingeben wollte ich meinen Nutzern ersparen und eigentlich liefert die Abfrage (zumindest die GetTreffer) auch jedesmal eine richtige Trefferzahl. Nur die Abfrage in der „Case Else“-Bedingung wird nicht als Datensatzherkunft(ergebnis.rowsource) genommen, so daß das Listenfeld nur eine leere Tabelle mit vorgezeichneter Überschriftseinteilung anzeigt. Woran aber liegt das? (Fehlendes Requery?)

Gruß
Roter Adler

Hallo Roter Adler,

und Matrikelnummer ist eine Zahl, aber wenn nicht LIKE, was
dann für ein Operator, damit auch Nummern, die nur mit der
z.B. „1“ anfangen genommen werden?

wandele die Artikelnummer in einen String, dann kannst du sie mit einem String vergleichen.

STR(Artikelnnr) like „1*“

An welcher Stelle sollte ein Requery hin?

ans Ende, nach dem END CASE

Woran aber liegt das? (Fehlendes Requery?)

ganz sicher, da ja die Ansicht aktualisiert werden muss

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Listenfeld immernoch leer
Hallo Netwolf,

danke für Deine Beiträge, aber mein Listenfeld zeigt immernoch nicht die Suchergebnisse an.

Noch eine Idee?

Gruß
Roter Adler

Hallo Roter Adler,

Noch eine Idee?

wie sieht dein Code jetzt aus?

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

P.S. schick mal die MDB rüber, dann kann ich mal prüfen

Hallo Netwolf,

Das Problem ist eingegrenzt. Es ist diese Anweisung. Man kann wohl in die „Rowsource“ das SQL (mit der Where-KLausel) nicht so einschließen. Ohne das Fettgedruckte bekomme ich eine Listenanzeige, allerdings berücksichtigt sie die Where-Klausel nicht und damit werden alle 24000 Datensätze in die Liste geschrieben.

ergebnis.RowSource = „SELECT [MNr] as Matrikelnr, [strApplicantName] as Nachname,“ & _
" [strApplicantVorname] as Vorname, [lngClaimAntrag_fuer] as Semester," & _
„[strClaimBearbeiterkürzel] as Aktenzeichen FROM qry_frm_antrag“ & SQL & & _
„ORDER BY strApplicantName“

Geht das anders? Diese SQL ist ja ein case:

Case 1 'es ist ein Kriterium erfaßt
SQL = "WHERE " & Krit(1)

Case Else 'es gibt mehr als ein Kriterium
SQL = "WHERE " & Krit(1)
For i = 2 To Anz
SQL = SQL & "AND " & Krit(i)
Next

Gruß
Roter Adler

Hallo Roter Adler,

Das Problem ist eingegrenzt. Es ist diese Anweisung. Man kann
wohl in die „Rowsource“ das SQL (mit der Where-KLausel) nicht
so einschließen. Ohne das Fettgedruckte bekomme ich eine
Listenanzeige, allerdings berücksichtigt sie die Where-Klausel
nicht und damit werden alle 24000 Datensätze in die Liste
geschrieben.

auch wenn du nur ein Kriterium hast? Dein SQL-String wird nicht größer als 255 Zeichen?

ergebnis.RowSource = „SELECT [MNr] as Matrikelnr,
[strApplicantName] as Nachname,“ & _

-> kein Leerzeichen am Ende!

" [strApplicantVorname] as Vorname,
[lngClaimAntrag_fuer] as Semester," & _

-> kein Leerzeichen am Ende!

„[strClaimBearbeiterkürzel] as Aktenzeichen FROM
qry_frm_antrag“ & SQL & & _

-> hier sind zwei & Zeichen!?
-> kein Leerzeichen am Ende!

„ORDER BY strApplicantName“

-> kein Leerzeichen am Anfang! (weil es in der Where-Klausel nicht drin ist)

Geht das anders? Diese SQL ist ja ein case:

Case 1 'es ist ein Kriterium erfaßt
SQL = "WHERE " & Krit(1)

Case Else 'es gibt mehr als ein Kriterium
SQL = "WHERE " & Krit(1)
For i = 2 To Anz
SQL = SQL & "AND " & Krit(i)

-> kein Leerzeichen am Anfang von AND!

Next

lasse dir doch einfach mal den kompletten SQL-String vor der Ausführung mal anzeigen, häufig sieht man dann schon die kleinen Flüchtigkeitsfehler :smile:

z.B. das fehlende Semikolon am Ende der SQL-Anweisung!

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo Netwolf,

Das war es. Vielen Dank für das Semikolon (und die Leerzeichen)!
Super, das hat mir das Wochenende gerettet.

Übrigens funktioniert das Ganze bei mir auch ohne Requery.

Schönes Wochenende
Roter Adler