Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Iso am Februar 15, 2011, 13:13:37

Titel: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 15, 2011, 13:13:37
Hallo zusammen,

es ist (für mich) ein wenig kompliziert... :(

Ich habe eine HF, das  eine eindeutige ID zu einem Sachverhalt enthält und darunter ein UF1, das zu jedem dieser Sachverhalte weitere Informationen enthält und darunter ein drittes UF3, das Zitate und Quellennachweise zu den Informationen enthält. Die Formulare sind jeweils übe die ID (Autowerte) verknüpft.

Letztlich geht es um Ereignisse und Schäden. Darunter sind auch Schadensorte, die aufgenommen werden.
Dazu möchte ich ein Listenfeld einsetzen, in dem die einzelnen Orte markiert werden können. Diese werden dann (m:n) in eine extra Tabelle weggeschieben, da ich später verschiedene Abfragen machen muss (deshalb kommen Memofelder nicht in Frage, zumal auch französische Namen vorkommen, was beim Auslesen Probleme bereitet).

Ich habe im Netz nun ein Beispiel gefunden, das sich "Persistente Listenfelder" nennt (ich weiss, nicht, ob man die Quelle hier nennen kann? Aber man kann danach googeln). Dort ist zu sehen, dass beim Wechsel des Datensatzes, die bereits vorgenommenen Markierungen wieder angezeigt werden können.

Das Ganze wird über DAO gesteuert:


Private Sub Form_Current()
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim i As Integer
    If IsNull(Me!FahrzeugID) Then
        For i = 0 To Me!lstAusstattungen.ListCount - 1
            Me!lstAusstattungen.Selected(i) = False
        Next i
        Exit Sub
    End If
    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT * FROM qryFahrzeugeAusstattungen WHERE FahrzeugID = " & Me!FahrzeugID, dbOpenDynaset)
    For i = 0 To Me!lstAusstattungen.ListCount - 1
        Do While Not rst.EOF
            If CLng(rst!AusstattungID) = CLng(Me!lstAusstattungen.ItemData(i)) Then
                Me!lstAusstattungen.Selected(i) = True
                Exit Do
            Else
                Me!lstAusstattungen.Selected(i) = False
            End If
            rst.MoveNext
        Loop
        rst.MoveFirst
    Next i
    rst.Close
    Set rst = Nothing
    Set db = Nothing
End Sub


Wie zu sehen ist, soll das Ereignis "Beim Anzeigen" des Formulars ausgelöst werden.
Ich habe das Listing meinen Feldnamen und Abfragen angepasst und ebenfalls unter "Beim Anzeigen" des 1. UF eingetragen.

Beim ersten Datensatz ist alles OK: die bereits vorhandenen Markierungen werden angezeigt. Der Code steigt jedoch jedesmal nach dem ersten Datensatz, den ich im HF wähle, entweder mit der Bemerkung "Kein aktueller Datensatz" oder bei der Zeile "rst.MoveFirst" aus. Irgendetwas scheint falsch zu sein, wenn man das in einem UF startet.

Deshalb hatte ich das Listing auch schon einmal für den Start im HF "Beim Anzeigen" umgefrickelt - mit dem gleichen Egebnis.

Kann es sein, dass die Abfrage des Recordsets beim Datensatzwechsel des HFs nicht wiederholt wird? Muss ich sie anders formulieren?

Für Hilfe wäre ich sehr dankbar!
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 15, 2011, 13:22:27
Hallo,


.
.
.

          End If
           rst.MoveNext  'wirf mal dieses Movenext raus
      Loop
       rst.MoveFirst
.
.
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 15, 2011, 14:09:23
Hallo,

wenn ich das mache, dann hängt sich ACCESS schon beim Start des HF komplett und ohne Fehlermeldung auf und ich muss es über den Taskmanager "abschiessen"!
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 15, 2011, 14:29:21
Hallo,

dann ist das fehlende Movenext nicht der Grund für den Absturz.

Deklariere i auch mal so:

Dim i As LONG



weiterhin:

-- Komprimiere/Repariere die DB
--setz einen Haltepunkt an den Codeanfang und prüfe im Einzelschitt (F8) die akt. Variablenwerte und den Recordset. Finde heraus, WANN der Absturz erfolgt, bzw. ob die Abfrage "qryFahrzeugeAusstattungen" tatsächlich (nur) auch die benötigten DS liefert.

falls die DB "zerschossen" ist:
--benutze den Access-Schalter /decompile 
und/oder
--erstell eine neue leere DB und importiere dort alles aus der alten.



Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 15, 2011, 16:15:21
Hallo DF6GL,

die Datenbank ist ok! :P

Ich habe festgestellt, dass die Prozedur im UF1 selbst einwandfrei läuft und beim Wechseln der dortigen Datensätze auch die entsprechenden Markierungen anzeigt (rsp. entfernt) werden.

Nur wenn ich den Hauptdatensatz wechsle, kommt die Meldung "Kein aktueller Datensatz" (Laufzeitfehle 3021).

Es scheint also, als beginne der Code bei einem Wechsel nicht mehr von vorne?!

Das mit der RecordSet-Püfung habe ich nicht so ganz verstanden: Wenn ich eine Überwachung auf "rst" beim Set-Befehl hinzufüge, bekomme ich zwar viele Infos, aber denen kann ich nicht wirklich den Inhalt des RecordSets entnehmen. Dazu könnte ich noch einen Tipp gebrauchen...

Es scheint also so zu sein, als gäbe es Bezeichnungsfehler, so dass bei einem Wechsel im HF, das UF1 nicht mehr angespochen wird.
Vielleicht sollte der Code auch an einer anderen Stelle ausgeführt werden...



Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 15, 2011, 18:18:24
Hallo,

vermutlich beinhaltet der Recordset im "Fehlerfall" keinen DS. Überprüf das mit:


.
.
Set db = CurrentDb
   Set rst = db.OpenRecordset("SELECT * FROM qryFahrzeugeAusstattungen WHERE FahrzeugID = " & Me!FahrzeugID, dbOpenSnapshot)
If rst.Recordcount > 1 Then
   For i = 0 To Me!lstAusstattungen.ListCount - 1
.
.
.
.
.
.
End IF
.
.
.
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 15, 2011, 19:33:22
Hallo,

das End if habe ich nach Next i reingestellt.

Nun geht zwar der Datensatzwechsel im HF, aber im UF1 wird nun nichts mehr automatisch markiert oder "entmarkiert". Schon beim Öffnen des HF nicht.
Tatsächlich bleiben die Markierungen, die man dort dann für einen Datansatz macht, anschließend auch beim Weiterblättern  im HF einfach bestehen.
Blättert man dagegen im UF1 weiter, dann verschwinden die Markierungen im nächsten Datensatz.

In die Tabelle geschrieben werden aber keine, sondern nur diejenigen, die man explizit anklickt.

Hilft das weiter?
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 15, 2011, 21:29:24
HAllo,

dann prüf doch mal, ob die Prozedur richtig bei jedem DS durchlaufen wird.  Das Verhalten deutet doch darauf hin, dass nicht für jeden DS des HF die Abfrage auch Datensätze liefert. Wenn keine DS geliefert werden und das Listenfeld dann demarkiert werden soll, solltest Du den Code wie folgt ändern:

.
.
   Dim i As Long
     For i = 0 To Me!lstAusstattungen.ListCount - 1
            Me!lstAusstattungen.Selected(i) = False
        Next i

    If IsNull(Me!FahrzeugID) Then Exit Sub
.
.

Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 16, 2011, 10:35:34
Hallo,

es bleibt sich auch nach diesem Vorschlag gleich: In UF1 selbst läuft alles. Erst beim Wechsel des Datensatzes im HF steigt die Prozedur wieder bei rst.MoveFirst aus. Das Ganze läuft also nicht in die von Dir vorgeschlagene EndSub-Anweisung.

Ich bin nun nicht so firm im Fehlersuchen bei RecordSets, so dass ich noch nicht einmal weiss, wo er den "aktuellen Datensatz" eigentlich vermisst, wenn im HF der Datensatz gewechselt wird. Fakt ist, dass ich in den ersten beiden Datensätzen Markierungen eingefügt habe, die auch in der Tabelle angezeigt werden und im UF1 selbst auch sauber laufen.

Nach dem Lauf in den Fehler zeigen einige Variablen (beim mit der Maus drübergehen) Werte an:

Definiere ich i als integer, dann hat
FahrzeugID "229", was jene des 1. Datensatzes des UF1 für den 2. Datensatz des HF ist; er scheint also hier das RecordSet neu aufzubauen.
dbOpenSnapshot zeigt als Wert 4
rst.EOF ist "Wahr"

Definiere ich i als long, dann
hat FahrzeugID den Wert "876", was dem 1 Datensatz des UF1 für das den 1. Datensatz des HF entspricht, was bedeutet, dass er kein neues RecordSet aufbaut?!
dbOpenSnapshot zeigt als Wert 4
rst.EOF ist "Wahr"


Nehme ich dbOpenDynaset dann ist es etwas anders:
hier ändert sich der Wert von FahrzeugID nicht (876), egal ob i als long oder integer definiert ist.
Und dbOpenDynaset hat in allen Fällen den Wert 2

Bei beiden Methoden wird i immer mit 0 angezeigt, was wahrscheinlich die Ursache dafür ist, dass er kein rst.Move.First machen kann?

Soviel konnte ich noch herausfinden.

Wenn das nun alles nicht zwischen HF und UF funktioniert, gäbe es denn dann vielleicht auch eine andere Möglichkeit, das Problem zu lösen?
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 16, 2011, 14:41:30
Hallo,

versuch mal, die DB hier gezippt hochzuladen...
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 16, 2011, 15:04:37
Hallo DF6GL,

ich kann die Datenbank nicht einfach so in ein Forum stellen, da sie Teil eines laufenden Uniprojektes ist.

Wenn, dann kann ich sie höchstens Dir persönlich zur Verfügung stellen.

Könnten wir das organisieren?
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 16, 2011, 15:23:43
Hallo,

ok, schick mir die DB mal her, Adresse findest Du in meinem Profil..
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 16, 2011, 15:32:09
Hallo,

leider sehe ich dort Deine Mailadresse nicht. Vielleicht kannst Du sie mir ja als Mitteilung schicken?!
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: DF6GL am Februar 16, 2011, 18:23:16
Hallo,

Mail mit DB zurück. 


Habe nur neben den vorher  aufgeführten Änderungen die DO-Schleife so geschrieben:

Do While Not rst.EOF


und an einer Execute-Methode den ID-Feldnamen korrigiert.



Die zugrundliegende Abfrage liefert nur 3 Datensätze mit zwei unterschiedlichen ID-Werten , die für die Markierung des Listenfeldes auch herangezogen werden.
Titel: Re: Litenfeld UF: Markierungen beibehalten
Beitrag von: Iso am Februar 18, 2011, 10:26:25
Hallo Franz, DF6GL

ich habe das Problem nun ganz anders gelöst, weil das "Knacken im Gebälk", wie Du in Deiner Mail formuliert hattest, so schnell nicht aufzulösen ist...

Ich habe jetzt zwei Listfelder gebildet, eines für die Orte, die in Frage kommen und eines für die ausgewählten Orte. Mittels Buttons, kann ich die Orte auswählen und zwischen den Listenfeldern hin und her verteilen, wobei die ausgewählten dann in eine  m:n Tabelle weggeschrieben werden, die ich für weitere Abfragen nutzen kann. Das ganze ist etwas statischer als der usprünglich erdachte Weg, dafür aber auch nicht mit so vielen (für mich) unwegbaren Problemen zwischen HF und UF behaftet! Da ich dieses Prozedere sowieso nur einmal pro Datensatz machen muss, ist es OK.

Also: nochmals vielen Dank für die Hilfe!