Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: uka am 30.06.11 - 15:28:53

Titel: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: uka am 30.06.11 - 15:28:53
Hallo allerseits,

ich lese hier schon seit einiger Zeit mit und habe auch schon häufig meine Lösungen gefunden. Nun bin ich jedoch bei einem Problem wo ich so nicht weiter komme. Ich hoffe das mir jemand den (hoffentlich einfachen) Fehler aufzeigen kann.

Es geht um einen Script-Agenten (Lotus) der Dokumente an User verteilt (beim ausführen an den User der Ihn ausführt).
Soll: er soll nur 1 Dokument zuteilen.
Ist: er teilt 3 Dokumente zu.

Was mache ich falsch  ??? ( Script siehe unten )

Vielen Dank schon mal im voraus - Gruß uka.

Das Script:
Code
Option Public
Sub Initialize
     REM Dieser Agent schreibt in ein Leserfeld und ins Agentenfeld der Kundenadresse den Usernamen der ausführenden Person
     Dim sess As New notessession
     Dim db As notesdatabase
     Dim vw As notesview
     Dim doc As notesdocument
     Dim user As String
     REM ********************************************************* Erweiterung für manuelle Zuteilung ****************************
     Dim konfvw As notesview
     Dim konfdoc As notesdocument
     REM ********************************************************* ENDE Erweiterung für manuelle Zuteilung ****************************
     REM Objekte zuweisen
     Set db = sess.currentdatabase
     Set vw = db.getview("zuteilen")
     Set doc = vw.Getnthdocument(1)
     REM ***************************************************** Erweiterung für manuelle Adresszuteilung **********************************
     Set konfvw = db.getview("Konfiguration")
     Set konfdoc = konfvw.getfirstdocument()
     REM Finden des Konfigurationsdokuments in dieser DB
     If Not(konfdoc Is Nothing) Then
          REM Prüfen, ob manuelle Zuteilung aktiviert wurde
          If konfdoc.zuteilung(0) = "Ja" Then Exit Sub
     End If
     REM ********************************************************* ENDE Erweiterung für manuelle Zuteilung ****************************     
     REM Solange doc objekt vorhanden sind und noch keine zuteilung von einem Datensatz vorgenommen wurde
     While Not(doc Is Nothing)And(boolmark = False)
          REM Versuchen backend in leserfeld usernamen zu schreiben
          user = sess.username
          If (doc.agent(0)<> "NICHT ZUGETEILT") Then
               Call vw.refresh()
               boolmark = False
          Else
               Call doc.replaceitemvalue("Agent",user)
               REM Versuchen Dokument zu speichern
               boolmark = doc.save(False,False)
          End If
          If (boolmark = False) Then
	          Set doc = vw.Getnthdocument(1)
          End If
     Wend
End Sub

Edit:

Wenn ich anstelle des vw.Getnthdocument(1) nun vw.Getfirstdocument() einsetze, ist es der gleiche Effekt.
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: klaussal am 30.06.11 - 15:43:59
1) Würde ich mal den Debugger bemühen.

2) Ändert sich durch die Mimik evtl. die Anzahl der Doks in der View ?
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: m3 am 30.06.11 - 15:46:43
1) GetNthDocument ist ein Performancekiller ohne gleichen
2) Würde ich nicht über eine View iterieren, die sich durch Deine Aktionen ändert

Daher:
Dokumente der View in eine Collection holen (AllDocuments Property) und dann über die Collection mit GetFirst und GetNext iterieren (Beispiele gibts in der Designer-Hilfe).
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: Glombi am 30.06.11 - 15:55:50
1) GetNthDocument ist ein Performancekiller ohne gleichen
Das wollen viele nicht glauben oder wissen es gar nicht. Hier habe ich was nettes dazu gefunden. Und wenn Bob es sagt, dann ist das so! ;-)

http://www.lotusgeek.com/LotusGeek/LotusGeekBlog.nsf/d6plinks/ROLR-7HHPER

Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: uka am 04.07.11 - 10:44:39
Hallo,

erst einmal danke für die Antworten, die ich jetzt mal durchgehe:

@klauss
1. Der Debugger läuft ohne Fehler oder falsche Anzeigen durch (nur mit den Inhalten von einem Dokument).
2. Durchaus, wenn das Dokument dann einem Bearbeiter zugeteilt wurde, verschwindet es aus der Ansicht "zuteilen".

