Autor Thema: Ein Dokument finden und einen Wert hinterlegen  (Gelesen 3002 mal)

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Ein Dokument finden und einen Wert hinterlegen
« am: 03.02.12 - 09:34:42 »
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

Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #1 am: 03.02.12 - 10:17:03 »
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

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #2 am: 03.02.12 - 10:48:10 »
Du hast nicht abgefangen, dass es evtl. schon mehrere passende Dokumente geben könnte. War aber auch nicht die Aufgabe (?).
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.

Ich gehe auch davon aus, dass der Agent nachträglich einmal laufen soll und zukünftig das ID-Feld bei Dokumenterstellung gesetzt wird.
Richtig. Der Agent läuft einmalig im Nachhinein um das Feld zu setzen.

Mit @Unique meintest Du sicherliche @DocumentUniqueID
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
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #3 am: 03.02.12 - 13:11:32 »
@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)

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #4 am: 03.02.12 - 14:52:15 »
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!

« Letzte Änderung: 03.02.12 - 15:10:24 von Peter Klett »

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #5 am: 03.02.12 - 15:19:20 »
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!

Man, hast Du Zeit ;)
Aber solche Dinge locken mich auch immer :) denn das mit dem @Unique ohne Parameter kannte ich auch nicht - Ergebnis: MSCE-8R5JQL (hat nix mit Microsoft zu tun, sondern scheint Deinen Verdacht mit der Ableitung aus dem Namen - Marco Schultze - zu bestätigen; was, wenn der Nachname nur 2 Buchstaben hat ???).
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #6 am: 03.02.12 - 15:47:34 »
Um noch ein Messer in die Brust von @Unique zu rammen: Schreibe ein Agentileinchen, dass Dir in einer Schleife 1.000 Dokumente erzeugt und mit @Unique etwas erzeugt. Dann zähle die Duplikate  ;D

@Unique macht ein "unique" für Arme ...

Bernhard

PS: Zweibuchstabige Nachnamen werden automatisch aufgefüllt. Aber das ist ja eigentlich auch schon völlig wurscht ...

Offline cebolina

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #7 am: 03.02.12 - 15:54:38 »
Zum Thema @Unique hier ein interessanter Artikel zum Thema "Fortlaufende Nummern" (u.A. wird eine Option mit @Unique erläutert)
http://www-10.lotus.com/ldd/ddwiki.nsf/dx/sequential-numbering.htm

Gruß
Stefan

« Letzte Änderung: 03.02.12 - 15:56:23 von cebolina »
Server: Lotus Domino 9.0.1FP4 HF70
Client: Release 9.0.1FP6

Offline Klafu

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.944
  • Geschlecht: Männlich
  • Remember the Cookies!
Re: Ein Dokument finden und einen Wert hinterlegen
« Antwort #8 am: 07.02.12 - 14:42:08 »
Hallo,
ich werde mir wohl sehr schwer tun in allen Dokumenten den Wert von @Unique durch eine eindeutigere Funktion zu ersetzten. Vorallem, da einige Beziehungen zwischen den Dokumenten auf Basis des @unique-Wertes gemacht sind und ein paar nicht.
Das Beste wird wohl sein, wenn ich alles ersteinmal auf einen gemeinsamen Nenner (in dem Fall würd ich dann mit @Unique weiter machen) und alle Bezihungen richtig knüpfen.
Danach dürfte es bei Bedarf (und da es wohl wichtig ist:)) auch leichter sein das @Unique zu entfernen (alà suchen und ersetzen)

P.s. @Unique wird auch in der !!Help!! Datenbank genutzt. Das hat wohl zu der Entscheidung die Funktion zu nutzen, auch noch bestärkt :)

Chris
„Der einzige Mensch, der sich vernünftig benimmt, ist mein Schneider. Er nimmt jedesmal neu Maß, wenn er mich trifft, während alle anderen immer die alten Maßstäbe anlegen in der Meinung, sie paßten auch heute noch...“

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz