Hallo,
ich habe ein Begrüßungsformular "Eingabeformular". Auf diesem habe ich einen Session-Zähler" gesetzt der nach einer Stunde Access beendet. So sieht mein Code dafür aus:
Eigenschaftenblatt Eingabeformular:
Bei Zeitgeber:
Private Sub Form_Timer() 'setzt einen Laufzaehler iCnt der statisch ist (wird nicht gelöscht)
'dieser Zaehler wird an das Textfeld ZaehlerModulneu übergeben
Static iCnt As Integer
Me.ZaehlerModulneu = iCnt
If iCnt = 60 Then
DoCmd.Quit
End If
iCnt = iCnt + 1
End Sub
Zeitgeberintervall: 60000 (entspricht 60 sec = 1Minute)
Ein ungebundenes Textfeld ZaehlerModulneu zeigt den Zähler an.
Dies klappt soweit einwandfrei.
Vom Eingabeformular kann man zwei verschiedene Formulare aufrufen.
Ich möchte diesen Zähler nun auch in den anderen beiden Formularen einblenden. Dazu habe ich wiederum in jedem ein ungebundenes Textfeld erstellt mit der Datenquelle:
Steuerelementinhalt =[Formulare]![Eingabeformular]![ZaehlerModulneu]
Damit hier der Zähler aktualisiert wird habe ich im Eigenschaftenblatt des jeweiligen Formulars Bei Zeitgeber folgendes gemacht:
Private Sub Form_Timer() ' Aktualisieren Session Zaehler ZaehlerModulneu
Me.Requery
End Sub
Zeitgeberintervall: 60000
Würde auch so wunderbar klappen. Leider springt durch das Me.Requery der Datensatzteiger auf irgendeinen anderen Datensatz. Das ist natürlich schon nervig wenn man gerade beim Eingeben eines Datensatzes ist. Gibt es da eine andere Möglichkeit??
Grüße
Herbert
Hallo,
warum machst Du Me.Requery?
Das ist die falsche Methode, damit erneuerst Du die Datenherkunft des Forms, soll heißen, es werden alle DS neu eingelesen. Es hat keine Auswirkung auf ungebundene Textfelder.
Es wäre es besser, Du setzt die Aktualisierung für die anderen Formulare in die Timer-Eventprozedur des Begrüßungsformulares.
Hallo Franz,
vielen Dank erst mal! Also habe ich das richtig interpretiert: Den Me.Requery in das Begrüßungsformular in der Prozedur Form_Timer setzen?
Gruß
Herbert
Hallo,
das funktioniert leider nicht. Im Begrüßungsformular hätte ich den Requery nicht gebraucht - das funktioniert eigentlich einwandfrei d.h. wird durch den Zeitgeber aktualisiert (auch ohne Requery).
Gruß Herbert
Hallo,
habe mich etwas unklar ausgedrückt...
Das Requery brauchst Du nicht, bzw. ist falsch.
setze die Zuweisung des Zählerwertes an ein Textfeld in die Timer-E-Prozedur des Begrüßungsforms.
Form!Formular1!txtZählerfeld = ICnt
Form!Formular2!txtZählerfeld = ICnt
Wenn ein Laufzeitfehler entsteht, wenn die Zielformulare nicht geladen sind, ignoriere die Fehlersituation mit On Error Goto Next.
Evtl. ist auch "DoEvents" erforderlich.
.
.
Static iCnt As Integer
Me.ZaehlerModulneu = iCnt
On Error Goto Next
Form!Formular1!txtZählerfeld = ICnt
Form!Formular2!txtZählerfeld = ICnt
DoEvents
If iCnt = 60 Then
.
.
.
Hallo Franz,
leider klappt das auch nicht. Der Zähler im zweiten Formular wird nicht aktualisiert. So sieht die Zeitgeberprozedur im Eingabeformular jetzt aus:
Private Sub Form_Timer() 'setzt einen Laufzaehler iCnt der statisch ist (wird nicht gelöscht)
'dieser Zaehler wird an das Textfeld ZaehlerModulneu übergeben
Static iCnt As Integer
Me.ZaehlerModulneu = iCnt
If iCnt = 60 Then
DoCmd.Quit
End If
iCnt = iCnt + 1
On Error Resume Next
Application.Forms!frmDebitoren!Zaehler2 = iCnt
End Sub
Der Zähler "Zaehler2" im Formular frmDebitoren wird nicht aktualisiert.
Gruß
Herbert
Hallo Franz,
es klappt inzwischen. Ich hatte im zweiten Formular beim Zaehler2 vergessen als Datensatzquelle: Steuerelementinhalt =[Formulare]![Eingabeformular]![ZaehlerModulneu] zu entfernen.
Vielen Dank für deine Hilfe! Vielen Dank an alle dieses Forums die hier bei Problemen helfen!
Grüße
Herbert
Hallo,
ich habe mal eine neue Variante ausprobiert die hier auch funktioniert und nur ein Requery für das Textfeld "Zaehler2" durchführt. Ich habe das zweite Formular so gelassen wie es war:
Das ungebundene Textfeld:
Steuerelementinhalt =[Formulare]![Eingabeformular]![ZaehlerModulneu]
Damit hier der Zähler aktualisiert wird habe ich im Eigenschaftenblatt des zweiten Formulars "Bei Zeitgeber":
Private Sub Form_Timer() ' Aktualisieren Session Zaehler ZaehlerModulneu
Me!Zaehler2.Requery
End Sub
Zeitgeberintervall: 60000
In diesem Fall wird nur das Textfeld aktualisiert und nicht das ganze Formular und man kann Daten eingeben ohne dass der Datenzeiger irgendwo hin springt.
Grüße
Herbert
Diese zweite Variante hat den Vorteil, dass die Anzeige des Zählers "Zaehler2" im zweiten Formular immer vorhanden ist. Hier hatte ich bei der vorherigen Lösung das Problem, das zunächst nichts angezeigt wurde und nach 1 Minute (Zeitgeber) erst eine Anzeige erfolgte.
Hallo Herbert,
Steuerelementinhalt =[Formulare]![Eingabeformular]![ZaehlerModulneu]
Schlechter Stil; - Daten zwischen Formularen tauscht man besser über eine
Schnittstelle aus.
In einem allgem.Modul
Private m_Zaehler As Integer
Public Property Let CountToSixtyAndQuit(iOffset As Integer)
If m_Zaehler >= 60 Then
DoCmd.Quit
Else
m_Zaehler = m_Zaehler + iOffset
End If
End Property
Public Property Get CountToSixtyAndQuit() As Integer
Get CountToSixtyAndQuit = m_Zaehler
End Property
Im Timer-Event des Forms "Eingabeformular"
Private Sub Form_Timer() ' Aktualisieren Session Zaehler
CountToSixtyAndQuit 1
Me!txtZaehler = CountToSixtyAndQuit
End Sub
Im Timer-Events der anderen Forms
Private Sub Form_Timer()
Me!txtZaehler = CountToSixtyAndQuit
End Sub
(alles Luftcode)
gruss ekkehard
Hallo Ekkehard,
habe das mal versucht nachzustellen und kriege eine Fehlermeldung. Hier mein Code:
a) Modul
Option Compare Database
Private m_Zaehler As Integer
Public Property Get ZaehlerBisSechzig() As Integer
ZaehlerBisSechzig = m_Zaehler
End Property
Public Property Let ZaehlerBisSechzig(iOffset As Integer)
If m_Zaehler >= 60 Then
DoCmd.Quit
Else
m_Zaehler = m_Zaehler + iOffset
End If
End Property
b) Aufruf im Eingabeformular:
Private Sub Form_Timer()
ZaehlerBisSechzig 1
Me!ZaehlerModulneu = ZaehlerBisSechzig
End Sub
Fehlermeldung im Eingabeformular: "Unzulässige Verwendung einer Eigenschaft" hier:
ZaehlerBisSechzig 1
Ich denke, da ist ein Fehler im Aufruf des Moduls. Denn das Modul wird nicht mal ausgeführt.
???
Grüße
Herbert
Hallo,
Es werden die Properties nicht richtig gesetz bedeutet der Fehler.
hast Du Deinen Code mal mit debug.print einzelschritt "F8" laufen lassen und Deinen Propteries kontrolliert welche Werte sie bekommen?
Schau dir das mal an und probiere mal aus was Du ändern musst damit mit die Werte richtig gesetzt bzw. ausgelesen werden.
HTH
sorry
ZitatZaehlerBisSechzig = 1
Hallo Ekkehard,
das funktioniert jetzt mit diesem Code einwandfrei, aber vielleicht kannst du mir (sh. weiter unten) ein paar Fragen zum Verständnis beantworten. Hier der Code:
a) Property:
Option Compare Database
Private m_Zaehler As Integer
Public Property Get ZaehlerBisSechzig() As Integer
ZaehlerBisSechzig = m_Zaehler
End Property
Public Property Let ZaehlerBisSechzig(ByVal iOffset As Integer)
If m_Zaehler >= 60 Then
DoCmd.Quit
Else
m_Zaehler = m_Zaehler + iOffset
End If
End Property
b) Form Timer
Private Sub Form_Timer()
ZaehlerBisSechzig = 1
Me!ZaehlerModulneu = ZaehlerBisSechzig
End Sub
Frage zu a) Property Let-Anweisung:
Wieso erhält der "iOffset" die Werte 1,2,3... des Form Timers?
Frage zu b) Form Timer:
ZaehlerBisSechzig = 1
Me!ZaehlerModulneu = ZaehlerBisSechzig
Eigentlich dürfte ZaehlerBisSechzig sich doch gar nicht ändern wenn ich diesen
auf den Wert "1" stelle oder?
Sorry, aber ich hatte mit der Property Anweisung erst einmal zu tun und da ging es "nur" um die Weiterreichung des Mehrwertsteuersatzes.
Grüße
Herbert
Hallo Herbert,
Zu a)
Der Offset ist immer der Wert, den du übergibst. Normal ist das ein variabler
Wert (z.B. der Inhalt eines Formularfeldes oder der Wert einer Variablen), der
dann einfach nur in der Membervariablen festgehalten wird. Hier wird der Offset
dazu verwendet diese Variable hochzuzählen. Damit bist du auch variabel beim
Zeitraum; - Offset = 2 z.B. würde nach 30 Minuten beenden.
Eigentlich ist damit deine Frage zu b) auch schon beantwortet. Der eigentliche
Zähler ist ja nicht die Property sondern die Membervariable.
gruss ekkehard
Hallo Ekkehard,
super, vielen Dank für Deine Hilfe. Ich hatte Probleme mit der Übergabe des Wertes an iOffset. Jetzt ist der Vorgang jedoch klar geworden. Wieder was gelernt!
Danke noch mal dir und all den anderen hier im Forum die bei Problemen helfen.
Gruß
Herbert