Autor Thema: Problem mit Universal ID nach Datenänderung mit @ReplaceSubstring  (Gelesen 4938 mal)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.


Offline Axel

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... 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
Grüßle Toni :)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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?

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
.. 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
Grüßle Toni :)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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


Offline Axel

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Dann solltest du mal das Feld DocID prüfen. Ist das Dokument mit der dorthinterlegten ID auch wirklich in der Datenbank vorhanden?


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... ich denke es liegt an dem Inhalt des Feldes DocID - dort ist entweder eine falsche DocID hinterlegt oder leer...

Toni
Grüßle Toni :)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.

« Letzte Änderung: 26.03.08 - 16:23:34 von watschn »

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... 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

Grüßle Toni :)

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
5.000 Dokumente aber nur, wenn das in den Servereinstellungen so definiert wurde. Können auch weniger sein. ;)
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

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... 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
Grüßle Toni :)

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
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
Situs vilate in isse tabernit.

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Zitat
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
Grüßle Toni :)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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!

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
Mein Problem hat sich erledigt. Ich hatte in meiner DB Karteileichen, also Antwortdokumente ohne Hauptdokument.
« Letzte Änderung: 01.04.08 - 16:37:44 von watschn »

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
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
Situs vilate in isse tabernit.

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz