Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: iukhdh am 18.07.07 - 09:45:54
-
Hallo Forum,
ich habe eine Maske mit an die 40 Zahlen-Eingabefelder, die letztlich eine Gesamtbewertung in einem berechneten Feld ergeben.
Ich hätte es gerne, dass die Gesamtbewertung jedesmal sofort aktualisiert wird wenn ein Wert geändert wird. Daher wollte ich in den Eingabefeldern überall mit uidoc.Refresh in OnChange die Maske aktualisieren.
Meine Frage: Muss ich das tatsächlich bei allen 40 Eingabefeldern hinterlegen, oder gibt es eine zentrale Möglichkeit die Maske zu aktualisieren?
Die Einstellung "Felder automatisch aktualisieren" bei den Maskeneigenschaften bringt nicht viel, da immer erst aktualisiert wird, wenn man in die nächste Zeile nach der Gesamtbewertung klickt.
Wie löst ihr sowas?
Gruß
Thomas
-
Eine zentrale Möglichkeit ist nur die Maskenoption "Felder automatisch aktualisieren". Wenn das nicht pratikabel ist, bleibt dir nur noch die Anpassung der Events der einzelnen Felder.
Axel
-
Hmm,
ist nicht unbedingt das was ich hören wollte. ;)
Nun gut, es handelt sich ja nun nur um ein paar Codezeilen, aber mal eine grundsätzliche Frage von einem Script-Rookie:
Muss ich diesen Code wirklich überall reinkopieren, es könnte ja auch weitaus mehr sein. Oder besteht im Script die Möglichkeit irgendwo solche Routinen einmalig zu hinterlegen, und diese dann nur im OnChange-Event aufzurufen?
Thomas
-
Ich hatte schon mal in einer Maske einen Button ("Werte aktualisieren") eingebaut.
-
Ist zwar nicht GENAU das was Thomas wollte, aber nicht nur für den Entwickler und die Pflege leichter, sondern auch für den User durchaus zumutbar denke ich.
Matthias
-
Hmm,
ist nicht unbedingt das was ich hören wollte. ;)
Das glaube ich dir. ;)
Muss ich diesen Code wirklich überall reinkopieren, es könnte ja auch weitaus mehr sein. Oder besteht im Script die Möglichkeit irgendwo solche Routinen einmalig zu hinterlegen, und diese dann nur im OnChange-Event aufzurufen?
Du kannst den Code auch als Routine oder Funktion in eine Scriptbibliothek auslagern, diese dann mit Use "Name der Biblothek" im Options - Abschnitt in den Globals der Maske einbinden. Dann kannst du an allen Ecken der Maske diese Routine/Funktion aufrufen.
Ich hatte schon mal in einer Maske einen Button ("Werte aktualisieren") eingebaut.
Dann muss aber die Aktualisierung manuell passieren. Aber genau das soll ja hier vermieden werden.
Axel
-
@klauss
Aha, anstatt auf F9 drückt man dann auf den Aktualisierungsbutton? :D
@Axel
Na das muss ich mir mal genauer anschauen. Danke für den Tipp
Thomas
-
Aha, anstatt auf F9 drückt man dann auf den Aktualisierungsbutton?
Richtig ! Nicht jeder User kennt F9 (zumindest hier). Und so ein schöner, fetter, roter Button ist nicht zu übersehen... ;D
-
Also irgendwie will das nicht.
Ich habe Axels Vorschlag wie folgt versucht umzusetzen:
folgende Scriptbibliothek "aktualisieren" angelegt:
Sub Initialize
Dim nuiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = nuiws.CurrentDocument
uidoc.Refresh
End Sub
Ins Options der Maske
Use "aktualisieren"
reingeschrieben.
Wenn ich nun die Maske aufrufe, bekomme ich die Fehlermeldung "Dokumentbefehl ist nicht verfügbar". Was bedeutet das?
Und ... wie rufe ich dann diese Bibliothek auf? Auch mit Use "aktualisieren" beim Onchange-event des Feldes?
Immer wenn ich das da reinschreibe, wird der Code nach Options des Felds verschoben. Also irgendwas krieg ich nicht hin.
Thomas :(
-
Ganz so funktioniert das nicht.
Du musst in der Scriptbibliothek eine neue Routine anlegen, z.B DokumentRefresh. Dazu gibst du im Options-Abschnitt einfach Sub DokumentRefresh ein. Es wird dann automatisch zu einer neuen Routine.
Dann kopierst du die Zeilen dort hinein. Das Ganze sieht zum Schluss so aus:
Sub DokumentRefresh
Dim nuiws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = nuiws.CurrentDocument
uidoc.Refresh
End Sub
Aus Sub Initialize musst du die Zeilen löschen!
Das mit dem Use ist soweit richtig. In die Events der Felder muss dann
Call DokumentRefresh
als Aufruf der Routine rein.
Axel
-
Wenn ich nun die Maske aufrufe, bekomme ich die Fehlermeldung "Dokumentbefehl ist nicht verfügbar". Was bedeutet das?
Du kannst einen Refresh nur im Bearbeitungsmodus aufrufen.
Also:
...
if uidoc.EditMode Then
uidoc.Refresh
end if
-
Also irgendwie ist heute nicht mein Tag.
Das mit der Routine in der Scriptbibliothek leuchtet mir ein. Hab ich nun auch so abgeändert und dort die Sub aktualisieren angelegt
Wenn ich nun aber im Onchange-event das call aktualisieren eingebe kommt jedesmal die Meldung Not a sub or funktion name:AKTUALISIEREN.
Bei den Options der Maske Eingabe (bei Eingabe (Maske) ) steht Use "aktualisieren" drin.
:-:
-
Wahrscheinlich stößt Notes sich an den doppelten Namen.
Benenn' mal die Bibliothek oder die Routine um.
Axel
-
Modulname = Name der ScriptLib ist kein Problem.
Wurde die Reihenfolge des Einbinden eingehalten? Sicherheitshalber:
- Lib in Maske einbinden, speichern, Maske schliessen
- Erst jetzt die Sub im Event aufrufen
Bernhard
-
Also ich hab nun mal beide Hinweise versucht.
Die Script-Bibliothek heisst nun "Aktuell", die sub "aktualisieren".
Ich hab erst die ScriptLib Aktuell eingebunden bei 'Options, gespeichert, sogar den Designer geschlossen, dann beim onchange-event call aktualisieren eingegeben, er nimmt es nicht.
Hmm, ich verwende aber schon das richtige Options? Es gibt ja im Objekt Fenster erst mal eine Kategorie mit (Globals)Eingabe, dann eine Kategorie mit Eingabe(Maske). In der zweiten hab ichs eingebunden, bei der ersten klappts eh nicht.
Seltsam, seltsam.
-
Du musst das im Options-Abschnitt unter Globals der Maske einbinden. Nur dann gilt es an allen Ecken der Maske.
Axel
-
Oh Mann, war das eine Geburt.
Ich habs tatsächlich in den falschen Options eingetragen, es hat aber vorher auch nie funktionert, was ich nun einfach mal auf das von Bernhard skizzierte Problem schiebe. Nachdem ich nun erst den Eintrag im richtigen Options eingetragen habe, dann gespeichert, geschlossen und dann den Rest eingetragen habe hats endlich geklappt.
Uff
Vielen Dank für die Hilfe an diesem heissen Nachmittag
:knuddel:
Thomas
-
Hallo,
ich hätte das mit der Timerklasse von Notes gemacht, damit kann man alle 1, 2 oder x Sekunden, halt periodisch, Code ausführen und muss nicht überall ein Refresh einbauen.
--> global
Dim elapsedTimer As NotesTimer
--> postopen
Set elapsedTimer = New NotesTimer(3, "Die Zeit in Sekunden")
On Event Alarm From elapsedTimer Call meineFunktion
dann natürlich noch deine Funktion (global).
der Bubble
-
Ja, wäre auch eine Lösung gewesen, wobei ich mir da wieder meine User vorstelle, die alle naslang anrufen weil da irgendwas gaaaaanz komisch reagiert
;)
Danke trotzdem für den Tipp, das kann ich vielleicht woanders mal brauchen
Thomas