@m3 und Glombi
1. Dieses Script arbeitet (mit dieses Problemen) schon seit Jahren im Unternehmen. Die Performance-Frage ist hier eher vernachlässigbar, da wir einen Server(oversized) nur für diese Art von Datenbanken haben ... welcher insgesamt von 5-6 Leuten am Tag genutzt wird (Domino 8.5.2, 2x Xeon 6-Kerner, 16GB Ram).
2. Ich habe es nun mit deinem Tipp probiert, jedoch muss ich gestehen das ich bis auf Fehlermeldungen nichts mit dem Umschreiben erreiche. Dazu muss ich sagen, ich habe kaum Erfahrung mit LotusScript - nur das was ich mir ableiten kann und was die Hilfe hergibt.

Kannst du mir vielleicht noch einen Tipp geben, wie ich das Script evtl. umschreiben kann?

Dank & Gruß

Edit:

So zum Beispiel diese Script-Version:
- teilt nur noch 1 Dokument zu
- hat jedoch 2x Type Mismatch ( doc = collcetion.getfirstentry )
- holt immer das gleiche Dokument hoch

Code
Option Public
Sub Initialize
     REM Dieser Agent schreibt in ein Leserfeld und ins Agentenfeld der Kundenadresse den Usernamen der ausführenden Person
     REM wird aufgerufen vom Agent (anrufenCall)
     Dim sess As New notessession
     Dim db As notesdatabase
     Dim vw As notesview
     Dim doc As notesdocument
     Dim user As String
     Dim collection As NotesViewEntryCollection 
     REM ********************************************************* Erweiterung für manuelle Zuteilung ****************************
     Dim konfvw As notesview
     Dim konfdoc As notesdocument
     REM ********************************************************* ENDE Erweiterung für manuelle Zuteilung ****************************
     REM Objekte zuweisen
     Set db = sess.currentdatabase
     Set vw = db.getview("zuteilen")
     Set collection = vw.Allentries
	 Set doc = collection.getfirstentry
	REM ***************************************************** Erweiterung für manuelle Adresszuteilung **********************************
     Set konfvw = db.getview("Konfiguration")
     Set konfdoc = konfvw.getfirstdocument()
     REM Finden des Konfigurationsdokuments in dieser DB
     If Not(konfdoc Is Nothing) Then
          REM Prüfen, ob manuelle Zuteilung aktiviert wurde
          If konfdoc.zuteilung(0) = "Ja" Then Exit Sub
     End If
     REM ********************************************************* ENDE Erweiterung für manuelle Zuteilung ****************************     
     REM Solange doc objekt vorhanden sind und noch keine zuteilung von einem Datensatz vorgenommen wurde
     If Not doc.form(0) = "Kunde" Then Exit Sub   
     While Not(doc Is Nothing)And(boolmark = False)
          REM Versuchen backend in leserfeld usernamen zu schreiben
          user = sess.username
          If (doc.agent(0)<> "NICHT ZUGETEILT") Then
          	  Call vw.Refresh()
	          Set doc = collection.getfirstentry
	          boolmark = False
          Else
               Call doc.replaceitemvalue("Agent",user)
               REM Versuchen Dokument zu speichern
               boolmark = doc.save(False,False)
          End If
     Wend
End Sub



 
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: Peter Klett am 04.07.11 - 11:22:46
Zum Thema Performancekiller:

So lange man nur das erste Dokument mittels GetNthDocument (1) holt, stellt das keinen Unterschied zu GetFirstDocument dar. Der Performance-Unterschied kommt erst bei höheren Zahlen. Vermutlich arbeitet die Routine intern auch mit Routinen wie GetFirstDocument und GetNextDocument, vielleicht sinngemäß so (nur von der Logik, nicht von der Syntax):

Function GetNthDocument (nr As Long) As NotesDocument
   Set doc = view.GetFirstDocument
   For i = 1 to nr
      Set doc = view.GetNextDocument (doc)
   Next i
   Set GetNthDocument = doc
End Sub

Dass das nicht schnell gehen kann, ist wohl eindeutig.

