Hallo,
ich muss leider nochmals nerven. :-\
Wenn ich im QuerySave der Kalender-Maske das folgende Script einfüge (nach der Prüfung von source.IsNewDoc), dann hängt sich mein Notes Client auf und ich muss den Task abschießen. Auch wenn ich vorher das Lotusscript-Debugging einschalte. Das Debug-Fenster öffnet sich erst gar nicht.
Die zu öffnende DB existiert, Berechtigungen sind vorhanden, nur die beiden Felder RoomName (Text) und RoomInformation (Richtext), ein einziger Eintrag gespeichert.
(Nebenbei: Es ist für mich etwas irritierend, dass hier keine Variablendeklaration erfolgen muss und daher leicht Schreibfehler übersehen werden können.)
Mag da einer von Euch nochmal drüberschauen und meine Schnitzer aufzeigen?
Set item = source.Document.GetItemValue("Room")
Set db = session.GetDatabase("Server/SRV/Gruppe", "Pfad/confnames.nsf", False)
If Not db.IsOpen Then Call db.Open("", "")
Set view = db.GetView("MyView")
Set doc = view.GetFirstDocument
While Not (doc Is Nothing)
If item.text = doc.RoomName Then
mytext = doc.RoomInformation
Set item2 = source.Document.ReplaceItemValue( "Body", mytext )
Call source.Document.Save(True, False, False)
End If
doc = view.GetNextDocument(doc)
Wend
Danke für den Hinweis.
Ich habe die Zeile(n) geändert, aber der Client hängt sich noch immer auf.
Ist halt blöd, wenn der Compiler nicht meckert und der Client beim Aufruf nicht einfach eine Fehlermeldung rauswirft.
So ist das nervig, den Client immer wieder über den Taskmanager abzuschießen und neu zu starten.
Zeile ist wie folgt geändert (item als Variablenname ist natürliich nicht mehr passend)
item = source.Document.GetItemValue("Room")(0)
Guten Morgen,
ich hatte die Zeile auch geändert gehabt:
If item = doc.RoomName Then
Und doc.RoomName ist ein von mir in der eigenen Anwendung erstelltes Feld vom Typ Text. Damit sollte es doch theoretisch passen, oder?
Bau ein Errorhandling ein, das hilft Fehler zu finden:
On Error Goto errorz
'-- CODE
Goto endeZ
errorZ:
Print "Ein Fehler in " & Getthreadinfo(1) & " Zeile:" & Erl & " Code:" & Err & " Fehler:" & Error
Resume endez
endeZ:
Set doc = view.GetNextDocument(doc)
Danke Dir. Das ist mir mittlerweile auch aufgefallen, nachdem ich das zum Testen in einen Agenten gepackt habe.
Da konnte ich dann auch wenigstens den Debugger starten.
Im Agenten funktioniert jetzt alles und übertragen in das QuerySave hängt der Notes Client jetzt auch nicht mehr.
Allerdings war raum immer leer. Offenbar ist das Feld erst nach dem Speichern (durch den RnrMgr?) gepflegt.
Daher dann "RoomToReserve". Das musste vor dem Vergleich noch umkonvertiert werden.
Soweit so gut, aber... sobald auch nur irgendetwas nicht passt... sei es Zugriffsberechtigung auf die DB oder View nicht gefunden oder sonstwas... hängt der Client sich weg.
Ich hab daher noch ein ErrorHandling eingebaut, der im Falle eines Fehlers meinigen Code einfach überspringt.
Natürlich ist es an sich unsinnig, per Schleife durch alle Einträge zu laufen, auch wenn bereits einmal gefunden wurde. Man könnte hier theoretisch eine Suche einbauen oder zumindest die Schleife (vorzeitig) beenden, aber bei maximal 10 Einträgen wird es wohl keinen spürbaren Unterschied machen.
Der aktuelle Code-Schnipsel:
Dim nam As NotesName
raumname = source.Document.GetItemValue("RoomToReserve")(0)
Set db = session.GetDatabase("server/SRV/Gruppe", "Database.nsf", False)
If Not db.IsOpen Then Call db.Open("", "")
Set view = db.GetView("MyView")
Set doc = view.GetFirstDocument
Set nam = session.createName(raumname)
raum = nam.Abbreviated
While Not (doc Is Nothing)
raum2 = doc.Getitemvalue("RoomName")(0)
Print raum & " = " & raum2
If raum = raum2 Then
mytext = doc.RoomInformation
If source.Document.HasItem("Body") Then
Call source.Document.RemoveItem("Body")
End If
Call source.Document.AppendItemValue("Body", mytext)
Call source.Document.Save(True, False, False)
End If
Set doc = view.GetNextDocument(doc)
Wend
Bei 10 Dokumenten ist das vielleicht nicht das Problem, aber ...
Das Teil funktioniert dann ganz gut und ist für die nächste Änderung die Kopiervorlage, da enthält die Ansicht plötzlich ganz viele Dokumente. Oder Ihr kauft ein Hotel und verwaltet die Räume davon über das gleiche Tool.
Außerdem hat man doch eine gewisse Ehre zu verteidigen, oder?
Zwei Ansätze zur Optimierung:
Wenn die Ansicht nicht geändert werden kann, suche über eine NotesDocumentCollection
Dim col As NotesDocumentCollection
Set col = db.Search (|Form = "deineMaske" & RoomName = "| & raumname & |" & !@IsAvailable ($CONFLICT)|, Nothing, 0)
If col.Count = 1 Then
Set doc = col.GetGirstDocument
...
End If
Schneller ist eine Ansicht, erste Spalte enthält RoomName, sortiert. Selbstverständlich ist solch eine Ansicht versteckt, damit nicht irgendjemand die sichtbare Ansicht geändert haben möchte, wodurch die Anwendung hinten herunterfällt
Set doc = view.GetDocumentByKey (raumname, True)