1k Aufrufe
Gefragt in Anwendungen(Java,C++...) von bollerkohl Mitglied (175 Punkte)
Hallo zusammen,

ich habe eine kleine Mitarbeiterdatenbank in VB erstellt.
Habe aber ein kleines Problem mit der Suche in dieser?
Kann mir jemand helfen die Suche zu optimieren?
Wenn in der Textdatei z.B. zweimal der Name Müller exestiert springt die Suche nur zum ersten Datensatz.

Hier der Code:


Private Sub cmdSearch_Click()

Dim NameToSearch As String
Dim Found As Integer
Dim RecNum As Long
Dim TmpPerson As AdressenInfo

' Den zu suchenden Nachnamen vom Anwender ermitteln
NameToSearch = InputBox(inpBoxSearch$, inpTitel$)

' Wenn der Anwender keinen Namen eingegeben hat, wird
' die Prozedur beendet
If NameToSearch = "" Then
' Fokus an das Feld txtVorname
txtVorname.SetFocus
' Prozedur beenden
Exit Sub
End If

' Den gesuchten Namen in Großbuchstaben umwandeln
NameToSearch = UCase(NameToSearch)

' Flags initialisieren.
Found = False

' Suche nach dem von Anwender eingegebenen Namen
For RecNum = 1 To varLETZTERRec
Get #DNr, RecNum, TmpPerson
If InStr(UCase(Trim(TmpPerson.Nachname)), NameToSearch) Or _
InStr(UCase(Trim(TmpPerson.Kommentar)), NameToSearch) Or _
InStr(UCase(Trim(TmpPerson.Vorname)), NameToSearch) Or _
InStr(UCase(Trim(TmpPerson.InboundID)), NameToSearch) Then


' If (NameToSearch Like UCase(Trim(TmpPerson.Nachname))) Or _
' (NameToSearch Like UCase(Trim(TmpPerson.Vorname))) Or _
' (NameToSearch Like UCase(Trim(TmpPerson.InboundID))) Then
Found = True
Exit For
End If
Next

' For RecNum = 1 To varLETZTERRec
' Get #DNr, RecNum, TmpPerson
' 'If NameToSearch = UCase(Trim(TmpPerson.Nachname)) Then
' If NameToSearch = UCase(Trim(TmpPerson.Nachname)) Or NameToSearch = UCase(Trim(TmpPerson.Vorname)) Or NameToSearch = UCase(Trim(TmpPerson.InboundID)) Then
' Found = True
' Exit For
' End If
' Next

' Wenn der Nachname gefunden wurde, wird der entsprechende
' Datensatz angezeigt
If Found = True Then
AktuellenDatensatzSpeichern
varACTRec = RecNum
AktuellenDatensatzAnzeigen
Else
MsgBox varmsgNachname$ + NameToSearch + varmsgnotFound, vbOKOnly + vbInformation, "Message...", 0, 0
End If

' Fokus geht an das Feld txtVorname
txtVorname.SetFocus

End Sub



Vielen Dank für eine Idee

1 Antwort

0 Punkte
Beantwortet von kicia Mitglied (939 Punkte)
Hallo Bollerkohl,

Du brauchst auf jedenfall einen Speicher, indem Du die Treffer ablegst.
Die Schleife darf bei einem Treffer nicht abbrechen.

Also:
- Alle Datensätze durchlaufen
- bei Treffer die Referenznummer in ein Array eintragen

"Found = True" und "Exit For" werden ersetzt durch "füge Eintrag zu Array hinzu" (ich weiß nicht, wie man das in VB am besten macht)

"If Found = True Then..." usw. wird ersetzt durch gewünsche Auswertung des Arrays.

Mit dem Array kannst Du dann beliebig die Datensätze in einer Trefferübersicht anzeigen oder im Dokument markieren, oder was Du sonst möchtest.

Bei null Treffern bleibt das Array eben leer, es werden also keine Datensätze markiert und die Übersicht zeigt ggf. "keine Treffer" oder so.

Wenn die Datenbank sehr groß ist, kann man auch noch mehr optimieren, aber das wird etwas umfangreicher.

Gruß, kicia
...