Das Notes Forum

Domino 9 und frühere Versionen => ND9: Entwicklung => Thema gestartet von: tabama am 08.11.18 - 15:12:27

Titel: "stampAll" für flag IsReaders
Beitrag von: tabama am 08.11.18 - 15:12:27
Hallo,
mit der DC-Methode "StampAll" ist es ja möglich, den Wert eines Items für alle in der DC enthaltenen Docs zu setzten.
Ich suche eine Möglichkeit, dies für den Flag "IsReaders" eines Readerfeldes zu tun.

Hintergrund: Ich importiere monatlich ca. 150.000 Datensätze in eine Datenbank. In der Importdate sind bereits die Inhalte der Readerfelder belegt. Damit das aber auch in Notes funktioniert, muss ich noch den Flag setzten.

Wenn ich mich mit "while not doc is nothing" durch die DC wühle, dauert das sehr lange. Deshalb suche ich eine andere Lösung.

Es muss auch nicht aus einer DC heraus sein. Ich möchte alle Dokumente der DB stempeln.

Gibt es so was?
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: ronka am 08.11.18 - 22:24:09
Nein, das geht nicht mittels Stamp All, damit kann nur einen WERT gesetzt werden, nicht einen Typ.

Dafür musstest du jedes feld als NotesItem holen, und dort der wert des Items mittels IsReader=True setzen.

Sprich einen ForAll oder einen While-Do schleife erstellen und durch ALLE dokumente gehen.
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: Tode am 09.11.18 - 08:14:41
Sind es denn jedesmal andere / neue  150.000 Dokumente, oder ist das nur einfach so Sch... programmiert, dass monatlich die selben 150.000 Datensätze gelöscht / neu angelegt werden, weil man nicht weiss, wie es richtig geht?
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: tabama am 09.11.18 - 11:45:20
Hallo Thorsten,

es sind zum Großteil immer die Gleichen. Es kommen ein paar hinzu und ein paar fallen weg.
Bisher war der "Sch..." auch das Einfachste. Ich brauchte mir keine Gedanken über das "Update-Thema" zu machen. -> Löschen, Import, Fertig!

Nun ist aber jemand auf die Idee gekommen. dass nicht mehr jeder alles sehen darf. Deshalb nun die Reader-Felder. Wenn es mit dem "stampAll" odgl. nicht geht (was ich schon vermutete), muss ich mir nun mal Gedanken machen, was auf Dauer mehr Sinn macht. (Löschen und neu, oder Update).

Vielen Dank für die Antworten.
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: Peter Klett am 09.11.18 - 12:35:18
Löschen und Neu ist die allerschlechteste Lösung in Notes. Replikation und Deletion-Stubs seien nur zwei Stichworte
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: Tode am 09.11.18 - 14:11:44
Boah... 150000 Datensätze monatlich löschen.... würde mich nicht wundern, wenn Euch diese Applikation irgendwann um die Ohren fliegt...
Es ist doch so einfach, bei einem import zu prüfen, ob ein Dokument schon da ist oder nicht:

1. Ansicht, sortiert nach "eindeutigem Schlüssel". Wenn der nur eindeutig ist, wenn man alle Felder miteinander verknüpft, dann ist das halt so. 2. Spalte: @Text( @DocumentUniqueID)
2. Vor Beginn des Imports diese Ansicht iterieren und eine Liste mit den existierenden Schlüsseln erstellen. Eine Liste mit 150.000 Dokumenten könnte wird speichertechnisch problematisch sein, deshalb würde ich hier mit UNID arbeiten:

Code
Dim lstrUnid List as String
'- Ansicht durchlaufen und für jeden ViewEntry:
lstrUnid( ViewEntry.ColumnValues(0) ) = ViewEntry.ColumnValues(1)

Dieses Vorgehen hat den Vorteil, dass man später nicht 150.000 Lookups machen muss, die die Laufzeit sprengen

3. Für jeden importierten Datensatz Schlüssel bilden und schauen: ist in Liste? Wenn ja: Dokument per Unid holen, Updaten (oder sogar prüfen, ob man updaten muss, hier arbeite ich gerne mit Hashwerten wegen der Performance), und Eintrag aus Liste entfernen. Wenn nein: Dokument neu erstellen

4. Am Ende sind alle Einträge, die in der Liste noch drin sind, nicht mehr im Quellsystem: UNIDs durchlaufen und Dokumente löschen...

Ohne Hashing- Vergleiche sind das max. 100 Zeilen Code. Wenn man zur Performance- Optimierung auch noch Hashed und die Hashes vergleicht, dann sind es vielleicht 200 Zeilen Code...
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: Peter Klett am 09.11.18 - 14:35:23
...
Eine Liste mit 150.000 Dokumenten könnte Speichertechnisch problematisch sein, deshalb würde ich hier mit UNID arbeiten:
...
Völlig einig, nur das Wort "KÖNNTE" ist hier m.E. falsch, da müssten die Dokumente schon sehr klein sein, damit das problemlos geht. ;)
Titel: Re: "stampAll" für flag IsReaders
Beitrag von: Tode am 09.11.18 - 16:26:18
Hast vollkommen recht, ich habe das korrigiert: könnte -> wird