Autor Thema: Cache-Problem?  (Gelesen 2374 mal)

Jürgen Schomann

  • Gast
Cache-Problem?
« am: 27.02.17 - 18:49:33 »
Ich habe eine Maske T1 mit einem Text-Feld F1. Das Feld enthält den Wert 'Z'. im Ereignis Onload ist folgendes angegeben:

Sub Onload(Source As Notesuidocument)
   Dim s$
   s = Source.Document.UniversalID
End Sub

Dann habe ich einen gemeinsamen Ordner T1.

Dann habe ich einen Agenten T1 mit Auslösen: Auswahl im Menü 'Aktionen', Ziel: Keines
und folgendem Code:

@Command([RunAgent]; "A1");
@Command([RunAgent]; "A2")

Der Agent A1 mit Auslösen: Auswahl in der Agentenliste, Ziel: Alle ausgewählten Dokumente
und folgendem Code:

SELECT Form = "T1";
FIELD F1 := "A1";
@AddToFolder("T1"; "")

Der Agent A2 mit Auslösen: Auswahl in der Agentenliste, Ziel: Keines
und folgendem Code:

Sub Initialize
   Dim session As New NotesSession
   Dim view As NotesView
   Dim doc As NotesDocument
   Set view = session.CurrentDatabase.GetView("T1")
   Call view.Refresh
   Set doc = view.GetFirstDocument
   MsgBox doc.F1(0)
End Sub

Der Ablauf ist folgender:
Der Ordner T1 wird manuell geöffnet und das Dokument, falls vorhanden, mit der Aktion 'Aus Ordner entfernen' entfernt.
Ein Dokument mit der Maske M1 wird manuell erstellt mit dem Wert 'Z' in dem o. g. Feld F1 und abgespeichert.
Dann wird dieses Dokument in der Ansicht ausgewählt und dann der Agent T1 gestartet.
Dieser ruft zuerst Agent A1 auf, der das Dokument liest, den Wert 'A1' in das Feld F1 schreibt und dann das Dokument in den Ordner T1 kopiert.
Danach wird der Agent A2 gestartet, der das Dokument aus dem Ordner T1 liest und den Wert des Feldes F1 ausgibt.

Wenn der Agent T1 gestartet wird und das Dokument während dieser Zeit nicht geöffnet wird, gibt der Agent A2 auch richtig 'A1' aus.
Wenn das Dokument aber vor dem Aufruf des Agenten T1 geöffnet wurde (auch nur zum Lesen) dann gibt der Agent A2 aber noch den alten Wert 'Z' aus,
obwohl das Dokument durch den Agenten A1 den Wert von Feld F1 in 'A1' geändert hat. Das geöffnete Dokumnent darf natürlich nicht gespeichert werden,
da der Agent dies geändert hat und sonst ein Speicherkonflikt entstehen würde.

Ursache ist das Ereignis Onload in der Maske T1 wo das Backend-Dokument über die Zeile s = Source.Document.UniversalID angesprochen wurde.
Wenn diese Zeile auskommentiert wird und der gleiche Vorgang ebenfalls mit geöffnetem Dokument  wiederholt wird, wird dagegen der richtige Wert 'A1' ausgegeben.
Auch der gleiche Code statt Onload in Postopen oder ein Öffnen des Dokuments im Bearbeiten-Modus und über Call Source.Refresh bei Onload oder PostOpen
den Code in Queryreclac ergibt den alten Wert 'Z'.
Es ist auch egal ob es Source.Document.UniversalID oder irgend was anderes ist. Es reicht wenn beim Öffnen das Backend-Dokument angesprochen wird.

Eigentlich sind doch die Maske und der Agent vollkommen verschiedene Prozesse.
Es scheint so, dass der Agent A2 beim Lesen des Ordners sich das geöffnete Dokument statt das aus dem Ordner greift.
Auch der Code von Agent T1 mit

@PostedCommand([ToolsRunMacro]; "A1");
@PostedCommand([ToolsRunMacro]; "A2")

ergibt keine Änderung.

Das Beispiel ist zur besseren Veranschaulichung nur ein stark reduzierter Extrakt aus der eigentlichen Maske bzw. den Agenten beim Kunden.
Gibt es dazu irgendeine Erklärung.

Online Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Re: Cache-Problem?
« Antwort #1 am: 28.02.17 - 07:38:21 »
Nach genau dem selben Fehler habe ich letzte Woche 3 Tage fieberhaft gesucht. Sobald Du IRGENDEINE Referenz auf ein NotesDocument in Deinem Code hast, dann wird das Dokument im Cache gehalten, sogar für Code der AUSSERHALB der Datenbank liegt (wenn Du aus einer anderen Datenbank mit GetDocumentByUNID auf das Dokument zugreifst, kriegst Du auch nur den "gecachten" Wert.

Prüfe Deine Referenzen und lösche alle globalen Verweise auf das NotesDocument...

Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Cache-Problem?
« Antwort #2 am: 28.02.17 - 09:28:08 »
Öffnest du das Dokument mit workspace.editDocument? Dann beeinflusst der "newInstance" Parameter das von dir beschreibee Verhalten.

Um im Agent gesichert an das Backend-Dokument zu kommen kannst du folgendes probieren:

unid = doc.universalId
delete doc 'alle Referenzen killen
doc = db.getDocumentById

Damit ziehst du aber auch der geöffneten Maske das Dokument weg,was u. U. dann dort zu Problemen führt

Falls du die Referenz wirklich nicht weg bekommst kannst du ein berechetes Feld z. B.  tmpDocIsOpen=1 in die Maske rein machen und im Agent auf Präsenz des Feldes prüfen und eine entsprechende Meldung ausgegeben, dass das Dokument erst geschlossen werden muss.

VG
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Jürgen Schomann

  • Gast
Re: Cache-Problem?
« Antwort #3 am: 28.02.17 - 13:00:56 »
vielen Dank beide für eure Antworten,

genauso wie ihr beschreibt hatte ich das Problem schon selbst vorher gelöst. Ich frage in dem Agenten A2 mit NotesDocument.IsUIDocOpen ab ob das Frontend-Dokument geöffnet ist
und lösche dann die Referenz und hole das Dokument neu über die vorher gesicherte UNID.

Code von Agent A2:

Sub Initialize
   Dim session As New NotesSession
   Dim view As NotesView
   Dim doc As NotesDocument
   Dim sUNID$
   Set view = session.CurrentDatabase.GetView("T1")
   Call view.Refresh
   Set doc = view.GetFirstDocument
   If doc.IsUIDocOpen Then
      sUNID = doc.UniversalID
      Delete doc
      Set doc = session.CurrentDatabase.GetDocumentByUNID(sUNID)
   End If      
   MsgBox doc.F1(0)
End Sub

Ich habe aber noch nicht getestet ob ich mit NotesDocument.IsUIDocOpen auch gemeldet bekomme wenn jemand an einem anderen Arbeitsplatz das Dokument geöffnet hat?
Roland, in meinem Test wird das Dokument aber nur manuell geöffnet also nicht über NotesUIWorkspace.EditDocument.
Das Problem des parallelen Arbeitens am gleichen Dokument ist mir auch klar und ein grundsätzliches Problem in Notes und ggf. nur über Lock-Mechanismen zu lösen.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz