Domino 9 und frühere Versionen > ND8: Entwicklung

Problem: LotusScript Agent bearbeitet zu viele Dokumente

(1/2) > >>

uka:
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
--- Ende Code ---

Edit:

Wenn ich anstelle des vw.Getnthdocument(1) nun vw.Getfirstdocument() einsetze, ist es der gleiche Effekt.

klaussal:
1) Würde ich mal den Debugger bemühen.

2) Ändert sich durch die Mimik evtl. die Anzahl der Doks in der View ?

m3:
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).

Glombi:

--- Zitat von: m3 am 30.06.11 - 15:46:43 ---1) GetNthDocument ist ein Performancekiller ohne gleichen

--- Ende Zitat ---
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

uka:
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
--- Ende Code ---



 

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln