Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: RonMat am 03.01.06 - 12:08:24
-
Möchte über ausgewählte Dokumente ein Refresh durchführen und habe nachfolgenden Script erstellt:
Dim session As New NotesSession
Dim db As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set collection = db.UnprocessedDocuments
Set doc = collection.GetFirstDocument()
Dim ws As New NotesUIWorkspace
Dim Uidoc As NotesUIDocument
While Not(doc Is Nothing)
Set uidoc= ws.currentdocument
Call uidoc.refresh
Set doc = collection.GetNextDocument(doc)
Wend
Das ist nur ein Testscript, später wird die Collection aus def. Datensätzen
erzeugt.
Wenn ich das Script laufen lasse, dann geht ein Fensterchen auf mit der Message: Object variable not set
Ich muß diverse Felder berechnen und hatte es vorher mit computedwith form versucht, doch die Felder wurden nicht berechnet und ich habe ein refresh auf das Dokument laufen lassen und siehe da ..
Da in der Doc Klasse ein refreshen nicht vorgesehen ist wollte ich den Umweg über das Uidoc machen , nun habe ich aber o.g. Prob.
Kann mir wohl einer weiterhelfen? Vielleicht habe ich ja auch im Augenblick ein ziemliches Brett vorm Auge
-
Hi,
in deinem Script knallst in der Zeile
Set uidoc...
Und auf jeden Fall, dass was du vorhast geht so nicht. Das Thema hatten wir hier schon mehrmals.
Die einfachste Möglichkeit ist eine Ansichtsaktion die den Formelbefehl
@Command([ToolsRefreshSelectedDocs])
aufruft.
Damit werden alle markierten Dokumente in der Ansicht aktualisiert.
Axel
-
@Command([ToolsRefreshSelectedDocs]) führt allerdings keinen Code der Refresh-Events aus. Dort könnten ebenfalls noch Systemfelder geschrieben werden.
Die Zeile Set uidoc= ws.currentdocument ist hier nicht passen.
Die CurrentDocument-Eigenschaft gibt das aktuell geöffnete Dokument zurück. In der Collection sind allerdings nur die ausgewählten Dokumente der Ansicht. Soll heißen: Die Dokumente müssen erst noch geöffnet werden.
Set uidoc = ws.EditDocument(True, doc, False)
If uidoc.EditMode Then Call uidoc.Refresh
Call uidoc.Close(True)
-
@Command([ToolsRefreshSelectedDocs]) führt allerdings keinen Code der Refresh-Events aus. Dort könnten ebenfalls noch Systemfelder geschrieben werden.
Refresh-Event. ???
...Soll heißen: Die Dokumente müssen erst noch geöffnet werden.
Set uidoc = ws.EditDocument(True, doc, False)
If uidoc.EditMode Then Call uidoc.Refresh
Call uidoc.Close(True)
Damit wirst du allerdings nicht lange Freude haben. Aus eigener Erfahrung kann ich dir sagen, dass nach relativ kurzer Zeit der Notes-Client abschmiert.
Axel
-
Danke für Euere Anregungen bzw. Kommentare.
Es muß doch eine funktionierende Refresh-Möglichkeit geben, die auch stabil läuft, wobei ich im Moment noch nicht sehe weshalb der Client abschmiert.
-
Es muß doch eine funktionierende Refresh-Möglichkeit geben, die auch stabil läuft...
@Command([ToolsRefreshSelectedDocs])
Ich hatte bisher noch nie Probleme damit. Hast du's damit mal probiert?
...wobei ich im Moment noch nicht sehe weshalb der Client abschmiert.
Das liegt irgendwie an der Speicherverwaltung. Bei mir hat sich so nach 9 bzw 10 Dokumenten, mal mehr mal auch etwas weniger, der Client verabschiedet. Kann auch versionsabhängig sein.
Axel
-
Bei mir hat sich so nach 9 bzw 10 Dokumenten
Darum Call uidoc.Close(True)
Zur Refresh: Ich meinte Queryrecalc und Queryrecalc. Und in diesen Events können noch Felder per Script gesetzt werden.
Und dieses Event wird durch @Command([ToolsRefreshSelectedDocs]) nicht hervorgefufen.
-
Bei mir hat sich so nach 9 bzw 10 Dokumenten
Darum Call uidoc.Close(True)
Auch mit ...True
Axel
-
Ich kann Axels Erfahrungen bestätigen. Die Situation hat sich zwar mit R6 / R7 gebessert, aber nach wie vor laufen dort zwei gegenläufige Prozesse ab: Die (hauptsächliche) Bearbeitung im Backend vs. Aufrufe von Frontend-Prozessen, deren Stack sich asynchron gegenüber dem Backend-Prozess verhält.
Vielleicht lässt sich ein einfacherer Ansatz finden: Warum ist überhaupt ein Refresh aus dem Backend erforderlich? Wegen der (komplett anderen) Komplexität des FrontEnd-Documents ist das ja nicht ohne Grund nicht im Backend implementiert und sollte eigentlich auch vermieden werden. Was muss denn warum nachkalkuliert werden? Kann man das nicht anderweitig lösen? Ist das ein einmaliger Prozess (dass würde ja @Command([ToolsRefreshSelectedDocs]) mit einem nachfolgenden Agent, der den Query-/PostRecalc-Code ausführt, ausreichen. Ist es kein einmaliger Prozess, ist das m.E. sowieso bedenklich.
Bernhard
-
Refreshformula geht natürlich - aber entweder man muß die Docs auswählen oder alle Docs in der Ansicht refreshen. Das Problem sind die Menge der Documents - > 300000 (in einem Jahr)
Warum muß ich die Datenbank refreshen?
Ich importiere via FTP Textfiles und in Abhängigkeit der Headers werden Hauptdokumente und Responsdocuments erstellt. Beide Dokumentarten enthalten berechnete Felder (u.a. Lookups, Währungsberechnungen) die aber während des Imports nicht befüllt werden können da die entsprechenden Felder von anderen Faktoren abhängig sind.
Markiere ich diese Felder und refreshe diese, werden die fehlenden Feldwerte eingesetzt. Das geht aber leider nicht mit Computewithform, da hier nur die default,validierten .. Felder berechnet werden. @DBLookups wollen nicht so und auch Feldwerte die von Dritten abhängig sind werden nicht computed.
-
Das Problem hatte ich auch einmal...mit dem Öffnen der uidoc's knallt dann nach einer recht geringen Anzahl von Dokumenten (je nach Version und verfügbarem Speicher) der Notes-Client raus. Ich habe die Forms so umgestaltet, dass alles nicht per Formel sondern per Script berechnet wird, diese Scripts dann in eine LS-Lib zusammen gefasst habe und diese dann in der Batch-Verarbeitung wieder aufrufe.
Also nach folgendem Schema:
for i = 1 to coll.count
set doc = coll.getnthdocument( i )
Call mydocRecalcScript oder sonstwas-Script
Call doc.Save (true, false, true)
next
A lot of work, aber es geht nicht anders. Und ist wesentlich flotter als die Methode über uidocs.