Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: cash am 19.09.08 - 08:45:15
-
Ich habe eine Datenbank mit Haupt- und Antwortdokumenten. Die Datenbank wird nur von ca. 6 Personen genutzt. Ist also kein Mengenproblem.
Im Antwortdokument sind dort u. a. eingebetete Ansichten mit dem Hauptdokument.
Wenn ein Mitarbeiter das Hauptdokument öffnet und wieder schließt für Notes einen Agenten aus der per Script einige Felder vom Hauptdokument in alle Antwortdokumente erstellt.
Wenn der Mitarbeiter danach das geöffnete Antwortdokument bearbeiten will kommt es beim Speichern zu konflikten.
Wie verhindere ich diese Konflikte am besten?
Dies passiert auch nur bei einen bestimmten Antwortdokument mit der Maske "Kommision" bei den anderen Antwortdokumenten (Maske "Gutachten") kann das nicht passieren, weil diese nicht bearbeitet werden können). Bei der Maske "Kommision müßte das Hauptdokument auch nichts aktualisieren bei den anderen schon
Eine Möglichkeit wäre also die Maske Kommission auszuschließen. Die andere vor dem Bearbeiten bzw Speichern das Dokument zu aktualisdieren. Welches ist die bessere?
Gruß
Thomas
Hier mal der Script im Agenten:
Sub Initialize
On Error Goto hell
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim agent As NotesAgent
Dim respdoc As NotesDocument
Dim parent As NotesDocument
Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set parent = db.GetDocumentByID(agent.ParameterDocID)
'Set parent = db.GetDocumentByUNid(Source.Document.ParentDocumentUNID) ´wenn der Script im Queryclose ist
Set dc = parent.Responses
If dc.count > 0 Then
Print "Script läuft"
Call dc.StampAll( "leser_response" , parent.leser_response )
End If
Exit Sub
hell:
Print {error #} & Cstr(Err()) & { } & Error() & { in line } & { } & Cstr(Erl())
Exit Sub
End Sub
-
du hast das Dokument geöffnet und veränderst, während es geöffnet ist, das Backenddokument.
Call dc.StampAll( "leser_response" , parent.leser_response )
Das muss einen Speicherkonflikt geben.
also die Frontend- und Backendaktionen sauber voneinander trennen und jeweils abspeichern.
grüsse
Dau-in
-
Im Antwortdokument sind dort u. a. eingebettete Ansichten mit dem Hauptdokument.
Wenn ein Mitarbeiter das Hauptdokument öffnet und wieder schließt führt Notes einen Agenten aus, der per Script einige Felder vom Hauptdokument in alle Antwortdokumente erstellt.
Wenn der Mitarbeiter danach das geöffnete Antwortdokument bearbeiten will kommt es beim Speichern zu konflikten.
Wie verhindere ich diese Konflikte am besten?
Option a) Antwortdokument schließen, bevor die Werte darin umgeschossen werden
Option b) Antwortdokument neu laden, nachdem die Werte im Backend (Agent) umgeschossen wurden. Alle bisherigen Änderungen im Frontend gehen dabei aber verloren.
Bitte achte etwas genauer auf Deine Rechtschreibung. Zumindest in den Fällen, wo sie sinnverzerrend/sinnzerstörend sind. Danke!
-
Da wäre mir Option B am liebsten nur wie mache ich das?
Das geöffnete Dokument befindet sich im Moment wo der Agent läuft im Lese-Modus.
Erst danach drücken die Benutzer den Button "Bearbeiten"
@Command([EditDocument];1);
@PostedCommand([ViewRefreshFields]);
Nur das Refresh bringt leider nichts....
Gruß
Thomas
-
ich weiss nicht, obs funzt: die UNID in eine Variable auslesen, dok schliesssen und mit
@Command( [OpenDocument] ; writeOrReadOnly ; UNID ; width : height)
wieder holen
grüsse
Dau-in
-
Da wäre mir Option B am liebsten nur wie mache ich das?
Das geöffnete Dokument befindet sich im Moment wo der Agent läuft im Lese-Modus.
Erst danach drücken die Benutzer den Button "Bearbeiten"
@Command([EditDocument];1);
@PostedCommand([ViewRefreshFields]);
Nur das Refresh bringt leider nichts....
Gruß
Thomas
änder mal die Reihenfolge
du gehst ja erst in den Editiermodus und aktualisierst dann
@Command( [ReloadWindow] )
und dann editieren?
-
mit Reloadwindow funktioniert leider auch nicht....
habe das Dokument mal komplett geschlossen mit:
_DocID := @Text(@DocumentUniqueID);
@Command([FileCloseWindow]);
@Command ([OpenView]; "Alle");
@Command([OpenDocument];"1";_DocID);
@Command ([OpenView]; "Alle");
@Command ([FileCloseWindow])
Dann schließt er das Dokument zwar öffnet es aber komischerweise nicht im Bearbeitenmodus...
Wenn ich anschließend mit Doppelklick in den Edit-Mode gehe kommt beim speichern weiterhin die Fehlermeldung....
Gruß
Thomas
-
Wenn du das Antwortdokument nur vom Hauptdokument in einer Dialogbox öffnen kannst, kann dir das nicht passieren. Ist das vielleicht Dein Weg ?
Gruß
Norbert
-
das funktioniert leider nicht. Zumal die Felder die im besagten Antwortdokument (Kommision) enthalten sind nicht im Hauptdokument vorkommen. Außerdem kann das Antwortdokument nur von sehr wenigen Mitarbeitern gelesen werden während das Hauptdokument von allen zu lesen ist.
Ich komme irgendwie nicht weiter mit meinen Problem. Vermutlich wäre immer noch das beste einfach dieses Antwortdokument aus der Aktualisierung herauszulassen nur weiß ich leider nicht wie.
Hat vielleicht noch einer einen Tipp für mich was ich mir in der Designer Hilfe nochmal intensiv durchlesen sollte?
Gruß
Thomas
-
Kurze Frage, hast du beim deinen Masken Merge/Conflicts eingeschaltet ? Wenn du nicht gerade mit dem Agenten die Felder veränderst die du im UI hast , sollte dein Problem gelöst sein.
-
ja das habe ich eingestellt ohne Erfolg...
Habe jetzt mein Script mal umgeschrieben nun stampe ich nicht mehr alle Antwortdokumente aufeinmal sondern einzeln. Wie kann ich jetzt dort die Antwortdokument mit der Form "Kommision" ausschließen?
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim agent As NotesAgent
Dim respdoc As NotesDocument
Dim parent As NotesDocument
Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set parent = db.GetDocumentByID(agent.ParameterDocID)
'Set parent = db.GetDocumentByUNid(Source.Document.ParentDocumentUNID) 'wenn der Script im Queryclose ist
Set dc = parent.Responses
Set doc = dc.GetFirstDocument()
If dc Is Nothing Then
Print {error #} & Cstr(Err()) & { } & Error() & { in line } & { } & Cstr(Erl())
Exit Sub
End If
While Not(doc Is Nothing)
Call doc.ReplaceItemValue("leser_response", parent.leser_response)
Call doc.Save( True, False )
Set doc = dc.GetNextDocument(doc)
Wend
End Sub
Gruß
Thomas
-
if not doc.form(0) = "blabla" then
end if
?
-
jau Super... Klappt und es kommen auch anscheinend keine Konflikte mehr.
Wobei ich das vermutlich erst in ein paar Wochen wirklich sagen kann....
Die ersten beiden Tests verliefen zumindst positiv....
Vielen Dank
Thomas