Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

FindFirst und Requery

Begonnen von caro_line, September 11, 2019, 10:38:32

⏪ vorheriges - nächstes ⏩

caro_line

Hallo!
Folgendes Problem fuchst mich und ich komm einfach nicht auf die Lösung:

Ich habe ein Formular (ufFormTageseingabe), das beim Öffnen den Datensatz anzeigen soll, der zum heutigen Datum passt. Das ist mir mit folgendem Code auch gelungen:
Private Sub Form_Load()
Me.Recordset.FindFirst "MitarbeiterTageszeit.Datum = Date()"
End Sub


Das besagte Formular wurde als Unterformular in einer Registerkarte meines Hauptformulares eingebunden. Nun hätte ich gerne, dass wenn man das Formular ufFormTageseingabe über Klick auf die Registerkarte öffnet, wieder der Datensatz, der zum heutigen Datum passt, angezeigt wird. Also genau so, wie es beim direkten Öffnen des Formulars bereits funktioniert. Nach meinem Verständnis müsste es eigentlich genügen, den Code im Unterformular zu hinterlegen und im Code des Hauptformulars müsste nichts mehr ergänzt werden.

Nun funktioniert das so aber nicht und ich habe auch eine starke Vermutung warum nicht:
Im Hauptformular gibt es zwei Felder (ddlJahr, ddlMonat), über die man die Datensätze des Unterformulars ufFormTageseingabe filtern kann. Beim Öffnen des Hauptformulars werden diese Felder immer auf das aktuelle Jahr und Monat eingestellt. Das soll so bleiben und zusätzlich soll der Datensatz mit dem aktuellen Tag aufgehen (aber nicht gefiltert, man soll blättern können). In weiterer Folge kann man ddlJahr und ddlMonat umstellen und sich andere Zeiträume anschauen.
Daher ist folgender Code im Hauptformular eingepflegt, der auch funktioniert:
Public Sub Form_Load()
    On Error GoTo myError
   
    Me.ddlJahr.Value = Year(Now)
    Me.ddlMonat.Value = Format(Month(Now), "00")
    Me.lblJahrMonat.Caption = Me.ddlJahr.Value & Me.ddlMonat.Value
    Me!ufFormTageseingabe.Requery
   
    Exit Sub
myError:
    Call AMEZ.Allgemein.WriteError(Me.Form.Name, "Form_Load()", Err.Description)
    Err.Clear
End Sub


Meine Vermutung ist nun, dass FindFirst nicht funktioniert, da hier ein Requery von ufFormTageseingabe eingebaut ist. Diesen brauche ich aber, damit sich das Unterformular die gesetzten Werte von ddlJahr und ddlMonat auch abholt und sich dementsprechend öffnet.

Leider gelingt es mir nicht die richtigen Codeschnipsel an der richtigen Stelle einzubauen. Habe schon eine ganze Weile online recherchiert und komm auf keine funktionierende Lösung.

Bitte nicht Schimpfen, sollte ich wichtige Informationen nicht angeführt haben oder die Frage an sich "blöd" sein.
Es wäre mir eine große Hilfe, wenn mir hier wer beim Nachdenken unter die Arme greifen könnte  :)
DANKESCHÖN!

LG Caroline

PhilS

Warum im Form_Load ein Requery erforderlich ist, ist für mich nciht so ganz nachvollziehbar. Erreichtst du nicht ohne Requery dasselbe Ergebnis, wenn du das aktuelle Datum (Monat/Jahr) als Standardwerte der Steuerelemente definierst?

Ansonsten sollte es doch das Problem lösen, wenn du direkt nach dem Requery wieder ein FindFirst ausführst.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

Hallo,

ZitatIm Hauptformular gibt es zwei Felder (ddlJahr, ddlMonat), über die man die Datensätze des Unterformulars ufFormTageseingabe filtern kann. Beim Öffnen des Hauptformulars werden diese Felder immer auf das aktuelle Jahr und Monat eingestellt. Das soll so bleiben und zusätzlich soll der Datensatz mit dem aktuellen Tag aufgehen (aber nicht gefiltert, man soll blättern können). In weiterer Folge kann man ddlJahr und ddlMonat umstellen und sich andere Zeiträume anschauen.


Es sind nur solche DS mit Findfirst zu finden, die sich auch im gefilterten (über die Felder ddlJahr, ddlMonat) Unterform befinden.

Wenn durch DS außerhalb dieser Filterung ( wie wird die bewerkstelligt?  Mit Nutzung der UFO-Steuerelement-Eigenschaften "Verknüpfen von/nach" oder per Code mit .Filter ="xxxx" und .FilterOn =True) , dann ist es erforderlich, die Filterung durch eine passende (bzw. erweiterte, zb. nur nach Jahr) zu ersetzen, im Fall der Verknüpfung ist diese Verknüpfung zu ändern, bzw. aufzuheben.

Das Ganze geschieht dann im Registerelement-Ereignis "Bei Änderung".

ebs17

Sowie:
Me!ufFormTageseingabe.Requery
Das bewirkt ein Neuabrufen der Datenherkunft (was Dir an der Stelle nichts nützt), aber nie eine VBA-Codeausführung.

