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!
Hallo,
.
.
.
End If
rst.MoveNext 'wirf mal dieses Movenext raus
Loop
rst.MoveFirst
.
.
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"!
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.
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...
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
.
.
.
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?
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
.
.
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?
Hallo,
versuch mal, die DB hier gezippt hochzuladen...
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?
Hallo,
ok, schick mir die DB mal her, Adresse findest Du in meinem Profil..
Hallo,
leider sehe ich dort Deine Mailadresse nicht. Vielleicht kannst Du sie mir ja als Mitteilung schicken?!
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.
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!