Autor Thema: Problem: LotusScript Agent bearbeitet zu viele Dokumente  (Gelesen 4616 mal)

Offline uka

  • Frischling
  • *
  • Beiträge: 4
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.
« Letzte Änderung: 30.06.11 - 15:31:07 von uka »

klaussal

  • Gast
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #1 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 ?

Offline m3

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.102
  • Geschlecht: Männlich
  • Non ex transverso sed deorsum!
    • leyrers online pamphlet
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #2 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).
HTH
m³ aka. Martin -- leyrers online pamphlet | LEYON - All things Lotus (IBM Collaborations Solutions)

All programs evolve until they can send email.
Except Microsoft Exchange.
    - Memorable Quotes from Alt.Sysadmin.Recovery

"Lotus Notes ist wie ein Badezimmer, geht ohne Kacheln, aber nicht so gut." -- Peter Klett

"If there isn't at least a handful of solutions for any given problem, it isn't IBM"™ - @notessensai

Glombi

  • Gast
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #3 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


Offline uka

  • Frischling
  • *
  • Beiträge: 4
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #4 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



 
« Letzte Änderung: 04.07.11 - 11:41:17 von uka »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #5 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

Offline uka

  • Frischling
  • *
  • Beiträge: 4
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #6 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
« Letzte Änderung: 04.07.11 - 11:54:31 von uka »

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #7 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 ...

Offline uka

  • Frischling
  • *
  • Beiträge: 4
Re: Problem: LotusScript Agent bearbeitet zu viele Dokumente
« Antwort #8 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ß  :)


 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz