Hallo,
ich beschäftige mich derzeit mit einer Suchfunktion für ein Unterformular, welches im Hauptformular ausgeführt und angezeigt wird.
Den Code dazu habe ich aus einem anderem Forum erhalten, wo ein versierter Nutzer diesen zur Verfügung gestellt hat.
Der Code funktioniert auch schon, jedoch leider nicht ganz korrekt...
Kurz zur Erläuterung meiner Daten:
- Es existiert ein Hauptformular (HF) mit Bankkontaktdaten (Name, Adresse, etc. pp)
- Es existiert ein Unterformular (UFO) mit Datensätzen zu den Sachbearbeitern der Bank (Name, Tel, Email, etc.)
- Tabellen sind über die Banken_ID (AutoWert) aus dem HF und der Banken_ID (Long) aus dem UFO miteinander verknüpft.
hier nun erstmal der von mir verwendete und von willi wipp erstellte (vielen dank!) Code :
' Menue: Extras -> Verweise Microsoft DAO 3.xx Object Library muss aktiv sein!
Option Compare Database
Option Explicit
Private mrs As DAO.Recordset
Private Sub btnErsterAP_Click()
Dim strFind As String
With Me![Banken_UF].Form
Set mrs = CurrentDb.OpenRecordset(.RecordSource, dbOpenSnapshot)
strFind = "SB_Name Like '*" & Me!SB_Suche2 & "*'"
mrs.FindFirst strFind
If mrs.NoMatch Then 'nicht gefunden
MsgBox "Der gesuchte Ansprechpartner '" & Me!SB_Suche2 & _
"' wurde nicht gefunden", , "Verschollen?"
Me!btnNaechsterAP.Enabled = False
Else 'gefunden
Me.Recordset.FindFirst "Banken_ID = " & mrs!Banken_ID
.Recordset.FindFirst strFind
!SB_Name.SetFocus
Me!btnNaechsterAP.Enabled = True
End If
End With
End Sub
Private Sub btnNaechsterAP_Click()
Dim strFind As String
If mrs Is Nothing Then Exit Sub 'zur Sicherheit ;-)
With Me![Banken_UF].Form
strFind = "SB_Name Like '*" & Me!SB_Suche2 & "*'"
mrs.FindNext strFind
If mrs.NoMatch Then 'nicht gefunden
MsgBox "Der gesuchte Sachbearbeiter '" & Me!SB_Suche2 & _
"' wurde nicht gefunden", , "Das waren Alle?"
mrs.Close: Set mrs = Nothing
Me!btnErsterAP.SetFocus
Me!btnNaechsterAP.Enabled = False
Else 'gefunden
Me.Recordset.FindFirst "Banken_ID = " & mrs!Banken_ID
.Recordset.FindFirst strFind
!SB_Name.SetFocus
End If
End With
End Sub
Private Sub Form_Close()
If Not (mrs Is Nothing) Then
mrs.Close: Set mrs = Nothing
End If
End Sub
Nun zu der Stelle an der er harkt. Der erste Button - um die Suche einzuleiten - funktioniert wunderbar. Nach der Eingabe des Suchbegriffs wird auch direkt der passende erste DS im UFO ausgespuckt. Doch beim ersten Klick auf btnNaechsterAP, passiert garnichts und beim zweiten klick, springt er aus dem ersten DS des HF weiter zum Nächsten und gibt mir dort die zu dem Suchbegriff passenden Datensätze aus.
Dadurch ergibt sich folgende Problematik:
Wenn einer in dem Hauptformular hinterlegten Bank mehrere Sachbearbeiter angehören, die den gleichen Namen haben (bspw. 1SB: Peter Meier 2SB: Daniel Meier) und ich eben nach diesem Namen suchen möchte, bekomme ich mit dem Klick auf meinen ersten Button btnErsterAP problemlos den ersten Herrn Meier (SB1) ausgegeben. Beim Klick auf btnNaechsterAP (also beim "weitersuchen"), wird mir aber nicht der zweite SB Daniel Meier (SB2) angezeigt, sondern die Prozedur springt direkt im HF einen DS (also bereits eine Bank) weiter und sucht dort weiter.
Somit wird also ein eventuell existierender zweiter SB mit dem gleichen Namen wie der erste SB der gleichen Bank immer übergangen. Im utopischen Falle, dass eine Bank noch mehr SB mit dem gleichen Namen hat, werden auch diese alle übergangen.
Ich gehe davon aus, das in dem von mir verwendeten Code einfach ein Befehl fehlt, der der Suche sagt, erst alle vorhandenen DS des jeweiligen UFO durchzugehen, bevor er über die verknüpfte Banken_ID einen DS im HF weiterspringt.
Daher würde ich gerne wissen, wie der Code verändert werden muss, damit die Suchfunktion erst alle Unterdatensätze durchgeht, bevor die Suche im nächsten Hauptdatensatz fortgeführt wird.
Für jede Hilfestellung bin ich äußerst dankbar.
kind regards
Hallo Gast,
Probiere mal:
Private Sub btnNaechsterAP_Click()
Dim strFind As String
If mrs Is Nothing Then Exit Sub 'zur Sicherheit ;-)
With Me![Banken_UF].Form
strFind = "SB_Name Like '*" & Me!SB_Suche2 & "*'"
mrs.FindNext strFind
If mrs.NoMatch Then 'nicht gefunden
MsgBox "Der gesuchte Sachbearbeiter '" & Me!SB_Suche2 & _
"' wurde nicht gefunden", , "Das waren Alle?"
mrs.Close: Set mrs = Nothing
Me!btnErsterAP.SetFocus
Me!btnNaechsterAP.Enabled = False
Else 'gefunden
Me.Recordset.FindFirst "Banken_ID = " & mrs!Banken_ID
' .Recordset.FindFirst strFind Entfernen!!!!!
.Recordset.FindNext strFind ' Dafür FindNext
!SB_Name.SetFocus
End If
End With
End Sub
Gruß Oma
Hallo oma,
vielen Dank für die schnelle Antwort.
Ich wusste doch, dass so eine einfache kleine Änderung mir schon weiterhilft.
Deshalb nochmals Danke.
Leider funktioniert der Code in der Abwandlung nun genau bis zum zweiten Sachbearbeiter.
Ich weiß, es ist ein absolut utopischer und banaler Fall, dass eine Bank mehr als zwei Sachbearbeiter des gleichen Namens hätte, aber ich würde diesen Code auch gerne für andere Unterformularsuchvorgänge nutzen.
Also, beim ersten Klick auf den btnNaechsterAP, springt er direkt zum zweiten korrekten Suchergebnis, beim 3 klick springt er aber spätestens in den nächsten Hauptdatensatz. Also würde ein potenzieller dritter DS, der der Suche entspricht wieder übergangen werden.
Da ich mit VBA gerade meine ersten Gehversuche bestreite, hab ich nur Fetzen von Wissen, die vor allem - bezogen auf die VBA schreibweise - absolut unkoordiniert sind ;)
Könnte man jetzt nicht hier irgendwo mit nem loop arbeiten, dass die Suche in den zugeordneten Unterdatensätzen solange vollzugen wird, bis das Ende der Datensätze erreicht ist? Es gibt doch EOF Befehle, oder sind die hier nicht hilfreich?
Also, zusammengefasst, der Code funktioniert nun genau einen Klick weiter, bzw. zwei dem Suchbegriff entsprechende Datensätze lang.
Es gibt doch bestimmt die Möglichkeit, hier eine Schleife einzubauen kann, die dazu führt, dass erst alle verknüpften Unterdatensätze (gehen wir mal hypothetisch von einer Anzahl x aus) zu einem Hauptformulardatensatz durchlaufen werden, bevor bei den verknüpften Datensätzen des nächsten Hauptformulardatensatzes wieder nach dem eingegebenen Suchbegriff gesucht wird.
Wiederum bin ich für jede Hilfe dankbar!
Beste Grüße
Hallo,
habe dein Problem mal nachgestellt; das richtige Suchen wird doch mit meiner Änderung realisiert!
Voraussetzung ist allerdings eine Sortierung der Datensätze im Unterformular durch eine entsprechende Abfrage.
Siehe hierzu mal mein Beispiel!
Gruß Oma
[Anhang gelöscht durch Administrator]
hallo,
ich glaube zu wissen was du meinst, aber das funktioniert bei mir immer noch nicht richtig.
außerdem sehe ich dein beispiel nicht?! (muss ich dafür registriert sein?)
ich habs jetzt so versucht.
aus meiner Tabelle Banken_SB hab ich per Tabellenerstellungsabfrage eine neue Tabelle machen lassen in der alle Datensätze nach Banken_ID sortiert sind.
Wenn ich jetzt mein Formular mit der neu erstellten Tabelle als Unterformular vernküpfe, dann funktioniert das Weitersuchen im gesamten ersten Hauptdatensatz, aber schon beim zweiten Hauptdatensatz überspringt er wieder einen Sachbearbeiter.
Zur Entwicklung suche ich schlichtweg nach dem Wort Herr, welches vor jedem Namen steht bei den Sachbearbeitern. Das heißt, er müsste beim klick auf btnNaechsterAP ja eigentlich alle Datensätze schön der Reihe nach durchgehen, was aber leider nicht der Fall ist.
Außerdem hab ich noch das Problem, dass ich die Abfrage ja nur über eine Tabellenerstellung lösen kann (zumindest ist das der einzige Weg den ich kenne).
Wenn ich jetzt aber zur neuen Sortierung wieder eine Tabellenerstellungsabfrage über die Banken_SB tabelle laufen lasse um die Banken_SB_Sort neu zu füllen, z.B. nachdem ich neue Sachbearbeiter eingegeben habe, will Access die Tabelle komplett löschen und neu erstellen.
Da die Tabelle aber Teil meiner Beziehungen ist (Banken[Banken_ID] 1:n Banken_SB_Sort[Banken_ID]), funktioniert das auch nicht mehr als einmal!?
Hallo
gast=borst1
hab mich jetzt mal angemeldet um deinen Anhang zu sehen...
Leider kann ich meine als Gast erstellten postings nicht editieren, insofern, sorry für Doppelpost!
Sehe mir jetzt mal dein Beispiel an!
[edit]
Also bei dem von dir erstellen Beispiel existiert der gleiche "kleine Bug" wie in meiner Entwicklungs-DB.
Such mal spaßeshalber in deiner Beispiel-DB nach * und klicke dich mit weitersuchen durch.
Sobald der erste Hauptkunde fertig ist, springt er in den nächsten Hauptdatensatz und "übersieht" bei seiner Suche den ersten Datensatz im UFO.
War diese Erklärung verständlich? ;)
Hallo,
also ich denke, du suchst nach Nachnamen der Mitarbeiter im Unterformular!?
Gebe mal im Beispiel "Schmidt" ein, u. die Suche sollte richtig erfolgen.
ZitatAußerdem hab ich noch das Problem, dass ich die Abfrage ja nur über eine Tabellenerstellung lösen kann (zumindest ist das der einzige Weg den ich kenne).
verstehe ich überhaupt nicht, du kannst doch einfach eine Abfrage erstellen, in der die Sortierung nach Nr und Nachnamen erfolgt (wie im Beispiel) u. diese Abfrage dann als Datenherkunft des Unterformulars zu wählen. Was hat das mit Tabellenerstellung zu tun ??
Gruß Oma
Zitat
Hallo,
also ich denke, du suchst nach Nachnamen der Mitarbeiter im Unterformular!?
Gebe mal im Beispiel "Schmidt" ein, u. die Suche sollte richtig erfolgen.
Das ist vollkommen richtig. Im zu Grunde gelegten Beispiel möchte ich nach Mitarbeiternamen suchen. Da ich diesen Code aber gerne auch in weiteren Unterformularen zur Suche verwenden möchte, muss diese so funktionieren, dass auch 5, 10 oder 20 Datensätze mit einem gleichen Feldinhalt korrekt von Ihr entdeckt werden!
Ändere in deinem Beispiel einfach mal die Namen der ersten beiden Sachbearbeiter der zweiten Firma auf Schmidt und suche dann nach Schmidt. Die letzten beiden Sachbearbeiter der ersten Firma werden korrekt gefunden und danach wird direkt der zweite Sachbearbeiter der zweiten Firma gefunden. Der erste Sachbearbeiter der zweiten Firma wird übergangen. Und so ist es auch bei der dritten Firma wenn dort der erste Sachbearbeiter auch wieder Schmid heißt.
Ich würde mal raten, dass das an der mrs.FindNext Anweisung liegt. Der Weitersuchenbutton kennt die FindFirst Anweisung ja garnicht. Die gibts ja nur beim Suchen Button.
Private Sub btnNaechsterAP_Click()
Dim strFind As String
If mrs Is Nothing Then Exit Sub 'zur Sicherheit ;-)
With Me![Banken_UF].Form
strFind = "SB_Name Like '*" & Me!SB_Suche2 & "*'"
mrs.FindNext strFind
Zitat
du kannst doch einfach eine Abfrage erstellen, in der die Sortierung nach Nr und Nachnamen erfolgt (wie im Beispiel) u. diese Abfrage dann als Datenherkunft des Unterformulars zu wählen. Was hat das mit Tabellenerstellung zu tun ??
Du hast auch vollkommen Recht ;) Ich hab irgendwie versucht um drei Ecken zu denken obwohl dein Weg ebenso funktioniert und dazu noch wesentlich einfacher ist!
Hallo
crossposting ist in allen Foren unbeliebt, zumal wenn du noch Teilergebnisse aus einem Forum ins andere zur Diskussion stellst!!!
Dann bleibe auch mal dort!
Gruß Oma
hm,
das hätte ich ehrlich gesagt nicht gedacht..
ich betrüge ja keinen um seinen code oder ähnliches.
habe ja auch klar im ersten beitrag dargestellt, dass ich den code in einem anderen forum gefunden habe!
also was sollte ich denn nun tun? den thread hier löschen?
schade, dass der versuch breiter gefächert ne lösung für ein problem zu finden, so negativ interpretiert wird...
Hallo,
Zitatschade, dass der versuch breiter gefächert ne lösung für ein problem zu finden, so negativ interpretiert wird...
Es geht nicht nur um die Quellenangabe, es geht mehr um das Grossposting. Das will keiner. Es steht auch in den Regeln des Forums, dass das nicht erwünscht ist.
Zitat von: ForenregelCrossposting, d.h. das Posten der gleichen Frage in mehreren Foren zur gleichen Zeit, ist unerwünscht.
Meistens kriegt man auch gar keine Antwort mehr, Du erreicht also eher das Gegenteil.
Bedenke, dass die Access Foren wie ein Dorf sind, da bleibt nichts verborgen. ;D
hi,
ZitatEs geht nicht nur um die Quellenangabe, es geht mehr um das Grossposting. Das will keiner. Es steht auch in den Regeln des Forums, dass das nicht erwünscht ist.
ok, akzeptiere ich ja auch vollkommen.
Zitat
Meistens kriegt man auch gar keine Antwort mehr, Du erreicht also eher das Gegenteil.
Bedenke, dass die Access Foren wie ein Dorf sind, da bleibt nichts verborgen. ;D
schöne methaphorische darstellung.
also bleibt mir jetzt nichts anderes, als meine mitgliedschaften zu killen, mir ne fake email zu besorgen und unter anderem namen mich neu anzumelden?
oder existiert ne minimale chance, dass fehler - die gerne mal gemacht werden - verziehen werden? irgendeine hoffnung auf freispruch? :-\
habe ja bereits meine hilfe von hier im anderen forum gelöscht...
Hallo,
Zitatoder existiert ne minimale chance, dass fehler - die gerne mal gemacht werden - verziehen werden? irgendeine hoffnung auf freispruch?
Ja ;D
schön das schon mal du das so siehst :-*
hoffe oma kann auch nochmal ein auge zudrücken...
man verscherzt es sich nicht gern mit nem moderator, der auch noch access guru ist ;D
also ums kurz zu halten: ich bin immer noch dankbar für ne hilfestellung.
mein post im anderen board ist schon (fast) wieder in den tiefen des unterforums verschwunden..
Hallo,
das wir gegen Crossposting sind , ist ja nicht nur weil es in den Regeln des Forums steht, sondern für einen Helfer auch eine unangenehme Sache ist.
Man nimmt sich der Sache an, denkt darüber nach, baut evt. ein kleines Beispiel, schnell ist mal eine 1/2 Stunde vergangen.
Und dann kommt u.U. die Nachricht: Haha, zu spät, habe schon eine andere Lösung.
Nun zum Beispiel:
Ja, meine Lösung klappte nicht, wenn im Unterformular zu einem Datensatz des Hauptformulars der Suchbegriff an erster Stelle stand.
(Habe eben nicht alle Konstellationen geprüft :D)
Probiere doch nun mal das neue Beispiel mit dem Kollegen Schmidt ;D
Klappen tut die Sache aber nur, wenn der ganze Name eingegeben wird. deshalb wäre eine Eingabe des Names mit einem Kombifeld zweckmäßig. Evt. fällt mir auch noch etwas zum Suchen mit Teilstrings ein ?
Gruß Oma
[Anhang gelöscht durch Administrator]
Hallo,
sorry, das war die alte Version; anbei die neue
Gruß Oma
[Anhang gelöscht durch Administrator]
Zitat
Man nimmt sich der Sache an, denkt darüber nach, baut evt. ein kleines Beispiel, schnell ist mal eine 1/2 Stunde vergangen.
Und dann kommt u.U. die Nachricht: Haha, zu spät, habe schon eine andere Lösung.
kann ich sehr gut nachvollziehen. und daher gebe ich auch immer brav feedback wenn jemand so nett ist, sich meinem problem anzunehmen!
jetzt zu deiner zweiten beispieldatei:
Bei mir funktioniert das ganze einwandfrei! Superstark! Vielen Dank!
Sogar der von dir angesprochene Fall, dass wenn nach Teilstrings gesucht wird funktioniert bei mir fehlerlos (habs mal mit "Schmi" und "Krau" versucht und alle Schmidt und Krause werden brav gefunden!). Könnte das evtl. an der neueren Access Version liegen? (nur ne Vermutung ;) )
Jetzt würde ich gerne rein zum Verständnis nachfragen:
Private Sub Weitersuchen_Click()
Dim strFind As String
If mrs Is Nothing Then Exit Sub 'zur Sicherheit ;-)
With Me![frmKunden_UF].Form
strFind = "NachName Like '*" & Me!Suchfeld & "*'"
mrs.FindNext strFind
If mrs.NoMatch Then 'nicht gefunden
MsgBox "Der gesuchte Sachbearbeiter '" & Me!Suchfeld & _
"' wurde nicht gefunden", , "Das waren Alle?"
mrs.Close: Set mrs = Nothing
'Me!btnErsterAP.SetFocus
'Me!btnNaechsterAP.Enabled = False
Else 'gefunden
Me.Recordset.FindFirst "KNr = " & mrs!KNr
!Nachname.SetFocus
'.Recordset.FindFirst strFind
.Recordset.FindNext strFind
End If
End With
End Sub
funktionert das ganze jetzt wirklich, "NUR", weil du die Reihenfolge des "Fokussetztens" und der FindNext Anweisung umgedreht hast? Ist es wirklich so einfach gewesen? ;)
Zitat von: oma am Juli 30, 2010, 12:14:08
Hallo,
sorry, das war die alte Version; anbei die neue
Gruß Oma
das kann nicht die alte gewesen sein oma,
die hat nämlich bei mir schon funktioniert! :o
[edit]
also nach sichtung der neuesten version von dir, sehe ich doch mehr unterschiede im code, als ich zuvor in der version sah. aber warum zum teufel hat die denn auch funktioniert?!
Fakt ist, auch die neuste läuft 1A und ist sauber.
Also: vielen Dank für deine Hilfe bei dieser Problemstellung!
Da mein erster Beitrag als Gast war kann ich für den Thread kein "Problem-gelöst-Häckchen" setzen oder?
Hallo,
anbei noch mal eine Lösung, in der nun alle Flüchtigkeiten beseitigt sein sollten (mal für verschiedene Fälle testen)
Die Lösung gegenüber der ehemaligen Lösung von Willi Wipp besteht in den angemerkten Zeilen:
Private Sub SuchenM_Click()
Dim strFind As String
With Me!frmKunden_UF.Form
Set mrs = CurrentDb.OpenRecordset(.RecordSource, dbOpenSnapshot)
strFind = "NachName Like '*" & Me!SuchfeldMitarbeiter & "*'"
mrs.FindFirst strFind
If mrs.NoMatch Then
MsgBox "Mitarbeiter '" & Me!SuchfeldMitarbeiter & "' nicht vorhanden"
Else
Me.Recordset.FindFirst "KNr = " & mrs!KNr
.Recordset.FindFirst "MNr=" & mrs!MNr 'Hier ist die Änderung
!Nachname.SetFoc
End If
End With
End Sub
Private Sub WeitersuchenM_Click()
Dim strFind As String
If mrs Is Nothing Then Exit Sub
With Me![frmKunden_UF].Form
strFind = "NachName Like '*" & Me!SuchfeldMitarbeiter & "*'"
mrs.FindNext strFind
If mrs.NoMatch Then
MsgBox "Mitarbeiter '" & Me!SuchfeldMitarbeiter & "' nicht mehr gefunden"
mrs.Close: Set mrs = Nothing
Else
Me.Recordset.FindFirst "KNr = " & mrs!KNr
.Recordset.FindFirst "MNr=" & mrs!MNr ' Hier ist die Änderung
!Nachname.SetFocus
End If
End With
End Sub
Vorher wurde doppelt FindFirst bzw FindNext aufgerufen, nun wird nach FindFirst bzw. FindNext im Hauptformular die Kundennummer und im Unterformular die Mitarbeiternummer mit Me.Recordset.FindFirst "KNr = " & mrs!KNr bzw. mit .Recordset.FindFirst "MNr=" & mrs!MNr die "Treffer "angezeigt"
Teste mal ausgiebig und melde Dich mit Erfolg oder Misserfolg.
@Klaus: könnte das Suchen in Unterformularen evt. für ein Beispiel für unseren Download-bereich sein (nach entsprechender Verallgemeinerung)??
Gruß Oma
[Anhang gelöscht durch Administrator]
Hallöchen,
nachdem deine vorherigen Verbesserungen schon fehlerfrei lauffähig bei mir waren, werde ich mir auch diesen code nochmals zu gemüte führen und ausgiebig testen. Das ganze aber erst morgen über Tag, also denke ich mal gibts frühestens nachmittags ne Antwort.
nochmals danke für deine Hilfe!
ps: beim suchen knopf
Zitat
Else
Me.Recordset.FindFirst "KNr = " & mrs!KNr
.Recordset.FindFirst "MNr=" & mrs!MNr 'Hier ist die Änderung
!Nachname.SetFoc 'sollte wohl eher SetFocus sein oder? ;)
End If