Domino 9 und frühere Versionen > ND8: Entwicklung

Ein Dokument finden und einen Wert hinterlegen

(1/2) > >>

Klafu:
Guten Morgen zusammen,

ich hab eine kleine Bitte:
Ich hab zwei Dokumente in denen das Feld "A" steht, das den selben Inhalt hat. Da sich der Inhalt von Feld "A" aber ändern kann und die Dokumente aufeinander basieren, möchte ich eine Beziehung zwischen den beiden Dokumenten herstellen. Dazu würde ich ein Feld "B" (mit dem Inhalt @Unique) aus dem einen Dokument ins andere übernehmen wollen.

Da ich hierbei nichts falsch machen will - sprich: es sollten keine Fehler auftreten und keine Werte in ein falsches Dokument geschrieben werden - dachte ich, ihr könnt mir Tipps geben, ob mein Code passt und wo ich noch Fehler unterbinden kann - also, nur um auf Nummer sicher zu gehn.

Zu jedem Dokument kann es nur ein einziges, passendes "Partnerdokument" geben.


--- Code: ---Dim session As NotesSession
Dim doc As NotesDocument
Dim doc2 As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Dim view2 As NotesView
Dim speicher As Boolean
Dim Askme As Variant
Dim i As integer

Sub Initialize()
Set session = New NotesSession
Set db = session.CurrentDatabase
Set view = db.Getview("Personenuebersicht")
Set view2 = db.GetView("vUsername")
Set doc = view.Getfirstdocument()
i = 1
Do While Not doc Is nothing
If doc.form(0) = "Person" then
Set doc2 = view2.getdocumentbykey(doc.txtUsername)
If Not doc2 Is Nothing then
If doc2.form(0) = "mUserName" Then
doc2.UserNameID = doc.ID
speicher = doc2.Save(True, False )
Print i
i= i+1
Else
Print "Kein passendes Dokument gefunden"
End if
End If
End If
Set doc = view.Getnextdocument(doc)
Loop
End Sub
--- Ende Code ---

Chris

Peter Klett:
Do While Not doc Is nothing
   If doc.form(0) = "Person" then
      Set doc2 = view2.getdocumentbykey(doc.txtUsername (0), True) 'exakte Suche
      If Not doc2 Is Nothing then
         If doc2.form(0) = "mUserName" Then 'die Ansicht darf keine anderen Dokumente zurückgeben
            doc2.UserNameID = doc.ID
            speicher = doc2.Save(True, False )
            Print i
            i= i+1
         Else
            Print "Kein passendes Dokument gefunden"
         End if
      End If
   End If
   Set doc = view.Getnextdocument(doc)
Loop

Du hast nicht abgefangen, dass es evtl. schon mehrere passende Dokumente geben könnte. War aber auch nicht die Aufgabe (?). Ich gehe auch davon aus, dass der Agent nachträglich einmal laufen soll und zukünftig das ID-Feld bei Dokumenterstellung gesetzt wird.

Mit @Unique meintest Du sicherliche @DocumentUniqueID

Klafu:

--- Zitat von: Peter Klett am 03.02.12 - 10:17:03 ---Du hast nicht abgefangen, dass es evtl. schon mehrere passende Dokumente geben könnte. War aber auch nicht die Aufgabe (?).

--- Ende Zitat ---
Mir ging es dabei eher darum, dass Der Wert von Feld "A" aus Dokument 1 nicht in mehrere Dokumente gesetzt wird sondern immer aus dem aktuellen Dok frisch geladen wird.


--- Zitat von: Peter Klett am 03.02.12 - 10:17:03 ---Ich gehe auch davon aus, dass der Agent nachträglich einmal laufen soll und zukünftig das ID-Feld bei Dokumenterstellung gesetzt wird.

--- Ende Zitat ---
Richtig. Der Agent läuft einmalig im Nachhinein um das Feld zu setzen.


--- Zitat von: Peter Klett am 03.02.12 - 10:17:03 ---Mit @Unique meintest Du sicherliche @DocumentUniqueID

--- Ende Zitat ---
Die Frage irritiert mich nun ein wenig.
@Unique: Text. A random, unique text value.
@DocumentUniqueID: The universal ID, which uniquely identifies a document across all replicas of a database

Die DocumentUniqueID wäre wohl die zuverlässigere Variante, oder?

Chris

Peter Klett:
@Unique ist keine Eigenschaft, sondern ein Befehl.

@Unique ("A" : "A" : "B" : "B") => "A" : "B" => Entfernen doppelter Einträge

@DocumentUniqueID ist die eindeutige ID des Dokuments (in Script NotesDocument.UniversalID)

Peter Klett:
Interessant, @Unique ohne Parameter kannte ich noch nicht, das gibt einen angeblich eindeutigen String zurück (da hattest Du natürlich Recht, ich bekenne mich zu meiner Unwissenheit). Bei mir PKLT-xxxxx, wobei ich vermute, das xxxxx eine verschlüsselte Uhrzeit ist. PKLT ist wohl aus meinem Usernamen gerechnet.

Wie die die Eindeutigkeit des PKLT herstellen wollen, ist mir fraglich. Angenommen, eine Datenbank wird über mehrere Domänen repliziert, in einer anderen Domäne gibt es einen Paul Klatt, der bekommt vielleicht auch PKLT, und zufällig mit dem erstelle ich gleichzeitig solch ein Dokument. Ok, sehr unwahrscheinlich, aber der Teufel ist ein Eichhorn ...

Ich würde auf jeden Fall über @DocumentUniqueID gehen, hat auch noch den Vorteil, dass Du über die ID direkt auf das Dokument zugreifen kannst (Set doc = db.GetDocumentByUnid (...)).

EDIT: Hier der Test: Ein Agent @Prompt ([OK]; @Unique; @Unique) auf zwei separaten Maschinen mit zwei unterschiedlichen Usern, aber ähnlichem Namen, einmal Peter Klett/Kundendomäne und einmal Peter Klett/EigeneDomäne, zeitgleich gestartet. Resultat: Eindeutig nicht eindeutig!

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln