Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: LukasSChl am 28.04.10 - 08:46:40

Titel: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 08:46:40
Moin

Ich hab eine Maske mit ein Paar Feldern, in denen Werte angezeigt werden.
Beim Klick auf einen Button werden die Werte berechnet und in die Felder eingetragen.

Die Berechnungen für die Felder sollen automatisch aktualisiert werden.
(Es werden Uhrzeiten angezeigt und die sollen halt immer genau sein^^)

Wie bekomm ich das hin, das der Code im Button automatisch ausgeführt wird, bzw. macht das über diesen Weg Sinn?

Mir fällt spontan ne Schleife ein, wo der Button Code einfach ständig durchläuft aber is bestimmt keine gute Lösung.

EDIT: Der Button-Code berechnet 4 Felder, jedoch müssen nur 2 Felder von der Zeit her aktuell gehalten werden, die anderen Zeiten ändern sich nicht.

mfg Lukas

ps: heute an dem Platz habe ich Notes 8 / Designer 8
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 08:59:07
Verstehe ich richtig, dass Du Felder in einem geöffneten Dokument permanent automatisch aktualisieren willst?

Ich würd's lassen
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 09:00:27
Ja so in etwa wollt ich das haben^^, nur das es kein geöffnetes Dokument ist, sondern eine Maske.

Einfach so das in dem Feld, welches berechnet, wielange man schon im Büro sitzt, immer die aktuelle Arbeitszeit steht.

mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 09:12:50
Tja, eine nette Idee, aber dann wirst Du wirklich nur noch im Büro sitzen. Arbeitszeit kann man das dann wohl nicht mehr nennen, wenn der Rechner permanent blockiert ist  :)

Mit einem Java-Applet ließe sich das vielleicht sogar einigermaßen gut darstellen. Aber da kann ich Dir nicht wirklich helfen.
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: ascabg am 28.04.10 - 09:19:04
Hallo,

Ich frage mich auch, warum denn eine permanente Aktualisierung erforderlich ist.

Ein Feld mit Datum Begin, 1 Feld mit Zeit Begin, 1 Feld mit Datum Ende, 1 Feld mit Zeit Ende, 1 Feld mit Pausenzeit (in min), 1 berechnetes Feld mit der Differenz zwischen den einzelnen Werten.

Die Berechnung kann beim Speichern des Dokumentes erfolgen, sofern alle notwendigen Werte eingetragen wurden.

Andreas

P.S.:
Ein Dokument ist mit einer Maske erstellt. (Maske ist das Design, ein Dokument sind die Daten, die eingegeben wurden)
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: DerAndre am 28.04.10 - 09:19:29
Ein Countdown wäre wohl besser (http://ytimer.software.web.de/)
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 09:25:00
Ein Countdown wäre wohl besser (http://ytimer.software.web.de/)
Kann hier leider keine andere Software runterladen / installieren / nutzen, deswegen bastel ich an einer Notes-Lösung.

Hallo,

Ich frage mich auch, warum denn eine permanente Aktualisierung erforderlich ist.

Ein Feld mit Datum Begin, 1 Feld mit Zeit Begin, 1 Feld mit Datum Ende, 1 Feld mit Zeit Ende, 1 Feld mit Pausenzeit (in min), 1 berechnetes Feld mit der Differenz zwischen den einzelnen Werten.

Die Berechnung kann beim Speichern des Dokumentes erfolgen, sofern alle notwendigen Werte eingetragen wurden.

Andreas

P.S.:
Ein Dokument ist mit einer Maske erstellt. (Maske ist das Design, ein Dokument sind die Daten, die eingegeben wurden)


Das Dokument soll garnicht gespeichert werden, man hat einfach nur die Maske offen, in der die Arbeitszeit, Überstunden, Zeit zu der man gehen kann (bei Soll-Arbeitszeit) berechnet wird.
Nur zur "Selbstkontrolle" oder wie man das nennen soll^^


Ok ich hab ma ne theoretische Überlegung:

1. Ich nehm den Code aus dem Button und pack den direkt in die Felder.
2. Beim Öffnen sollen die aber noch nicht berechnet werden.

3. Mit Klick auf den Button arbeitet der die Felder mit den Einzelberechnungen ab.
4. Die 2 Felder die ständig aktuell gehalten werden sollen -> "Felder automatisch aktualisieren" Funktion

Ist das möglich??

mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: joringel am 28.04.10 - 09:32:16
Ich denke, die Anforderungen aus dem ersten Posting sollten sich mit der Klasse 'Notestimer' bewerkstelligen lassen.

Gruß
Peter
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 09:39:06
Der Notestimer stoppt aber, wenn das Dokument verlassen wird (oder ein anderes Dokument geöffnet wird), zumindest war das in älteren Versionen so (Notes 5?, hab's danach nicht wieder probiert). Dann kann Notes nur dieses Dokument anzeigen (Wie Andreas schon geschrieben hat, man kann keine Maske anzeigen, nur Dokumente, und die sehen dann so aus, wie es in der Maske definiert ist). Wenn die einzige Aufgabe des Rechners ist, anzuzeigen, wann man endlich gehen darf, kann man das wohl mal versuchen ...
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 09:48:37
Der Notestimer stoppt aber, wenn das Dokument verlassen wird (oder ein anderes Dokument geöffnet wird), zumindest war das in älteren Versionen so (Notes 5?, hab's danach nicht wieder probiert). Dann kann Notes nur dieses Dokument anzeigen (Wie Andreas schon geschrieben hat, man kann keine Maske anzeigen, nur Dokumente, und die sehen dann so aus, wie es in der Maske definiert ist). Wenn die einzige Aufgabe des Rechners ist, anzuzeigen, wann man endlich gehen darf, kann man das wohl mal versuchen ...

Da das Dokument ja nicht geschlossen wird (außer man beendet die Anwendung) spielt das hier ja keine Rolle.

Neben der "Sie können dann und dann gehen"-Zeit, wird noch die Restzeit, die Arbeitszeit und ne %-Angabe angezeigt/berechnet.


mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 09:59:07
Über den Sinn der Aktion brauchen wir hier nicht zu diskutieren, intererssant ist m.E. nur die Technik. Man könnte das ja auch für ganz andere Zwecke verwenden.

Meines Wissens beendet sich der NotesTimer in dem Augenblick, in dem das Dokument, in dem der läuft, nicht mehr im Vordergrund ist (also Dokument bleibt geöffnet, aber ein anderes wird zusätzlich geöffnet). Das Problem kann inzwischen ja behoben sein. In der Designer-Hilfe ist der NotesTimer (wenn ich mich recht erinnere) ganz gut beschrieben. Probiers aus, bin gespannt auf Dein Ergebnis.
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 10:17:47
Ok ich versuchs ma^^

Global Declarations:
Code
Dim elapsedTime As Integer
Dim elapsedTimer As NotesTimer
%INCLUDE "lsconst.lss"

Postopen:
Code
Sub Postopen(Source As Notesuidocument)
  Set elapsedTimer = New NotesTimer(1, "test")
  elapsedTime = 0
  On Event Alarm From elapsedTimer _
  Call elapsedTimerHandler
End Sub

Was bitte macht: "On Event Alarm From elapsedTimer _
                              Call elapsedTimerHandler" ??
Jedes mal wenn der Timer auf 0 ist, ruft er die untere Sub neu auf?


Das muss auch irgendwo hin, aber ich weiß nicht wo, man kann ja keine eigenen Subs anlegen irgendwie, zumindet weiß ich net wie^^
Code
Sub elapsedTimerHandler(Source As NotesTimer)
  elapsedTime = elapsedTime + 1
End Sub
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 10:37:01
Du kannst eigene Sub's und Function's erstellen, indem Du Sie unterhalb einer bestehenden Sub oder Function schreibst, z.B. unterhalb End Sub der Sub Initialize (Sub MeineSub + Enter - fertig).

In die elapsedTimerHandler muss dann die Aktualisierungsroutine eingebaut werden
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 10:45:51
On Event Alarm From elapsedTimer _
Call elapsedTimerHandler"

Was passiert hier? Ich kann mir das net so ganz erschließen.
Bei elapsedTime = 0 ruft der die "elapsedTimerHandler"-Sub auf, die dann beginnt die Variable jede Sekunde um 1 zu erhöhen oder?

Jetzt muss es nurnoch so sein, dass alle 60 Sekunden der Inhalt der 2 betroffenen Felder neu berechnet wird.
z.B. so:
Code
Sub elapsedTimerHandler(Source As NotesTimer)
  elapsedTime = elapsedTime + 1,
  If elapsedTime = 60 then
  'Code
  elapsedTime = 0
  End if
End Sub

mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 10:57:46
ja
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 12:00:10
Also ich bekomme jetzt eine Error-Meldung:
"Falscher Datentyp in Methode RunStkCoerceVal: Unknown wurde gefunden, Unknown wurde erwartet."

Hier mal der Code des elapsedTimerHandler's:
Code
Sub elapsedTimerHandler(Source As NotesTimer)
	
Dim oWorkspace As New NotesUIWorkspace
Dim oUIDoc As NotesUIDocument
Set oUIDoc = oWorkspace.CurrentDocument
Dim oDoc As Notesdocument
Set oDoc = oUIDoc.Document
Dim Arbeitszeit As Double
Dim Arbeitszeit_Stunden As String
Dim Arbeitszeit_Minuten As String
Dim Aktuelle_Zeit As New NotesDateTime( "" )
Dim Aktuelle_Zeit_dbl As Double
Dim Aktuelle_Zeit_dbl_Stunden As Double
Dim Aktuelle_Zeit_dbl_Minuten As Double
Dim Arbeitsbeginn As  New NotesDateTime( "" )
Dim Überstunden_Min As String
Dim Überstunden_Std As String
Dim Gehen_um_Min As String 
Dim Gehen_um_Std As String 
Dim Soll As Double 
Dim TimeToGo_Min As String 
Dim TimeToGo_Std As String 
Dim Pausen_Soll As Double 
Dim Pause As Variant
Dim Restpause_Min As Double
Dim Restpause_Std As Double
Dim reine_Arbeitszeit As Double  

elapsedTime = elapsedTime + 1

Aktuelle_Zeit.LSLocalTime = Now	
If (Aktuelle_Zeit.TimeDifference(oDoc.Time)) >= 60 Then
     If Trigger = 1 Then
          If elapsedTime = 60 Then
               'Felder neu berechnet
          End If
     End If
End If

End Sub

Die Fehlermeldung taucht auf, sobald ich das Dokument aufrufe.
Weggklicken kann man den Fehler, aber der kommt immer wieder.

EDIT:    
Ich habe den Wert des Feldes oDoc.Time vorher in eine Variable gesteckt
und damit den TimeDifference befehl "gefüttert"
leider behebt das das Problem nicht:

Dim oTime As  New NotesDateTime( oDoc.Time  )   
If (Aktuelle_Zeit.TimeDifference(oTime)) >= 60 Then

Dummerweise kann man mit dem Debugger auch nicht schauen wo genau der Fehler produziert wird...... ;( xD

mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 12:18:43
Aktuelle_Zeit.LSLocalTime = Now   
If (Aktuelle_Zeit.TimeDifference(oDoc.Time)) >= 60 Then
     If Trigger = 1 Then
         If elapsedTime = 60 Then
               'Felder neu berechnet
          End If
     End If
End If
Ich verstehe nicht, wozu Du den blauen Teil benötigst. Da der Timer elapsedTime jede Sekunde um eins hochzählt, ist die Minute um, wenn elapsedTime 60 ist, dann setzt Du den wieder auf 0 und es beginnt von vorn.
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 12:22:07
Wenn Du mit dem Debugger den TimerHandler nicht debuggen kannst, ruf ihn temporär über eine Schaltfläche auf und debug damit
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 12:31:29
Wenn Du mit dem Debugger den TimerHandler nicht debuggen kannst, ruf ihn temporär über eine Schaltfläche auf und debug damit

Das is ne gute Idee, dank dir, werd ich ma testen.

Gründe warum ich die zusätzlichen Abfragen hab:
- Trigger, verhindert automatische Berechnung, falls User grad in einem Feld einen Wert ändert -> Berechnung wäre dann fehlerhaft
- Deswegen die Abfrage nach dem Zeitunterschied, da wenn ich den Timer Stoppe die Zeit ja weiterläuft obwohl der Timer, nach erneutem Starten nur bei z.b. 30 ist.

PS. Eben pause, max 40min

mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 12:48:50
dann kann es aber passieren, dass elapsedTime größer als 60 wird und dann nie die Aktualisierung aufgerufen wird. Wäre es nicht einfacher, bei Eintreffen des "UserBearbeitet"-Ereignisses elapsedTime auf 0 zu setzen und nur eine Bedingung (elapsedTime = 60) zu prüfen?
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 13:25:46
dann kann es aber passieren, dass elapsedTime größer als 60 wird und dann nie die Aktualisierung aufgerufen wird. Wäre es nicht einfacher, bei Eintreffen des "UserBearbeitet"-Ereignisses elapsedTime auf 0 zu setzen und nur eine Bedingung (elapsedTime = 60) zu prüfen?

Wenn ich es so mache:
Code
Aktuelle_Zeit.LSLocalTime = Now   
If (Aktuelle_Zeit.TimeDifference(oDoc.Time)) >= 60 Then
     If Trigger = 1 Then 
          'Felder werden neu berechnet
     End If
End If
dann aktualisiert er nur, wenn wirklich mind. 1 Minute rum ist und der Trigger grünes licht für die Berechnung gibt.

Es läuft jetzt auch alles so wie ich mir das gedacht habe.

Vielen Dank für die Hilfe.

mfg Lukas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: Peter Klett am 28.04.10 - 13:36:56
Läuft der Timer weiter, wenn Du danach ein weiteres Dokument öffnest?
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: joringel am 28.04.10 - 14:12:33
Das Alarminterval kannst du gleich bei der instanzierung des Notestimers festlegen:

Set elapsedTimer = New NotesTimer(60, "test").

Das spart die IF-Abfrage und das mitzählen der Sekunden in elapsedTime.

Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: ascabg am 28.04.10 - 15:25:14
Hallo,

Nun moechte ich mich auch nochmal melden.

Frage.
Warum unbedingt Lotus Notes fuer deise Zweck?

Es geht doch mit HTML und JavaScript einfacher und ich muss mir auch nicht zwingend Gedanken ueber die Aktualisierung das Anzeige machen.

Als Anregung mal ein kleine HTML-File, was den geschilderten Sachverhalt so ziemlich genau nachbildet.
Gut, ich gebe zu, ich bin nicht der Profil in HTML und JavaScript und es wird sicherlich in meine kleinen Beispiel noch Potenzial fuer dei Optimierung geben, aber es funktioniert erst mal.
(Dateierweiterung ".txt" einfach entfernen, damit wieder eine html-Datei daraus wird.

Andreas
Titel: Re: Feld mit Uhrzeit, automatisch aktualisieren
Beitrag von: LukasSChl am 28.04.10 - 16:07:58
Läuft der Timer weiter, wenn Du danach ein weiteres Dokument öffnest?

Nein tut er leider nicht.

Zu den Gegebenheiten:
Notes Client: 8.0.2
Notes Designer: 8.0.2
Server: 6.5.1
Datenbank liegt bei mir auf dem Rechner lokal

Das Alarminterval kannst du gleich bei der instanzierung des Notestimers festlegen:

Set elapsedTimer = New NotesTimer(60, "test").

Das spart die IF-Abfrage und das mitzählen der Sekunden in elapsedTime.

ginge auch, ja.
EDIT: Ich find die Lösung mit der TimeDifference Methode irgendwie besser, da der Timer ja pausiert, wenn die Eingabefelder bearbeitet werden.
Und wenn der Timer dann weiterläuft, ist die Zeit ja schon fortgeschritten und bis zur nächsten Prüfung würde es ja dann noch dauern. Somit würde sich die Anzeige der richtigen Zeiten verzögern.


Das Timerintervall prüft hier halt nur so und so oft nach.
Aber ich werd ma beide Lösungen in der Praxis testen.
Danke für die Anregung.

Hallo,

Nun moechte ich mich auch nochmal melden.

Frage.
Warum unbedingt Lotus Notes fuer deise Zweck?

Weil ich in der Abteilung wo ich grad bin mit Notes programmieren soll^^
Und diesen Zeitrechner zu schreiben ist halt meine momentane Aufgabe, die ich mir ausgesucht habe.

Klar gings einfacher, aber nunja ;D


Der Notes-Timer ist klasse, wenn kein anderes Dokument geöffnet wird, was sich nicht verhindern lässt.

Kennt jmd zufällig ne andere Lösung mit der sich das selbe realisieren lässt?


mfg Lukas