Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: herb54 am Februar 11, 2020, 18:30:09

Titel: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 11, 2020, 18:30:09
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


Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: DF6GL am Februar 11, 2020, 19:13:53
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.
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 11, 2020, 19:29:03
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 11, 2020, 19:31:21
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: DF6GL am Februar 11, 2020, 20:11:51
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

.
.
.
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 11, 2020, 20:28:03
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 11, 2020, 22:36:52
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 12, 2020, 13:12:51
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 12, 2020, 13:15:36
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.
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: Beaker s.a. am Februar 12, 2020, 21:17:54
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 13, 2020, 16:33:46
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: silentwolf am Februar 13, 2020, 17:25:02
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

Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: Beaker s.a. am Februar 13, 2020, 21:36:25
sorry
ZitatZaehlerBisSechzig = 1
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 14, 2020, 15:43:02
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: Beaker s.a. am Februar 14, 2020, 20:35:08
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
Titel: Re: Session Zähler der automatisch Access nach einer bestimmten Zeit beendet
Beitrag von: herb54 am Februar 16, 2020, 19:30:03
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