Du müsstest also Deine Einstellungen von Monat/Jahr geeignet an das Unterformular durchreichen und daraus das Kriterium für das FindFirst bilden. Bei jeder Verwendung von FindFirst sollte dann auch der Fall eines Nichttreffers (NoMatch) vorhergesehen werden.
Mit freundlichem Glück Auf!

Eberhard

caro_line

Hallo!
Danke für eure raschen Antworten.
ddlJahr und ddlMonat sind als Kriterien in der dem Formular zugrundeliegenden Abfrage hinterlegt, damit nur die entsprechenden Datensätze angezeigt werden.
Ohne den Requery funktioniert es nicht, da beim Öffnen des Hauptformulars offensichtlich das Unterformular geladen wird bevor im Code die Werte von ddlJahr und ddlMonat übergeben werden - somit findet er keine Werte und kann das Unterformular nicht darstellen. Durch den Requery nach der Festlegung von ddlJahr und ddlMonat funktioniert dann auch das Unterformular.

@DF6GL: Da bei FindFirst nach dem aktuellen Tag gesucht wird und ddlJahr und ddlMonat das aktuelle Jahr und Monat beschreiben, müsste der Datensatz über Findfirst gefunden werden.

@PhilS: Wenn ich nach dem Requery Findfirst ausführen möchte, muss ich das in den Code des Hauptformulars einbauen, oder? Das habe ich schon probiert und hab offensichtlich den Code falsch oder an die falsche Stelle geschrieben. Kannst du mir hier weiterhelfen, wo ich was einfügen müsste, damit es klappt?



DF6GL

Hallo,
zitiere mich:

ZitatDas Ganze geschieht dann im Registerelement-Ereignis "Bei Änderung".

PhilS

Zitat von: caro_line am September 12, 2019, 09:30:26
Ohne den Requery funktioniert es nicht, da beim Öffnen des Hauptformulars offensichtlich das Unterformular geladen wird bevor im Code die Werte von ddlJahr und ddlMonat übergeben werden - somit findet er keine Werte und kann das Unterformular nicht darstellen. Durch den Requery nach der Festlegung von ddlJahr und ddlMonat funktioniert dann auch das Unterformular.
Das ist soweit nachvollziehbar. Wenn du aber aktuelles Jahr/Monat bereits als Standardwerte für die Formularfelder definierst, sollte es direkt funktionieren, ohne die Werte im Code zuzuweisen und dann das Requery zu machen. (-> Ausprobieren)

Zitat von: caro_line am September 12, 2019, 09:30:26
@PhilS: Wenn ich nach dem Requery Findfirst ausführen möchte, muss ich das in den Code des Hauptformulars einbauen, oder? Das habe ich schon probiert und hab offensichtlich den Code falsch oder an die falsche Stelle geschrieben. Kannst du mir hier weiterhelfen, wo ich was einfügen müsste, damit es klappt?
Im Hauptformular musst du dich dann auf das Unterformularsteuerelement und das darin befindliche Form beziehen. Etwa so:
Me!ufFormTageseingabe.Form.Recordset.FindFirst "MitarbeiterTageszeit.Datum = Date()"
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

Hallo,
@Philipp
Zitatbereits als Standardwerte für die Formularfelder definierst
Standardwerte greifen nur bei neuen DS.

@Caro
Zitatdas Unterformular geladen wird bevor im Code die Werte von ddlJahr und ddlMonat übergeben werden
Das ist richtig, UFos werden vor dem HFo geladen, was bei Neulingen oft
zu Verwirrung führt (selbst damals dran verzweifelt).
Um das beschriebene Problem zu umgehen aktualisiere das UFo beim Ereignis
"Form_Current" (Beim Anzeigen) des HFos. Das ist IMO das letzte Ereignis, das
beim Öffnen eines Forms gefeuert wird.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

PhilS

Zitat von: Beaker s.a. am September 12, 2019, 17:28:51
@Philipp
Zitatbereits als Standardwerte für die Formularfelder definierst
Standardwerte greifen nur bei neuen DS.
Und bei ungebundenen Steuerelementen. - Von solchen ging ich aus, da es ja offenbar Steuerelemente sind, um die Filterkriterien einzutragen.

Ich habe meinen Ansatz kurz ausprobiert. Die Standardwerte werden korrekt für das Filtern von Abfragen für Unterformulare verwendet. - Funktioniert also.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

caro_line

Hallo!
Vielen Dank für euren Input - ihr habt mir alle weitergeholfen und ich habe wieder einiges gelernt!  :D
Als Lösungsweg habe ich nun den von @PhilS gewählt, weil er so bestechend einfach und sogar für mich logisch war. Ich habe bei den Feldern ddlJahr und ddlMonat die Wertübergabe über den Code gelöscht und wie vorgeschlagen Standardwerte eingesetzt -> warum einfach, wenn es kompliziert geht?  ;)
Nun funktioniert alles wie gewünscht und ich habe mir die gesamte Requery Thematik erspart.
Noch einmal großes DANKESCHÖN!

Beaker s.a.

Hallo Philipp,
ZitatUnd bei ungebundenen Steuerelementen.
Sorry, daran hab' ich nicht gedacht.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)