Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

verzweifelter Anfänger weiss nicht weiter

Begonnen von Talon, Juli 26, 2010, 11:21:46

⏪ vorheriges - nächstes ⏩

Talon

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.

sam92-1

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

Talon

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

Stapi

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
Grüße aus dem schönen NRW
Stefan

Talon

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

Stapi

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
Grüße aus dem schönen NRW
Stefan

Talon

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