Ich hatte vor vielen Jahren mal einen Performancevergleich mit 3.000 Dokumenten gemacht und keinen wesentlichen Unterschied festgestellt. Seither hatte ich intensiv GetNthDocument genutzt. Bis ich mal bei über 50.000 Dokumenten in das totale Performanceloch gefallen bin, daraufhin habe ich GetNthDocument aus meinem Wortschatz gestrichen.

Zu Deiner Lösung:

Du hast eine Ansicht, in der alle zuzustellenden Dokumente sind. Du greifst Dir das erste und prüfst, ob das zugestellt wurde. Falls ja, refreshst Du die Ansicht und holst Dir wieder das erste Dokument, solange, bis Du keines mehr findest.

Wenn man sich ganz viel Mühe gibt, geht das wahrscheinlich auch noch komplizierter.

Warum holst Du Dir nicht alle Dokumente, die nicht gesendet wurden, als NotesDocumentCollection (mittels NotesDatabase.Search) und arbeitest diese Dokumente von oben nach unten ab?

Als Gerüst etwa so

....
Dim col As NotesDocumentCollection
Set col = db.Search (|Form = "DeineForm" & Agent = "NICHT ZUGETEILT"|, Nothing, 0)
Dim doc As NotesDocument
Set doc = col.GetFirstDocument
Do While Not doc Is Nothing
   'doc senden, markieren, speichern
   Set doc = col.GetNextDocument (doc)
Loop
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: uka am 04.07.11 - 11:51:59
Dim col As NotesDocumentCollection
Set col = db.Search (|Form = "DeineForm" & Agent = "NICHT ZUGETEILT"|, Nothing, 0)
Dim doc As NotesDocument
Set doc = col.GetFirstDocument
Do While Not doc Is Nothing
   'doc senden, markieren, speichern
   Set doc = col.GetNextDocument (doc)
Loop

Hallo,

mit diesem Script bleiben weiterhin 2 Probleme bestehen:
- "illegale executable code at the modul level" und daraus resultierende Fehlermeldung
- holt auch dieses Script immer das gleiche Dokument hoch

Es ist angedacht das immer das nachfolgende Dokument hochgeholt wird ( damit eine gleichmäßige Bearbeitung gegeben ist und nicht an einem Tag 2 Kunden abgearbeitet werden und der Rest nicht angefast wird). Bei dem Grund-Script wird dies über die Ansicht gemacht, indem nach dem Änderungsdatum sortiert wird.

Gruß & Dank
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: Peter Klett am 04.07.11 - 11:58:18
In welchem Kontext läuft die Routine? Periodischer Agent? Welche Rechte auf die Datenbank hat der Agentenunterzeichner? Welche Rechte hat der Unterzeichner bzgl. periodischer Agentenausführung? An welcher Stelle erfolgt die Fehlermeldung -> Debugger? Wie sieht der komplette Code aus? ...

Meine Glaskugel macht Urlaub im Süden, die hat die Nase voll vom dauernden Regen ...
Titel: Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
Beitrag von: uka am 04.07.11 - 12:24:30
In welchem Kontext läuft die Routine? Periodischer Agent? Welche Rechte auf die Datenbank hat der Agentenunterzeichner? Welche Rechte hat der Unterzeichner bzgl. periodischer Agentenausführung? An welcher Stelle erfolgt die Fehlermeldung -> Debugger? Wie sieht der komplette Code aus? ...

Meine Glaskugel macht Urlaub im Süden, die hat die Nase voll vom dauernden Regen ...
@Peter Klett
-> Der Agent wird durch den User ausgelöst ( Gemeinsamer Agent ), Signiert ist er von einen Administrator mit Vollzugriff.
-> Die Fehlermeldung kommt direkt sobald man drauf Klickt einmal, dann läuft er jedoch durch ( der Designer meckert ja auch, das hier ein Fehler im Script ist)

Aber:

Manchmal liegt die Lösung vor den Augen und doch so fern .. die Lösung (mit dem alten Script von oben) :
In einem anderen Script-Agenten war eine Schleife enthalten, die solange durchlief bis die Anzahl von zugeteilten Dokumenten des Users 3 war. 

(Herausgefunden durch die Umbenennung des Agenten  ::) )

Vielen Dank nochmal und Gruß  :)