Autor Thema: Client hängt sich im QuerySave auf  (Gelesen 3683 mal)

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Client hängt sich im QuerySave auf
« 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


Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #1 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

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Client hängt sich im QuerySave auf
« Antwort #2 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)

Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #3 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

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Client hängt sich im QuerySave auf
« Antwort #4 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?


Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #5 am: 19.09.18 - 08:30:43 »
Nein.

Offline Gutierrez

  • Aktives Mitglied
  • ***
  • Beiträge: 112
Re: Client hängt sich im QuerySave auf
« Antwort #6 am: 19.09.18 - 10:32:51 »
Set doc = view.GetNextDocument(doc)

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #7 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:
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #8 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

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #9 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.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #10 am: 19.09.18 - 12:59:45 »
Du hast natürlich wahr, Peter - ich habe zu oberflächlich gelesen.

Bernhard

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Client hängt sich im QuerySave auf
« Antwort #11 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	
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Client hängt sich im QuerySave auf
« Antwort #12 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)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz