Hallo,
ich soll für einen Bekannten einen Fehler in seiner Access Datenbank beheben. Es geht darum, dass auf einem Adressformular ein Button liegt, der beim klicken ein Fenster mit einer Adressliste öffnet. In dieser kann ich dann eine Adresse auswählen und mit OK bestätigen um diese in dem vorherigen Adressformular anzuzeigen. Das Problem ist, wenn nun der gleiche Nachname bei verschiedener Personen auftaucht, kann ich von diesen wählen wie ich will. Es wird immer die 1. Person der Dazugehörigen Tabelle angezeigt die diesen Nachnamen trägt.
Ein ganz besonders grosses Problem: ich hab nicht die geringste Ahnung von Access.
Ich habe mir die Datenbank dann Stundenlang angeschaut. Unter dem angesprochenen Button ist ein Klick-Ereignis definiert. mit folgendem Code:
Option Compare Database
Private Sub Befehl30_Click()
DoCmd.OpenForm "Startmenue", acNormal
DoCmd.Close acForm, "Adressen"
End Sub
Private Sub Befehl52_Click()
Dim X$, rs As Recordset
X$ = DatensatzAuswahl("Adresse wählen:", "AFAdressen", "5;5;5;", 1)
If X$ = "" Then Exit Sub
Set rs = Me.RecordsetClone
rs.FindFirst "[Nachname]= " + Chr$(34) & X$ & Chr$(34)
If Not rs.NoMatch Then 'Gefunden
Me.Bookmark = rs.Bookmark
End If
End Sub
ich habe daran mal mit 0 Ahnung rumgespielt und folgendes draus gemacht:
Option Compare Database
Private Sub Befehl30_Click()
DoCmd.OpenForm "Startmenue", acNormal
DoCmd.Close acForm, "Adressen"
End Sub
Private Sub Befehl52_Click()
Dim X$, YS, rs As Recordset
X$ = DatensatzAuswahl("Adresse wählen:", "AFAdressen", "5;5;5;", 1)
If X$ = "" Then Exit Sub
Set rs = Me.RecordsetClone
rs.FindFirst "[Nachname]= " + Chr$(34) & X$ & Chr$(34)
If Not rs.NoMatch Then 'Gefunden
Y$ = DatensatzAuswahl("Adresse wählen:", "AFAdressen", "5;5;5;", 2)
rs.FindFirst "[Vorname]= " + Chr$(34) & Y$ & Chr$(34)
If Not rs.NoMatch Then 'Gefunden
Me.Bookmark = rs.Bookmark
Else
Me.Bookmark = rs.Bookmark
End If
End If
End Sub
Das ist bestimmt völliger Unsinn aber es funktioniert sogar zum teil aber es produziert auch einen neuen Fehler. Es sieht so aus das ich nun meine Adresse im geöffneten Fenster wähle und das Fenster ohne weitere Reaktion nach der Auswahl schliesst. Wenn ich dann nochmal probiere bekomme ich die korrekte Adresse wie es gewollt ist. Versuche ich dann nochmal geht das Fenster ohne Reaktion zu. Das mal darauf geht es wieder. Es ist immer abwechselnt.
Wenn ich die zeile ...
X$ = DatensatzAuswahl("Adresse wählen:", "AFAdressen", "5;5;5;", 1)
... kopiere
also einfach nocheinmal eine Zeile weiter druntersetze, wird die korrekte Adresse immer erst beim dritten mal übergeben.
Ich hoffe hier kann mir jemand helfen. In google find ich nichts. Weiss auch garnicht so recht nach welchen Begriffen ich suchen soll.
Danke im Voraus
Talon
Edit: Ich wollte noch anfügen, dass es um Access 2007 auf Windows 7 geht.
Hi Talon,
ich muss sagen, so ganz verstehe ich dein Problem noch nicht. Was macht denn die Funktion DatensatzAuswahl?
Hast du dazu auch Code?
Prinzipiell kannst du bei rs.Findfirst auch mehrere Bedingungen angeben. Das würde deine komische Verschachtelung vielleicht auflösen.
rs.FindFirst "[Nachname]= " & Chr$(34) & X$ & Chr$(34) & " AND [Vorname]=" & chr$(34) & Y$ & chr$(34)
lg, sam
Hallo
Das Problem ist, dass bei der ersten Auswahl nichts passiert, bei der zweiten Ausführung Funktioniert alles richtig, dann wieder nichts... usw... also immer abwechselnd geht/geht nicht.
Die Funktion DatensatzAuswahl sieht so aus:
Function DatensatzAuswahl(strTitel As String, _
strAbfrage As String, _
strSpaltenbreiten As String, _
intGebSpalte As Integer) As String
'strTitel= Titel für das Fenster
'strAbfrage= Abfrage oder SQL-Statement für Listeninhalt
'strSpaltenbreiten= Spaltenbreiten, z.B. "5;2;1"
'intGebSpalte= Nummer der Spalte, deren Inhalt als Ergebnis gemeldet wird
Dim strOA As String 'für die OpenArgs-Übergabe
DoCmd.Hourglass True
strOA = strTitel + "|" + strAbfrage + "|" + strSpaltenbreiten + "|" + CStr(intGebSpalte)
DoCmd.OpenForm "frmDatensatzAuswahl", , , , , acDialog, strOA
DatensatzAuswahl = DSAErgebnis
End Function
und DSAErgebnis kommt denke ich aus dem OK Button:
Private Sub btnOK_Click()
Dim Idx As Integer, strX As String
Idx = Me.lstChoose.ListIndex
If Idx < 0 Then
Beep
Exit Sub
End If
strX = Me.lstChoose.Column(ReturnCol - 1)
DSAErgebnis = strX
DoCmd.Close acForm, Me.Name, acSavePrompt
End Sub
Sry wenn ich mich ziemlich dämlich anstelle aber ich habe Access diese Woche das erste mal gestartet gesehen xD
lg
Talon
Hallo Talon
Der Code ist soweit richtig nur dein aufbau zur suche "Nachname " ist Falsch. Was bei dir jetzt geschieht du suchst "Müller" in deine Tabelle stehen z.b fünf Einträge mit "Müller" wird er dir immer den ersten anzeigen egal ob du den zweiten ausgewählt hast oder den dritten. Du solltest nach der ID vor dem "Nachnamen" suchen lassen, in dem Kobfeld erweitern auf eine nicht sichtbare Spalte wo die ID aus deiner Tabelle mit geführt wird, diese Übergibst du deinem Code und läst ihn suchen
Gruß Stefan
Hallo
danke für die Antwort. Das klingt einleuchtend. Ich sitze gerade dabei und versuche es. Ich habe nun für die Abfrage AFAdresse um die ID erweitert. Ich habe dazu folgende Codefragmente verändert:
Private Sub btnOK_Click()
Dim Idx As Integer, strX As String
Idx = Me.lstChoose.ListIndex
If Idx < 0 Then
Beep
Exit Sub
End If
strX = Me.lstChoose.Column(ReturnCol - 5)
DSAErgebnis = strX
DoCmd.Close acForm, Me.Name, acSavePrompt
End Sub
Option Compare Database
Private Sub Befehl30_Click()
DoCmd.OpenForm "Startmenue", acNormal
DoCmd.Close acForm, "Adressen"
End Sub
Private Sub Befehl52_Click()
Dim X$, rs As Recordset
X$ = DatensatzAuswahl("Adresse wählen:", "AFAdressen", "5;5;5;", 5)
If X$ = "" Then Exit Sub
Set rs = Me.RecordsetClone
rs.FindFirst "[ID]= " + Chr$(34) & X$ & Chr$(34)
If Not rs.NoMatch Then 'Gefunden
Me.Bookmark = rs.Bookmark
End If
End Sub
Nun bekomme ich bei der Auswahl den Laufzeitfehler: laufzeitfehler 3464 datentypen in kriterienausdruck unverträglich
Der Debugger zeigt mir dann als Wert von X$ wieder einen Nachnamen.
LG
Talon
Hallo Talon
Ich denke es richtig zu lesen du suchst über ein Kombi Feld einen Datensatz. Wenn das so ist probier den Code mal:
Private Sub Kombinationsfeld_Dein_Kombi_AfterUpdate()
' Den mit dem Steuerelement übereinstimmenden Datensatz suchen.
Dim rs As Object
Set rs = Me.Recordset.Clone
rs.FindFirst "[ID] = " & Str(Nz(Me![Kombinationsfeld_Dein_Kombi], 0)) 'mit der Null gibst du die
pos an die gesucht wird
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
Set rs = Nothing
End Sub
Hoffe dir weiter geholfen zu haben.
Gruß Stefan
So nach meiner Grippe hab ichs nun entlich geschafft. So funktionierts:
Private Sub Befehl52_Click()
Dim X$, rs As Recordset
X$ = DatensatzAuswahl("Adresse wählen:", "AFAdressen", "1;5;5;3;", 1)
If X$ = "" Then Exit Sub
Set rs = Me.RecordsetClone
rs.FindFirst "[ADID]= " & X$
If Not rs.NoMatch Then 'Gefunden
Me.Bookmark = rs.Bookmark
End If
End Sub
Danke für die vielen Tips
cu
Talon