Autor Thema: Dokumente mit dem gleichen Wert eines Feldes finden  (Gelesen 3724 mal)

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Hallo,

es gibt eine Datenbank mit vielen Dokumenten.

Ich möchte alle Dokumente finden, die den gleichen Wert im Feld "Meins" haben. Und dann entweder in einer Ansicht anzeigen oder die Liste per Mail versenden lassen.

Ich denke, ich kann dies mit einem Agenten erreichen: über NotesDocumentCollection und zwei verschachtelten Schleifen über alle Dokumente.

Gibt's einen performanteren Weg?

Gruß
Leo
« Letzte Änderung: 10.08.10 - 13:59:03 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #1 am: 04.08.10 - 17:38:07 »
Das Feld "Meins" ist aber kein RichtextFeld?

Bernhard

Offline TRO

  • Senior Mitglied
  • ****
  • Beiträge: 296
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #2 am: 04.08.10 - 17:58:53 »
Ich hoffe, dass ich Deine Frage richtig verstanden habe:

Ansicht: erste Spalte sortiert nach Feld "Meins"

Dann mit ViewEntryCollection die Ansicht von oben nach unten abklappern
Wenn der gerade erreichte ViewEntry im Feld Meins vom vorhergehenden abweicht: Zähler auf Eins setzen
Nächsten viewEntry holen: ist der gleich dem vorhergehenden? dann Zähler erhöhen. Wenn nein, dann alten Zählerstand prüfen: ist der 1 dann gab es nur ein Doc, > 1 dann Mail schicken
Zähler wieder auf 1

ich hoffe ich habs in dder Kürze einigermaßen verständlich beschrieben.

hth

Thomas

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #3 am: 04.08.10 - 20:57:07 »
Das Feld "Meins" ist aber kein RichtextFeld?

Nein, nur PlainText.

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #4 am: 04.08.10 - 21:09:27 »
Unter der Massgabe, dass Du es dann auch nur mit Feldern mit einem Wert ("skalare Werte" - auch wenn das begrifflich in diesem Zusammenhang nicht ganz korrekt ist) und nicht mit Listen zu tun hast:
Thomas' Vorschlag ist m.E. nach der performanteste. Dazu solltest Du obendrein eine (versteckte) Ansicht mit nur der einen Spalte haben.
Du kannst dann aus den "Treffern" einen Bericht machen, Du kannst das aber auch in einen (persönlichen!) Ordner packen (eine Ansicht geht natürlich nicht!). Obicht natürlich mit dem Prinzip "persönlicher Ordner" ("SPOFU folder") - da sind einige Dinge zu beachten (Design-Updates, Anlage bei Erstverwendung, gewisse Schwierigkeiten bei der Entfernung bislang dort gebunkerter Dokumentenverweise - gerade bei ResponseDocs ...). Hier hilft aber die Forumssuche oder auch eine konkrete Nachfrage.

Ein anderer Gedanke: Wenn Du "doppelte" Einträge suchst (weil Du sie nicht magst), dann ist es in der Regel hilfreicher, wenn man die Anlage solcher Dokumente schon verhindert. Vielleicht magst Du uns einfach etwas mehr über den Hintergrund Deiner Anfrage schreiben?

Bernhard

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #5 am: 04.08.10 - 21:18:53 »
Ansicht: erste Spalte sortiert nach Feld "Meins"

Dann mit ViewEntryCollection die Ansicht von oben nach unten abklappern
Wenn der gerade erreichte ViewEntry im Feld Meins vom vorhergehenden abweicht: Zähler auf Eins setzen
Nächsten viewEntry holen: ist der gleich dem vorhergehenden? dann Zähler erhöhen. Wenn nein, dann alten Zählerstand prüfen: ist der 1 dann gab es nur ein Doc, > 1 dann Mail schicken
Zähler wieder auf 1

Hallo Thomas,

VIELEN DANK !

Ich probiere es mal.
Ich habe ViewEntryCollection noch nie benutzt.

Gruß
Leo
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #6 am: 04.08.10 - 21:31:44 »
Hallo Bernhard,

Danke für Deine Untestützung.

...Dazu solltest Du obendrein eine (versteckte) Ansicht mit nur der einen Spalte haben.
Meinst Du noch eine oder nur eine aber mit nur einer Spalte?
Falls noch eine, dann wofür genau?

...Du kannst das aber auch in einen (persönlichen!) Ordner packen
Oh, das ist eine gute Idee!


Wenn Du "doppelte" Einträge suchst (weil Du sie nicht magst), dann ist es in der Regel hilfreicher, wenn man die Anlage solcher Dokumente schon verhindert. Vielleicht magst Du uns einfach etwas mehr über den Hintergrund Deiner Anfrage schreiben?
Ja, klar, erkläre ich gerne.
Du hast sehr richtig erkannt, es geht um die "doppelten" Einträge. :)
Ich hab schon mehrere Massnahmen ergriffen, wie z.B. das Sperren der Dokumente, das saubere Entsperren nach der Bearbeitung und das Verhindern des Kopierens der Dokumente in der Ansichten...
Irgenwie kommen die Replikationskonflikte trotzdem...
Vielleicht wenn ein User dasselbe Dokument zweimal nacheinander gleichzeitig öffnet und bearbeitet? Wie könnte man dies verhindern?

Gruß
Leo
« Letzte Änderung: 04.08.10 - 21:38:27 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #7 am: 10.08.10 - 13:58:42 »
Anbei mein toller Agent.  ;)
Verbesserungsvorschläge willkommen!
 :)

