none
Problem: Anwählen eines Datensatzes nach Listbox funktioniert nicht immer

    Frage

  • Ich benutze eine etwas exotische Variante ein Formular mit ausgewählten Datensätzen zu öffnen:

    Dem Formular wird per Pointer ein AdodB.Recordset  in OpenArgs übergeben. 

    Das Recordset wird so befüllt:

    With rs    .ActiveConnection = conn    .CursorType = adOpenDynamic        .CursorLocation = adUseServer   End With      'Jetzt die Abfrage ausführen   Set rs = cmd.Execute

    Das Formular wird als Dialog geöffnet mit diesem Code:

    'Mehr als 1 Patient gefunden --->> Formular öffnen  mit den gefundenen Patienten
        DoCmd.OpenForm "Eingabe von Patientendaten", acNormal, , , acFormEdit, acDialog, CVar(GetPointerToObject(rs))

    Das funktioniert prima so.

    Im Open-Ereignis des geöffneten Formulars wird das Recordset des Formulars anhand der OpenArgs gesetzt.

    Obendrein wird das Recordset einer Listbox ebenfalls mit den OperArgs besetzt.

    Die Listbox zeigt also dieselben Datensätze wie das Formluar selber.

    Jetzt geht es darum, nach einem Klick auf einen Eintrag der Listbox den entsprechenden Datensatz zum atuellen DS des Formulars zu machen.

    Das funktioniert leider nicht so ganz:

    MIt diesem Code Me.Recordset.Find ("[ID_proband]=" & Me.lstProbandListe.Column(1))

    wird manchmal 2x, manchmal 4mal der richtige DS angwählt, dann hört es aber auf.

    Wie kommt das ? Ich habe zwar vage Angaben gefunden, daß das manchmal nicht fnktioniert, aber nicht wrum und auch nicht wie ich das vermeiden kann

    Mittwoch, 9. Juli 2014 17:13

Alle Antworten

  • Vielleicht liegt es daran, dass Find ab dem aktuellen Datensatz forwärts sucht, wenn nichts anderes angegeben ist.

    Ich benutze gerne die .Filter Eigenschaft des Formulars, um einen Datensatz zu "suchen".

    Ansonsten köntest du auch die .Seek Methode verwenden, die ist evtl. auch schneller, da ein Index vorliegen muss. Und ich gehe mal davon aus, dass die Spalte ID_proband bei dir indiziert ist. :-)

    Gruß
    Dirk

    Freitag, 11. Juli 2014 04:49
  • Gute Idee, leider funktioniert es nicht so wie ich mir das vorstelle!

    ;e.Filter .... setzt den aktuellen Datensatz keineswegs auf den gewünschten!. Beimzeiten Klick auf einen Eintrag in der Listbox kommt dann "Daten-Provider kann nicht initialisiert werden".

    Möglicherweise hängt der gane Mist damit zusammen, da´ß meine Daten über eine stored procedure vom SQL-Server kommen.

    In diesem Zusammenhang liest man oft davon, die Methode .Findfirst zu nbenutzen. Dies verursacht bei mir einen Laufzeitfehler.

    Aber so funktioniert es jetzt ganz gut:

    If rs Is Nothing Then
            Beep
        Else
            Me.Recordset.Find "[ID_proband]=" & Me.lstProbandListe.Column(1), , , adBookmarkFirst
            
            Debug.Print "pat gewählt: " & Me.lstProbandListe.Column(1)
        End If
    

    Freitag, 11. Juli 2014 16:45
  • Hallo Nico,

    FindFirst ist eine Methode die nur in DAO existiert - Du verwendest aber ADODB, da ist das (ungefähre) Äquivalent Find.

    So weit ich durch Deinen abgekürzten Code durchsteige:

    Ein Teil des "Mists" könnte schon daran liegen, wie Du das Recordset erstellst. Etwas wie adOpenDynamic + adUseServer sollte man i. a. ganz vermeiden, da aufwändig und auch fehleranfällig, adOpenKeySet oder adOpenStatic wäre vermutlich sinnvoller und ausreichend.

    Wenn Du das Formular zum Auswählen / Suchen verwendest, so könnte ein adOpenStatic in Verbindung mit adUseClient die Sache beschleunigen - vorausgesetzt Deine Prozedur liefert nicht unzählige Datenzeilen. So liegen alle Daten vor und beim Finden (Filtern) gibt es weniger Probleme.

    Gruß Elmar

    Freitag, 11. Juli 2014 18:34