Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: watschn am 25.03.08 - 17:27:12
-
Hallo,
ich habe einen Agent erstellt, der über die @ReplaceSubstring Funktion bestimmte Feldwerte sucht und ersetzt.
Nun habe ich den Agenten auf meine DB losgelassen um eben einige Feldwerte abzuändern. Hat soweit geklappt!
Jetzt zum eigentlichen Problem.
Auf der DB läuft nachts ein weiterer Agent und dieser funktioniert nun nicht mehr. Er kommt bis zum Code
Set maindoc = db.getDocumentByUNID(doc.DocID(0))
dann erscheint die Meldung "Invalid Universal ID" und er bricht ab.
Das Problem tritt eben erst seit Änderung der Feldwerte über die @ReplaceSubstring Funktion auf.
Haben die Änderungen Einfluss auf die Universal ID oder was ist da los? Irgendjemand einen Lösungsvorschlag?
Ich bin leider noch ziemlich neu in Sachen Notes Programmierung. Kann auch gern ausführlicher den Code posten, wenn´s was helfen sollte.
-
Haben die Änderungen Einfluss auf die Universal ID...
Nein. Die ID wird beim Anlegen des Dokumentes vergeben und bleibt immer gleich.
Hast du unter Umständen das Feld DocID geändert? Poste doch mal den gesamten Code des Agenten.
Axel
-
... oder
- werden die Dokumente irgend wohin kopiert und laufen dann mit einer falschen DocID ins leere
- ist das Feld DocID tatsächlich richtig besetzt worden => @Text(@DocumentUniqueID)
- gibt es das Dokument mit der verwendeten UniversalID in deiner Datenbank überhaupt
Toni
-
Danke schonmal für die Hilfsbereitschaft :-)
Ich ändere mit diesem Agenten die Feldinhalte in meinen Dokumenten.
FIELD VKenntnis := @ReplaceSubstring(VKenntnis;"Peter Muster";"Lieschen Müller");
FIELD VErledigung := @ReplaceSubstring(VErledigung;"Peter Muster";"Lieschen Müller");
FIELD VZuarbeit := @ReplaceSubstring(VZuarbeit;"Peter Muster";"Lieschen Müller");
FIELD VBerechtigt:= @ReplaceSubstring(VBerechtigt;"Peter Muster";"Lieschen Müller");
FIELD hVKennzeichen := ("Vorgangskennzeichen123");
SELECT @All
Zweck des ganzen, ich möchte Zugriffsrechte steuern. Der Eintrag „Peter Müller“ soll durch „Lieschen Müller“ ersetzt werden. Das „Vorgangskennzeichen123“ wird gesetzt und löst somit nachts den weiteren Agenten aus, der die Benutzernamen in die betreffenden Autoren und Leserfelder schreibt. Und bei diesem Agenten hakt es jetzt.
Da der Agent sehr umfangreich ist, poste ich mal hier mal den Anfang
Dim i As Integer
Dim m As Integer
Dim n As Integer
Dim p As Integer
Dim z As Integer
Dim s As Integer
Dim c As Integer
Dim db As NotesDatabase
Dim newVals( ) As String
Dim newVals2( 1 To 200 ) As String
Dim newVals3( ) As String
Dim newVals_main() As String
Dim item As NotesItem
Dim item2 As NotesItem
Dim doc As NotesDocument
Dim rdoc As NotesDocument
Dim awdoc As NotesDocument
Dim maindoc As NotesDocument
Dim session As New NotesSession
Dim collection As NotesDocumentCollection
Dim collectionRechte As NotesDocumentCollection
Dim collectionTermin As NotesDocumentCollection
Set db = session.CurrentDatabase
'
Call db.UpdateFTIndex(True) ' aktualisieren des Indexes
' On Error Goto ErrHandler
' Alle neuen bzw. geänderten Vorgänge haben das Zeichen "Vorgangskennzeichen123"
Set collectionRechte = db.FTSearch ( "Vorgangskennzeichen123", 0 )
Set doc = collectionRechte.GetFirstDocument
While Not doc Is Nothing
Redim newVals(200)
Redim newVals3(10)
Redim newVals_main(200)
If doc.IsValid = True Then
'Kennzeichen für geändertes Dokument austragen
doc.hVKennzeichen = ""
Call doc.Save( False, True )
'############################################### Rechtevergabe für Vorgangsdokument bei Erlediger #####################################
doc.hVAutor=""
doc.hVLeser1=""
i = 0
p = 0
z = 1
HIER STEIGT DER AGENT DANN AUS Set maindoc = db.getDocumentByUNID(doc.DocID(0))
If maindoc.IsValid = True Then
'Für Autor:
Forall x In doc.VErledigung
i = i+1
End Forall
If i = 0 Then
'Exit Sub
Else
Set item = doc.GetFirstItem( "hVAutor" )
newVals( z ) = "[V_Ersteller]"
z = z +1
For p = 0 To i -1
newVals( z ) = doc.VErledigung(p)
z = z +1
Next p
Call item.AppendToTextList( newVals )
Call doc.Save( False, True )
End If
Wie gesagt vor der Änderung meiner Feldinhalte ist dieser Agent gelaufen. Also was ist passiert?
-
.. kann es sein, daß du nicht mehr berechtigt bist - du änderst ja Leser und Autorenfelder...?
Du solltest auf jeden Fall in einem Autorenfeld mit deiner Admin-Rolle eingetragen sein...
Toni
-
Aber ich ändere ja nur die Werte in normalen Textfeldern (Feldtyp Name).
Die Autorenfelder werden erst über den 2ten Agenten neu geschrieben und der funktioniert ja nicht.
Die nötige Admin Rolle habe ich auch
-
Dann solltest du mal das Feld DocID prüfen. Ist das Dokument mit der dorthinterlegten ID auch wirklich in der Datenbank vorhanden?
Axel
-
... ich denke es liegt an dem Inhalt des Feldes DocID - dort ist entweder eine falsche DocID hinterlegt oder leer...
Toni
-
Danke für die Tipps, ich komme jedoch nicht weiter.
Wenn ich den Agenten debugge, so wird schon immer eine DocID angezeigt. Allerdings ist das bei jedem Versuch eine andere und ich hab nicht so recht den Überblick welches Dokument das jetzt ist.
Wenn ich mir von der Datenbank aber eine Kopie erstelle un die Anzahl der Dokumente reduziere, so läuft der Agent teilweise ohne Fehlermeldung durch. Kann da aber auch kein System erkennen. Mal geht´s, mal geht´s wieder nicht.... dann scheitert er manchmal an der Bedingung If doc.IsValid = True Then... findet dann eben kein doc
Ich glaube da kommen mehrer Dinge zusammen und mehr fehlt es doch etwas am Durchblick.
Werd jetzt erstmal die Datenbank Rücksichern lassen.
-
... ich habe mir deinen Code mal näher angeschaut.
Du arbeitest mit FTSearch - der bringt dir maximal 5000 Dokumente zurück - und wirklich schneller ist er nur, wenn auch ein Volltext-Index der Datenbank erstellt und aktuell ist - was du in deinem Code zuvor ja machst. Da der Agent nachts läuft würde ich hier auf Nummer sicher gehen und den DB.Search verwenden:
Set collectionRechte = db.Search( {SELECT hVKennzeichen = "Vorgangskennzeichen123"}, Nothing , 0 )
... damit sparst du den Refresh des Volltextindexes zu Beginn deines Agenten. Eventuell kannst du in der Search-Formel auch noch auf DocID != "" filtern...
Mit doc.IsValid prüfst du, ob das Dokument nicht eventuell als Lösch-Stub vorliegt. Dahinter müsste er sich dann das nächste doc greifen - hier fehlt der übrige Code - ich gehe aber mal davon aus, daß du das so machst...
Dann würde ich ein Fehlerhandling mit On Error GoTo ErrorHandle einbauen. Damit kannst du den Fehler dann direkt abfangen - ist das Feld DocID gefüllt etc...
Werden im Verlauf deiner Routine denn auch Dokumente gelöscht?
Toni
-
5.000 Dokumente aber nur, wenn das in den Servereinstellungen so definiert wurde. Können auch weniger sein. ;)
-
... ich hab es prophylaktisch erwähnt - ich arbeite so gut wie nie damit.
Die Begleiterscheinungen lohnen sich nicht so wirklich bei nächtlichen Agenten
- Volltext-Index => Plattenplatz
- und dann eventuell doch nicht alle Dokumente
- und zumal der Feldname ja bekannt ist, denn der Volltextindex würde auch Dokumente finden, in denen der String irgendwie erwähnt wird...
... vielleicht ist ja auch das der Grund für eine leere DocID ::)
Toni
-
Hallo watschn,
arbeitest du möglicherweise mit einer Kopie der Original-Datenbank ? Bei der Erstellung einer Kopie unter Notes erhält jedes kopierte Dokument eine neue UniversalID, aber in den Dokumentenfeldern docid der kopierten Dokumente stehen natürlich noch die ehemals gültigen UniversalIDs drin - und dann ist der Fehler nur allzu leicht erklärlich.
Hat die Datenbank auch eine Vorgabeansicht, in der alle Dokumente stehen, die du referenzierst ?
Was steht überhaupt in dem sagenumwobenen Feld DOCID ? Das heißt: brauchst du dieses Feld überhaupt oder ist es vielleicht vom Typ "BERECHNET" und enthält als Formel nur @TEXT(@DocumentUniversalID) ?
Wenn dort tatsächlich falsch formatierte Dokumenten-Universal-IDs drinstehen, kannst du ja einmal eine Ansicht mit einer sortierten Spalte nach DOCID erstellen und in COURIER als Schriftart ausgeben. Vielleicht siehst du da gleich den Überltäter.
Gruß
Norbert
-
Bei der Erstellung einer Kopie unter Notes erhält jedes kopierte Dokument eine neue UniversalID
... die Betonung muß auf "unter Notes" liegen - bei einer Kopie im Filesystem trifft dies nicht zu, sondern nur bei einer Kopie über Notes. Laut Aussage funktioniert der Code in der Kopie teilweise - und dann wieder nicht. Würde dies zutreffen, was Norbert einbringt, dann dürfte es per DocID nie funktionieren. Es müsste sich also um eine Kopie per Filesystem handeln.
Der andere Weg wäre eine Kopie der Dokumente in eine Test-DB per Copy & Paste. Dann werden UniversalID's behalten, wenn die DocID in dieser Datenbank noch nicht vorhanden ist oder war...
Toni
-
Meine Datenbank läuft jetzt zumindest wieder (Datensicherung sei Dank ;))
Habs zeitlich noch nicht geschafft mich mit den neuen Ratschlägen zu beschäftigen. Werde mich aber nochmal intensiv damit auseinandersetzen und dann hoffentlich zu einer Lösung kommen.
Viel Dank!
-
Mein Problem hat sich erledigt. Ich hatte in meiner DB Karteileichen, also Antwortdokumente ohne Hauptdokument.
-
Der Beitrag 5 von Toni ist der Wichtigste für Dich. Bist du sicher, daß du (und der Server) ALLE Dokumente sehen ? Wenn du dich und den Server mit dem Ändern von Leser- und Autorenfeldern ausschließt, dann hast du morgen das Problem wieder. Dann hast du nicht verwaiste Antwortdokumente, sondern Antwortdokumente, auf deren Hauptdokumente du (und der Server) nicht mehr zugreifen können.
Gruß
Norbert
-
Ich habe in jedem Dokument ein Autorenfeld mit meiner Admin Rolle - Standardwert
Das Problem scheint gelöst zu sein. Wenn´s noch irgendwo hakt, dann weiß ich wo ich nachschaun muss.
Danke für die vielen Tipps :D