Code
Sub Initialize()
	%REM
		Der Agent findet doppelte Dokumente (mit dem gleichen Wert im PlainText-Feld "Meins")
		in der Datenbank und versendet die Mail(s) darüber.
		Ansicht "(AllDouble)" sortiert nach erster Spalte "Meins" notwendig.
	%END REM

Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim docOne As NotesDocument	'das erste Dokument in Ansicht
Dim docTwo As NotesDocument	'das nächste Dokument in Ansicht
Dim entryOne As NotesViewEntry	'das erste ViewEntry in Ansicht
Dim entryTwo As NotesViewEntry	'das nächste ViewEntry in Ansicht
Dim vec As NotesViewEntryCollection 
Dim countDouble As Integer 

Set db = session.CurrentDatabase
Dim serverName As String 
If session.IsOnServer Then
	serverName = db.Server
Else
   serverName = "lokal"
End If

countDouble = 1
Set view = db.GetView( "(AllDouble)" )
view.AutoUpdate = False
Set vec = view.AllEntries
Set entryOne = vec.GetFirstEntry()
Set docOne = entryOne.Document

Dim text1 As String 
Dim text2 As String 
       	
While Not (docOne Is Nothing)
	text1 = "Agent fand " & countDouble & " doppelte Dokumente " & text2 & _
        	" in Datenbank '" & db.title & "' auf "  & serverName 
	Set entryTwo = vec.GetNextEntry(entryOne)
	
	'Kein weiteres Dokument in Ansicht vorhanden
	If entryTwo Is Nothing Then
      	
      	If countDouble > 1 Then	'Zumindest ein doppeltes Dokument wurde gefunden
         	Set doc = New NotesDocument(db)
         	doc.Subject = "Doppelte Dokumente in " & db.title & " !"
         	doc.Body = text1
         	Call doc.Send( False, "Bruce Willis/World" )
         End If
         
		Exit Sub
	End If
	
	Set docTwo = entryTwo.Document
   
   'Ein (oder noch ein) doppeltes Dokument vorhanden
   If docOne.Meins(0) = docTwo.Meins(0) Then
      countDouble = countDouble + 1
      text2 = docOne.Meins(0)
   End If
   
   'Zumindest ein doppeltes Dokument wurde gefunden, das nächste Dokument ist aber kein doppeltes mehr
   If countDouble > 1 And (docOne.Meins(0) <> docTwo.Meins(0)) Then
        Set doc = New NotesDocument(db)
        doc.Subject = "Doppelte Dokumente in " & db.title & " !"
        doc.Body = text1
        Call doc.Send( False, "Bruce Willis/World" )
        countDouble = 1
   End If
      
   Set entryOne = vec.GetNextEntry(entryOne)  
   Set docOne = entryOne.Document
Wend

End Sub

Gruß
Leo
« Letzte Änderung: 10.08.10 - 14:18:14 von Bruce Willis »
nobody is perfect but i'm pretty close 

Offline Bruce Willis

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.002
  • Geschlecht: Männlich
  • Wer nicht wagt...
Re: Dokumente mit dem gleichen Wert eines Feldes finden
« Antwort #8 am: 12.08.10 - 13:47:26 »
Noch kürzer und ohne Zugriff auf NotesDocument:

Code
Sub Initialize()
%REM
	Der Agent findet doppelte Dokumente (mit dem gleichen Wert im PlainText-Feld "Meins")
	in der Datenbank und versendet die Mail(s) darüber.
	Ansicht "(AllDouble)" sortiert nach erster Spalte "Meins" notwendig.
%END REM

Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim entryOne As NotesViewEntry	'das erste ViewEntry in Ansicht
Dim entryTwo As NotesViewEntry	'das nächste ViewEntry in Ansicht
Dim vec As NotesViewEntryCollection 
Dim countDouble As Integer 

Set db = session.CurrentDatabase
Dim serverName As String 
If session.IsOnServer Then
	serverName = db.Server
Else
   serverName = "lokal"
End If

countDouble = 1
Set view = db.GetView( "(AllDouble)" )
view.AutoUpdate = False
Set vec = view.AllEntries
Set entryOne = vec.GetFirstEntry()

Dim text1 As String 
Dim text2 As String 
       	
While Not (entryOne Is Nothing)
	text1 = "Agent fand " & countDouble & " doppelte Dokumente " & text2 & _
        	" in Datenbank '" & db.title & "' auf "  & serverName 
	Set entryTwo = vec.GetNextEntry(entryOne)
	
	'Kein weiteres Dokument in Ansicht vorhanden
	If entryTwo Is Nothing Then
      	
      	If countDouble > 1 Then	'Zumindest ein doppeltes Dokument wurde gefunden
         	Set doc = New NotesDocument(db)
         	doc.Subject = "Doppelte Dokumente in " & db.title & " !"
         	doc.Body = text1
         	Call doc.Send( False, "Bruce Willis/World" )
         End If
         
		Exit Sub
	End If
   
   'Ein (oder noch ein) doppeltes Dokument vorhanden
   If entryOne.ColumnValues(0) = entryTwo.ColumnValues(0) Then
      countDouble = countDouble + 1
      text2 = entryOne.ColumnValues(0)
   End If
   
   'Zumindest ein doppeltes Dokument wurde gefunden, das nächste Dokument ist aber kein doppeltes mehr
   If countDouble > 1 And (entryOne.ColumnValues(0) <> entryTwo.ColumnValues(0)) Then
        Set doc = New NotesDocument(db)
        doc.Subject = "Doppelte Dokumente in " & db.title & " !"
        doc.Body = text1
        Call doc.Send( False, "Bruce Willis/World" )
        countDouble = 1
   End If
      
   Set entryOne = vec.GetNextEntry(entryOne)  
Wend

End Sub
« Letzte Änderung: 12.08.10 - 13:49:16 von Bruce Willis »
nobody is perfect but i'm pretty close 

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz