PDA

Vollständige Version anzeigen : Prozedur ausführen, wenn sich Datensatz im Formular ändert.


Prian0815
25.01.2008, 11:25
Hallo Forum, Ich habe gerade folgendes Problem. In meinem Projekt gibt es in jedem Formular verschiedene Datensatzvavigations-Schaltflächen. Das Ausführen derselbigen kann unter Umständen einen Fehler auslösen, wenn Beispielsweise im Formular der letzte DS des Recordsource angezeigt ist und der User auf nächstenDS klickt löst dies logischerweise einen Fehler aus, da zu einem nächsten DS nicht gesprungen werden kann. Um solche Fehler zu verhindern, wird nach jedem Click auf einen Navigationsbutton eine Routine ausgeführt, welche die Buttons die beim Klicken zu einem Fehler führen würden blind schaltet(.enabled = false). Dies funktioniert auch einwandfrei. Wenn sich aber nach ausführung der Suchfunktion

Private Sub cmdSeek_Click()
On Error GoTo Err_cmdSeek_Click
Screen.PreviousControl.SetFocus
DoCmd.DoMenuItem acFormBar, acEditMenu, 10, , acMenuVer70
Err_cmdSeek_Click:
If Err.Number <> 0 Then
MsgBox Err.Number & " " & Err.Description & "frmKontaktpersonen - Private Sub cmdSeek_Click"
Resume Exit_cmdSeek_Click
End If

Exit_cmdSeek_Click:
Exit Sub
End Sub

im Formular der Datensatz ändert, sind die Navigationsbuttons aber nicht aktualisiert. Ich habe nun schon bei allen möglichen(AfterUpdate, Change, Dirty)-Ereignissen auf Formular- und auch auf Textebene besagte Routine ausführen lassen, dort greift diese aber nicht, dadiese Ereignisse anscheinend nicht ausgelöst werden wenn dies durch VBA passiert.
Ich hoffe mir kann jemand von euch ein Ereigniss nennen, welches ausgelöst wird, wenn ein durch ausführen obiger Routine gesuchter Datensatz gefunden und im Formular angezeigt wird. In obigem Code kann die Aktualisierungsroutine nicht aufgerufen werdemn, da diese den Focus auf ein in jedem Formular verfügbares Steuerelement setzt, und dies wiederum zu einem Fehler beim >>Suchen führen würde.

hcscherzer
25.01.2008, 11:37
Grundsätzlich tritt nach jedem Wechsel des Datensatzes (auch beim ersten Öffnen des Formulars) das Ereignis 'Beim Anzeigen' (Form_Current) ein.

Prian0815
25.01.2008, 13:04
Hi hc, grundsätzlich ist dein Ansatz so richtig. Dass dieses Ereigniss immer beim Wechsel eines Datensatzes ausgelöst wird war mir bislang nicht bewusst. ich dachte dies Ereigniss wird nur bei Refresh, Requery oder Load ausgelöst.
Hab jetzt in diesem Ereigniss die Prozedur ausführen lassen. Beim ersten Suchen funztdas auch wunderbar. Bei einem erneuten Suchen tritt dann aber wieder der Fehler auf, dass das 'cmdExit' nicht dursucht werden kann. Dieses erhält zu Beginn der SchaltflächenAktualisieren-Prozedur den Fokus, damit die Enabled-Eigenschaft der Navigationsschaltflächen auf False gesetzt werden kann. Dies ist nämlich nur dann möglich, wenn das Steuerelement nicht den Fokus hat. Somit drehe ich mich mit meinem Coding im Moment etwas im Kreis. Zum einen muß ich den Fokus auf ein sicht- und auswählbares Steuerelement setzen, welches in jedem Formular vorhanden ist. Zum anderen sollte dies aber nach Möglichkeit das Steuerelement sein welches durchsucht werden soll. Im Coding der Suchfunktion wird das ja durch

Screen.PreviousControl.SetFocus

geregelt.
Da ja aber jetzt wenn ein gesuchter Satz gefunden wurde der Focus auf cmdExit liegt, tritt bei einem erneuten Such-Versuch ein Fehler auf. 'Tja, da bin ich gerade ziemlich ratlos, wie ich aus der Zwickmühle wieder rauskomm. Vielleicht fällt ja mir oder jemand anderem noch was dazu ein.
Dir auf jeden Fall meinen herzlichsten Dank für deinen wertvollen Hinweis.

Prian0815
25.01.2008, 13:32
Hab eine Lösung gefunden bzw. programmiert.
Wenn die Suchfunktion aufgerufen wird, merke ich mir das zu durchsuchende Steuerelement mit:

strseek = Screen.PreviousControl.Name
Screen.PreviousControl.SetFocus

in der Prozedut SchaltflächenAktualisieren setze ich dann am Ende den Focus wieder auf dieses Steuerelement

'Nur sicht- und auswählbare Schaltflächen können den Focus erhalten
If Len(strseek) <> 0 Then
If Left(strseek, 3) = "txt" Or Left(strseek, 3) = "cbo" Then
frm.Controls(strseek).SetFocus
Else
frm.Controls("cmdExit").SetFocus
End If
End If

És ist mir natürlich klar, dass auch diese Lösung nicht die optimale ist und möglicherweise auch noch zu einem Fehler führen kann, aber fürs erste reicht das mal.

ebs17
25.01.2008, 14:49
Vielleicht vergleichst Du Deine Lösung mit dieser hier:
SmartTools Navigationsschaltflächen für Formulare (http://www.add-in-world.com/katalog/nav-buttons/) (gratis)

Prian0815
25.01.2008, 14:57
Hallo Eberhard,
herzlichen Dank für das nette Angebot, nur habe ich inzwischen mehr oder weniger all diese Funktionen(Funktionalität) selber schon proogrammiert und baue das immer wieder so in versch. Projekten ein.