Dokument neu vom Server laden

  • Seid gegrüßt!


    Ich habe folgendes Problem: Ich möchte, wenn ein Dokument in den Edit-Modus geschaltet wird, dessen Inhalte neu vom Server laden.


    Wir alle kenne jas die ach so beliebten Speicher-Konflikte, die auftreten, wenn mehrere Benutzer ein Dokument geöffnet haben und dann nacheinander Speichern.


    Das Öffnen von Dokumenten durch mehrere Benutzer möchte ich nicht sperren, in der Default-Einstellung kann jeweils nur ein Benutzer ein Dokument bearbeiten, auch das ist in Ordnung... - Nur eins fehlt: Beim Umschalten in den Edit-Modus müßte man den Inhalt neu laden.


    Alle meine Versuche, dies im Querymodechange oder Postmodechange-Event hinzubekommen schlugen fehl und auch meine Recherchen in den Beiträgen hier haben mich nicht ans Ziel gebracht.


    Bisher kann ich über einen Button einen Agenten starten, der das Dokument schließt und wieder öffnet - anders (mit Reload, Refresh und ReloadWindow) habe ich keine Aktualisierung erreichen können. Beim Event hinterlegt, schließt der Agent aber das Dokument nicht, daher erfolgt auch keine Aktualisierung. Eine Fehlermeldung kommt ebenfalls nicht.


    Es würde mich freuen, wenn jemand Rat wüßte!


    Grüße
    George

  • Nun, reload z.B. laedt das Dok auch nur aus dem Backend neu...nicht von Platte. Mit dem folgenden Code im Querymodechangeevent muesste das von Dir gewuenschte funktionieren.


    Allerdings...nur durch das Laden beim Umschalten bekommt man das Problem der Speicherkonflikte nicht in den Griff. Geht nach wie vor.

  • Hallo dnotes!


    Ich danke Dir für Deine Antwort!
    Also... wie soll ich sagen... leider klappt das mit dem Code aber nicht.
    Das Dokument müßte erst geschlossen und dann geöffnet werden.
    Und unter den Umständen müßte das Ganze in einem Agenten stehen.


    Nur klappt das leider auch nicht. - Der Agent schon, aber nur wenn man ihn mit einem Button aufruft.


    Der Agent sieht dann so aus:



    Grüße
    George

  • Ich hab den Agenten mal etwas aufgeräumt...



    Aber warum schließt der das Dokument nicht, wenn man ihn aus dem Querymodechange-Event startet?


    Über einen Button klappts prima.


    Wenn Du sagst, Reload lädt vom Backend, aber nicht von der Platte... gibt es eine Möglichkeit, ausdrücklich von der Platte bzw. vom Server zu laden? dnotes


    Grüße
    George

    • Offizieller Beitrag

    Mit dem Code funktioniert es bei mir.


    Code
    Sub Querymodechange(Source As Notesuidocument, Continue As Variant)
       Dim ws As New NotesUIWorkspace
       Dim doc As NotesDocument
       Set doc = Source.Document
    
       Call Source.Close
       Call ws.EditDocument(True, doc)
    End Sub


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Hallo Dirk!


    Also dann mache ich da wohl etwas falsch... - oder habe eine andere Domino-Version. Das wäre bei mir 6.5.


    Hast Du ausprobiert, das Dokument nach dem Öffnen von einem anderen Benutzer zu verändern, und Deine Änderungen wurden aktualisiert als Du in den Edit-Mode geschaltet hast? - Also bei mir werden die Änderungen die zwischenzeitlich gemacht wurden nicht aktualisiert.


    Das Dokument scheint bei mir auch nicht geschlossen und wieder geöffnet zu werden, was das ja auch erklären würde.


    Hast Du sonst noch Einstellungen in der Datenbank vorgenommen, oder liegt es an der Domino-Version?


    Grüße
    George

    • Offizieller Beitrag

    das Dokument wird schon geschlossen, aber die Änderungen kommen nicht, da ich das BackEnd-Dokument vom Frontend-Dokument zuweise.


    Solche Probleme habe ich schon mal gehabt, dass das Objekt erst beim Verlassen des Events freigegeben wurde, d.h. auch in ScriptBib war das Object noch vorhanden und ich muste das Event erst verlassen.


    Kann Dir jetzt nicht sagen ob es funktioniert, aber eventuell bringt es was die UNID in die Notes.ini zu schreiben und einen 2.Agenten zu starten, der das Dokument anhand des ini-Parameters wieder öffnet. Der Agent, der im Querymodechange gestartet wird verliert den Fokus auf das Event.


    Gruß
    Dirk

  • Danke für die schnelle Antwort!


    Also das mit der UNID läuft ja ungefähr auf das hinaus, was ich mit meinem Agenten versuche... - wie gesagt, der läuft von einem Button aus gestartet sogar prima.


    Das mit dem Event erst verlassen gestaltet sich schwierig... - ich wüßte nicht, wie ich das Dokument wieder öffnen soll, wenn ich nach dem Schließen den Event, also auch den daraus gestarteten Agenten verlassen muß... - man könnte vielleicht im Terminate einen zweiten Agenten starten und die UNID auslesen, die der Erste hinterlegt hat und das Dokument so wieder öffnen... - dachtest Du daran?


    Ich versuch das mal und berichte über Erfolg oder Mißerfolg!


    Grüße
    George

    • Offizieller Beitrag

    wird im Terminate wahrscheinlich auch nicht funktionieren, dfür bräuchte man einen PostClose.


    Dein Ergebnis würde mich interessieren.


    Gruß
    Dirk

  • Deswegen hatte ich das Dokument ueber die UNID aufgerufen, damit es frisch vom Server geholt wird. Das dachte ich, haette bei Dir geklappt. Und warum muss das aus einem Agenten heraus laufen??

  • Diali
    Ist der Terminate nicht der Postclose? Ich dachte der wäre so zu verstehen.


    Mein bisheriges Ergebnis sieht leider so aus, daß der Code den ich im Terminate hinterlegt habe unter KEINEN Umständen abgearbeitet wird. Wenn ich was neues herausgefunden habe, werde ich es posten.


    dnotes
    Das ganze hat bei mir nur geklappt, wenn ich den Agenten über einen Button aufgerufen habe. Über den Event aufgerufen hat es nicht geklappt.


    Das es aus einem Agenten heraus laufen muß dachte ich aus folgenden Gründen:


    1. Das Dokument muß erst geschlossen und dann wieder geöffnet werden (jedenfalls bis jemand eine Idee hat, wie man es sonst aktualisieren könnte).


    2. Wenn ich das Dokument sofort schließe "uidoc.Close( True )", dann kann ich dahinter keinen Code mehr ausführen, oder aber der Befehl wird ignoriert (bin mir da grad nicht ganz sicher, was passiert).


    3. Wenn ich das Dokument mit uidoc.Close schließe, dann wird der Befehl erst nach dem restlichen Event-Code ausgeführt und ich erreiche nicht, daß das Dokument vor dem Open-Befehl geschlossen ist, somit erfolgt keine Aktualisierung.



    Ganz schön knifflig - finde ich jedenfalls! :hammer:


    Grüße
    George

  • In den Globals der Maske mußt du eine Variable hinterlegen, die die UNID des Dokuments speichert - und eine zweite, ob im TERMINATE etwas geschehen soll. Im QueryModeChange wird die UNID gefüllt (und auch der Schalter gesetzt).


    Im Terminate-Event steht dir vom Dokument nichts mehr zur Verfügung, wohl aber noch etwas von der Maske, mit der du das Dokument aufgerufen hast (nämlich dieser Event). Und von dem aus kannst du einen Agenten aufrufen, der aus den Globals der Maske die UNID des Dokuments kennt und auf den Schalter, ob etwas passieren soll, reagieren kann. Das Problem, das ich sehe, liegt eher darin, daß dir im Terminate-Event kein UserInterface mehr zur Verfügung steht (du kannst z.B. NIE im Terminate debuggen !!)


    Ich kann dir nicht sagen, ob du dir von dort aus einen neuen Workspace aufbauen kannst. Das endet im Zweifelsfall mit einem roten Fenster wegen fehlendem Lookup-Handle.

  • Hallo LN4ever!


    Erstmal muß ich mich berichtigen, das der Terminate-Event nicht stattfindet, war ein Irrtum, aber...


    Das man im Terminate unglücklicherweise nicht Debuggen kann, mußte ich auch feststellen... ganz schön ärgerlich!


    Ich versuche es momentan mit einem Profil-Dokument, in dem ich die UNID hinterlege... das sollte doch wohl auch klappen, oder?
    Allerdings habe ich den Eindruck, daß man im Terminate keinen Agenten starten kann, ich hab mal ein Popup in meinen Agenten eingebaut, welches NICHT aufpoppt, der Agent scheint also gar nicht zu starten.


    Das Problem mit dem User-Interface verstehe ich nicht so recht... liegt es eventuell daran, daß nichtmal ein Popup erscheit? - Ich glaube aber, der ganze Agent wird gar nicht erst gestartet. - Ein Popup direkt im Terminate-Event ist nämlich möglich.
    Also was bedeutet das mit dem User-Interface genau?


    Das alles wirft eine grundsätzliche Frage auf: Kann man im Terminate-Event überhaupt einen Agenten starten?


    Der Code in Terminate sieht wie folgt aus:


    Code
    Sub Terminate
    	Dim ws As New NotesUIWorkspace
    	Dim db As NotesDatabase
    	Dim ag As NotesAgent
    
    	Set db = ws.CurrentDatabase.Database
    	Set ag = db.GetAgent( "OpenDoc" )
    	Call ag.Run
    End Sub


    Grüße
    George

  • Man kann. Ich mache das aus Profildokumenten, die ich parallel als normale und als Profildokumente pflege z.B. mit


    Sub Terminate
    Dim theagent As NotesAgent
    If Gespeichert Then
    If Not IstProfil Then Print "Normales Dokument gespeichert, Dokumentation Profiländerungen"
    Set xsession = New NotesSession
    Set xdb = xsession.CurrentDatabase
    Set theAgent = xdb.GetAgent("(DokuProfilAenderungen)")
    Call theAgent.Run
    Else
    Print "Keine Setup-Änderungen gespeichert"
    End If
    End Sub


    Die Variablen GESPEICHERT und ISTPROFIL werden in QUERYSAVE bzw. POSTOPEN gesetzt und sind in der Maske global definiert.


    Kein User-Interface hast du am PopUp per Agent erlebt. Da ein Popup aus dem Terminate klappt, wirst du dir von dort vermutlich auch einen UIWORKSPACE basteln können (er kann also ein neues User-Interface anlegen ohne abzustürzen). Ein Agent, der ohne UI gestartet wird, kann das nicht (deshalb ging das Popup nicht). Mach eine Messagebox. Wenn du sie siehst, kann er ein UI aufmachen, wenn du sie im Log findest, nicht.

  • LN4ever
    Ich hatte doch glatt einen Tippfehler in meinem Close-Agenten... Und beim Terminate-Event gibts da keine Fehlermeldung und auch sonst keine Reaktion. - Sorry!


    Diali
    Du sagtest, das Ergebnis meiner Bemühungen würde Dich interessieren: Ich denke es ist nicht möglich das über Events zu realisieren, ich hab alles ausprobiert, was mir eingefallen ist.
    Man bräuchte, wie Du sagtest, einen 'PostClose'-Event.


    Also Stand der Dinge ist:
    - Agenten lassen sich von Terminate aus starten
    - Sie können auch Popups ausgeben
    - Sind sie fehlerhaft, passiert unter Umständen einfach gar nichts (evtl. steht was in einer log-Datei?)


    Nun zum unlösbaren Problem:
    Wenn man versucht, das Dokument zu schließen und hinterher noch einen Agenten auszuführen, wird das Schließen immer hinter die Ausführung des Agenten gelegt. (Ich habs im Terminate und im Onunload versucht.)


    Falls es nicht doch noch eine andere Möglichkeit außer Schließen und neu Öffnen gibt, das Dokument direkt vom Server neu geladen zu bekommen, geht das nicht über Events...


    Habt Ihr vielleicht noch einen Trick auf Lager, wie es doch möglich ist?


    Grüße
    George

    • Offizieller Beitrag

    ist zwar nicht die optimale Lösung aber wenn jemand ein Dokument im Lesemodus öffnet, dann darf er es nicht in den EditMode setzen. D.h. im QueryModeChange muss ein Continue = False rein.
    In der Ansicht könnte dann eine Aktion das Dokument in dem EditMode öffnen.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • Am liebsten wäre mir natürlich eine optimale Lösung...


    Aber die Möglichkeit, die Du ansprichst, ist momentan eben das beste, was ich machen kann.
    Der Querymodechange wird 'abgewürgt', wenn auf Edit-Modus geschaltet werden soll. Und das Dokument bekommt einen 'Bearbeiten'-Button, welcher den von mir geposteten Agenten aufruft.
    Wer das Dokument bearbeiten will, muß es über die Ansicht im Edit-Modus öffnen oder den Button drücken... Doppelklick ist dann eben nicht drin. Aber ich denke das ist zumutbar.
    :roll:


    Vielen Dank für Eure Hilfe!


    Grüße
    George