Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: RonMat am 03.01.06 - 12:08:24

Titel: zuweisung UiDoc
Beitrag 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
Titel: Re: zuweisung UiDoc
Beitrag von: Axel am 03.01.06 - 12:58:30
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

Titel: Re: zuweisung UiDoc
Beitrag von: Johnson am 03.01.06 - 13:06:01
@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)
Titel: Re: zuweisung UiDoc
Beitrag von: Axel am 03.01.06 - 13:11:23
@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
Titel: Re: zuweisung UiDoc
Beitrag von: RonMat am 03.01.06 - 14:45:29
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.
Titel: Re: zuweisung UiDoc
Beitrag von: Axel am 03.01.06 - 15:47:31
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
Titel: Re: zuweisung UiDoc
Beitrag von: Johnson am 03.01.06 - 16:22:23
Zitat
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.
Titel: Re: zuweisung UiDoc
Beitrag von: Axel am 03.01.06 - 16:26:21
Zitat
Bei mir hat sich so nach 9 bzw 10 Dokumenten
Darum Call uidoc.Close(True)

Auch mit ...True


Axel
Titel: Re: zuweisung UiDoc
Beitrag von: koehlerbv am 03.01.06 - 23:01:34
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
Titel: Re: zuweisung UiDoc
Beitrag von: RonMat am 04.01.06 - 12:25:58
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.
Titel: Re: zuweisung UiDoc
Beitrag von: rhaller am 04.01.06 - 13:51:28
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.