Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: schroederk am 18.09.18 - 14:32:26

Titel: Client hängt sich im QuerySave auf
Beitrag von: schroederk am 18.09.18 - 14:32:26
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?

Code
	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


Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: koehlerbv am 18.09.18 - 15:48:59
Kurzer Blick: Diese Zeile

Set item = source.Document.GetItemValue("Room")

ist schon mal falsch: NotesDocument.GetItemValue gibt die Inhalte des Items "Room" zurück und kein Objekt vom Typ NotesItem (siehe Deine weitere Verwendung von item).

Das kann dann schon zum Knall führen.

Bernhard
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: schroederk am 18.09.18 - 16:39:55
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)

Code
item = source.Document.GetItemValue("Room")(0)

Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: koehlerbv am 18.09.18 - 16:58:07
Schreib mal in die Options der Maske (Global) ein Option Declare.

Dann sollte die Zeile auch gleich Quieken:
If item.text = doc.RoomName

item ist bei Dir nach der Änderung nun String. Der hat keine Property "Text". Und doc.Room ist ein Array, also ungleich String.
doc.Room (0) wäre hier analog korrekter gewesen.

Bernhard
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: schroederk am 19.09.18 - 08:11:45
Guten Morgen,

ich hatte die Zeile auch geändert gehabt:

Code
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?


Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: koehlerbv am 19.09.18 - 08:30:43
Nein.
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: Gutierrez am 19.09.18 - 10:32:51
Set doc = view.GetNextDocument(doc)
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: jBubbleBoy am 19.09.18 - 11:05:47
Bau ein Errorhandling ein, das hilft Fehler zu finden:
Code
On Error Goto errorz

'-- CODE

  Goto endeZ
errorZ: 
  Print "Ein Fehler in " & Getthreadinfo(1) & " Zeile:" & Erl & " Code:" & Err & " Fehler:" & Error 
  Resume endez
endeZ:
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: koehlerbv am 19.09.18 - 11:35:58
Ausserdem:

mytext = doc.RoomInformation 0

Vor allem aber:
In einer Schleife werden alle Dokumente deer View "MyView" durchlaufen und bestimmte Inhalte in ein Item des Frontenddokuments gepumpt. Das ist Quatsch, denn dann steht dort am Ende der Inhalt aus dem letzten Dokument der View. Dann kann man sich gleich die Schleife sparen und nur GetLastDocument hernehmen.

"Body" klingt (zumindest üblicherweise) nach einem RichTextItem. Das wird dann durch einen skalaren Wert vom Typ String plattgemacht. Klingt nicht nach dem Sinne des Erfinders.

Bernhard
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: Peter Klett am 19.09.18 - 12:08:58
Bernhard, grundsätzlich einig, aber es wird die gesamte Ansicht durchgegangen und der Inhalt aus dem Dokument genommen, bei dem RoomName zu Room des Ursprungsdokuments passt.

Ein view.GetDocumentByKey (..., True) wäre da wesentlich performanter, wenn die Ansicht in der ersten Spalten nach RoomName sortiert wäre.
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: koehlerbv am 19.09.18 - 12:59:45
Du hast natürlich wahr, Peter - ich habe zu oberflächlich gelesen.

Bernhard
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: schroederk am 19.09.18 - 14:01:16
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:
Code
	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	
Titel: Re: Client hängt sich im QuerySave auf
Beitrag von: Peter Klett am 19.09.18 - 15:40:57
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

Code
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

Code
Set doc = view.GetDocumentByKey (raumname, True)