janni
Goto Top

Datensatzwechsel im Ufo auf Hfo anwenden

Moin,

komme nicht so recht weiter, folgendes Problem: Ich habe ein Formular mit einem Unterformular (Ufo) in Datenblattansicht. Bei einem Datensatzwechsel im Ufo (der Benutzer klickt in einen anderen Satz) soll dieser neu ausgewählte Datensatz auch im Hfo angezeigt werden. Leider funktionieren die ganzen Ereignisse irgendwie im Ufo nicht (Form_Current, Click, etc.) und der Satz im Hfo wird nicht gewechselt. Dabei ist es egal, ob das Ufo verknüpft oder nicht verknüpft ist
Habe auch schon versucht über ein Textfeld im Hfo die Datensatznummer anzeigen zu lassen. Dies geht auch wunderbar, aber die normalen Ereignisse greifen nicht, da der Inhalt selbst ja nicht geändert wird (=me!Ufo!Steuerelement).

Kennt Jemand ein Ereignis was bei dem Textfeld greifen würde, bzw. eine andere Lösung um den Datensatz im Hfo zu wechseln ?

Das ganze ist noch in einer mdb-DB realisiert (Access 2003).

Danke schon einmal
Janni

Content-ID: 156498

Url: https://administrator.de/contentid/156498

Ausgedruckt am: 21.11.2024 um 16:11 Uhr

jhinrichs
jhinrichs 07.12.2010 um 14:24:04 Uhr
Goto Top
Hallo,

eine Lösung (ich weiß nicht, ob es die eleganteste ist), ist folgende:

Im Unterformular definierst Du folgende Prozedur, wobei "Key" der Primärschlüssel oder zumindest ein eindeutiger Schlüssel ist:
Private Sub Form_Click()
    Rem Prozedur OpRecord des Hauptformulars mit dem Schlüssel des angeklickten Datensatzes als Argument aufrufen
    Form_frmHfo.OpRecord(Me.Key) 
End Sub

Damit schaltet das Hauptformular um, wenn Du auf den "Datensatzbezeichner" klickst. Wenn das Hauptformular auch bei jedem Klick in ein Datenfeld umschalten soll, musst Du die Zeile
Form_frmHfo.OpRecord(Me.Key) 
in die "Beim Klicken"-Ereignisprozedur jedes Datenfeldes schreiben.

Im Code des Hauptformulars (frmHfo) wir dann die Prozedur OpRecord definiert:

Public Sub OpRecord(Key As Long)

    Dim rst As DAO.Recordset
    Dim stcond As String
    
    Set rst = Me.Recordset
    Rem Bedingung formulieren
    stcond = "Key=" & Key     
    Rem Ersten passenden Datensatz suchen, da Schlüssel eindeutig, braucht man keine weiteren zu suchen
    rst.FindFirst (stcond)
       
End Sub

Das ist jetzt alles natürlich nur ein Grundgerüst ohne Fehlerbehandlung etc. Wenn man das Ganze in der Entwurfsansicht von Access erstellt, muss man ziemlich aufpassen, beim Schreiben der Ereignisprozeduren auch das richtige Objekt ausgewählt zu haben. Es empfiehlt sich auf jeden Fall im VBA-Editor eine Kontrolle, dass die Form_Click() und FeldXY_Click()-Prozeduren auch dem Unterformular und die OpRecord-Prozedur dem Hauptformular zugeordnet sind bzw. ist.

Grüße
Janni
Janni 07.12.2010 um 17:09:14 Uhr
Goto Top
Vielen Dank, funktioniert super.

Allerdings mit einer kleinen Einschränkung, das Ereignis Click funktioniert in einem Kombinationsfeld nicht. Hast Du eine Idee warum ?
Wenn ich das ganze über ein weiteres Textfeld mit Verweis auf die richtige Spalte des Kombinationsfeldes realisiere, dann aktualisiert er zwar das Hfo, aber er aktualisiert alle Felder dieses Textfeldes. Das sieht nicht wirklich schön aus.
jhinrichs
jhinrichs 08.12.2010 um 10:47:54 Uhr
Goto Top
Hallo,

beim Kombinationsfeld wird das Ereignis "Click" offenbar erst ausgelöst, wenn ein Wert aus der Liste angeklickt wird. Daher braucht man zusätzlich den Aufruf der OpRecord-Prozedur beim Fokuserhalt oder Hingehen, also Ereignis "GotFocus" oder "Enter". Bei "Click" muss der Aufruf aber bleiben, da sonst das Hfo nach der Auswahl aus der Liste nicht sofort, sondern erst bei der nächsten Auswahl aktualisiert wird. Auch im Tectfeld kann man statt Click natürlich Enter oder GotFocus wählen, was sogar geschickter ist, da dann das Hfo auch aktualisiert wird, wenn man das Textfeld nicht mit der Maus, sondern per Tab-Taste auswählt.
Der Gesamtcode im sieht dann so aus:
Private Sub Form_Click()
    Form_frmHfo.OpRecord (Me.Key)
End Sub

Private Sub Kombinationsfeld_Click()
    Form_frmHfo.OpRecord (Me.Key)
End Sub

Private Sub Kombinationsfeld_Enter()
    Form_frmHfo.OpRecord (Me.Key)
End Sub

Private Sub Textfeld_Enter()
    Form_frmHfo.OpRecord (Me.Key)
End Sub

Das Neu-Hinzufügen von Datensätzen über das Ufo muss auch noch extra abgefangen werden.
Grüße
Janni
Janni 08.12.2010 um 12:50:50 Uhr
Goto Top
Moin,

bei Enter oder GotFocus bekomme ich den Fehler 32502: Der Wert, den Sie für das Feld \"|\" eingegeben haben, ist ungültig.
Dabei ist es egal, ob ich das Enter auf das Kombifeld oder ein Textfeld definiere.
Dieses Feld existiert aber gar nicht und mit der Nummer kann sogar Google nicht so recht etwas in Verbindung mit Access anfangen.
jhinrichs
jhinrichs 09.12.2010 um 10:09:09 Uhr
Goto Top
Moin,
komisch, meine Antwort von gestern ist irgendwie "wech"...
Also nochmal:
Wann genau kommt die Fehlermeldung? Was ist markiert, wenn Du dann auf "Debuggen" klickst? Was für Code entsteht denn, wenn Du im Eigenschaftenfenster des Steuerelements beim Ereignis "Hingehen" dann "Code" auswählst?
Vielleicht postest Du hier einmal Deinen Code, bei mir funktioniert das nämlich (getestet unter Access 2010, 2007 und 2002).
Grüße