Autor Thema: FTSearch und Dokumente mit Leserfeldern  (Gelesen 3498 mal)

Jürgen Schomann

  • Gast
FTSearch und Dokumente mit Leserfeldern
« am: 15.04.14 - 15:04:29 »
Beim Aufruf von NotesDatabase.FTSearch wird eine NotesDocumentCollection zurückgegeben. Diese enthält ggf. auch Dokumente, auf die der Nutzer keinen Zugriff hat, weil sie Leserfelder enthalten, in die der Nutzer nicht eingetragen ist.
Lt. Notes Designer-Hilfe soll über die Eigenschaft NotesDocument.IsValid eine Prüfung auf solche Dokumente genauso wie für eventuell gelöschte Dokumente möglich sein. Hier die Textpassage:

'A deletion stub is returned for a document deleted after creation of the collection or for a document to which you do not have read access. Use IsValid in NotesDocument to check whether a document is real (True) or a deletion stub (False).'

NotesDocument.IsValid liefert aber für solche Dokumente trotzdem True. Nur über IsEmpty(NotesDocument.Items) lässt sich so ein Dokument erkennen oder habe ich da etwas falsch verstanden?

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #1 am: 15.04.14 - 15:45:31 »
Wir haben an anderer Stelle

IsArray (NotesDocument.Items)

für gültige (lesbare) Dokumente verwendet, was das gleiche aussagt.

Sicherlich ist mit IsValid der Unterschied gemeint, ob es sich um ein tatsächliches Dokument handelt, auf das der Lesezugriff fehlt (-> True), oder um einen Deletion Stub (-> False). Das ist aber nur meine spontane Interpretation ohne Erfahrungshintergrund. Ich würde mich auf IsArray oder IsEmpty verlassen, und nur dann IsValid prüfen, falls Du noch wissen musst, ob das Dokument real existiert.

In Deinem Script macht es aber vermutlich keinen Unterschied, ob es gelöscht oder nicht lesbar ist. Du wirst es so oder so nicht weiterverarbeiten können / wollen.

Jürgen Schomann

  • Gast
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #2 am: 15.04.14 - 20:41:10 »
Vielen Dank für Deine Hinweise.
Ich werde IsArray(NotesDocument.Items) verwenden. Ich will ja nur echte Dokumente (nicht gelöscht bzw. Zugriff besteht) verarbeiten und in dem anderen Fall nur das nächste Dokument holen.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #3 am: 15.04.14 - 22:06:13 »
Du schützt Dich damit auch vor "Geisterdokumenten" (die i.d.R. nur noch in Ansichtsindizes verzeichnet sind, aber nicht mehr real der DB angehören). Isarray ist eine gute Lösung.
Um ganz auf Nummer sicher zu gehen (okay, ich nenne hier meine Paranoia "gesund"!), verwende ich sicherheitshalber die Kombination von
Isempty und anschliessend
IsDeleted,
um erstmal "Nicht-Dokumente" und dann sicher auch gelöschte Dokumente (die ja noch ggf. als Items interpretierbare Properties haben!) aussen vor zu halten. Und das ist ein aus Erfahrung entstandenes Procedere ...

Bernhard

Edit: "vereichnet" ist irgendwie falsch, ich habe da mal noch ein "z" spendiert.
« Letzte Änderung: 15.04.14 - 22:14:14 von koehlerbv »

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #4 am: 15.04.14 - 23:21:14 »
Wir prüfen es wie im Codeschnipsel unten, da sich NotesDocument.Items...
1) ...als zu inperformant herausgestellt hat. (Hier muss wohl intern das Array aufwändig aufgebaut werden)
2) ein Zugriff auf doc.items alle MIME-Felder auf Richtext konvertiert, falls man zuvor nicht sichergestellt hat, dass die MIME Konvertierung aus ist

Code
Public Function docIsValid(doc As NotesDocument) As Integer
    If doc Is Nothing Then Exit Function
    'If doc.Isdeleted Then Exit Function ' inperformant, kommuniziert immer mit dem Server und fragt den aktuellen Zustand ab!
    If doc.Universalid = "" Then Exit Function
    docIsValid = doc.isValid ' docIsValid liefert den Zustand beim Laden des Dokuments (und nicht den aktuellen wie doc.isDeleted)
End Function
Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #5 am: 16.04.14 - 09:01:01 »
Ich erinnere mich, daß das mit der UniversalID nicht sicher alle Fälle von "ungültig" abgedeckt hat. Probiert hatte ich das nämlöich auch mal.

Bernhard

Jürgen Schomann

  • Gast
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #6 am: 16.04.14 - 12:28:58 »
Nochmals Danke für die weiteren Hinweise.
Die Hinweise bezüglich der Performance bei den Prüfungen IsEmpty bzw. Is Deleted sind natürlich auch berechtigt aber irgendwie muss mann ja prüfen.
Ganz ausgeschlossen ist ein undefinierter Zustand letzendlich auch dann nicht. So könnte ein Dokument nach Prüfung mit IsDeleted und vor dem ersten Zugriff auf ein Item auch gerade gelöscht werden.

Könnte man für eine NotesDocumentCollection dann so wie im folgenden Muster gezeigt verfahren?

Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument

Set dbThis = session.CurrentDatabase
Set dc = dbThis.FTSearch("...", 0)

Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
   If Not (IsEmpty(doc.Items) Or doc.IsDeleted) Then
      ...
   End If
   Set doc = dc.GetNextDocument(doc)
Wend


Bei einer NotesViewEntryCollection könnte es dann so aussehen?

Dim session As New NotesSession
Dim dbThis As NotesDatabase
Dim view As NotesView
Dim vc As NotesViewEntryCollection
Dim entry As NotesViewEntry
Dim doc As NotesDocument

Set dbThis = session.CurrentDatabase
Set view = dbThis.GetView("...")
view.AutoUpdate = False
Set vc = view.AllEntries

Set entry = vc.GetFirstEntry()
While Not (entry Is Nothing)
   If entry.IsValid Then
      Set doc = entry.Document
      If Not IsNull(doc) Then
         ...
      End If
   End If
   Set entry = vc.GetNextEntry(entry)
Wend

Jürgen Schomann

  • Gast
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #7 am: 16.04.14 - 12:42:22 »
Noch ein kurzer Nachtrag.
NotesDocument.Size ist bei gelöschten bzw. Dokumenten ohne Leseberechtigung 0. Könnte man ggf. statt IsEmpty(NotesDocument.Items) ggf. dann auch dies abfragen?

Offline Pyewacket

  • Senior Mitglied
  • ****
  • Beiträge: 310
  • Geschlecht: Männlich
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #8 am: 16.04.14 - 17:14:16 »
Ginge nicht auch die Abfrage auf die Anwesenheit des Items "$UpdatedBy"?

Peter
ATOS.org - Feel the music!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: FTSearch und Dokumente mit Leserfeldern
« Antwort #9 am: 16.04.14 - 17:37:10 »
Das ist ja i.d.R. das Problem - auf die Items besteht gar kein Zugriff.

Bernhard

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz