Autor Thema: Database.UnprocessedDocuments Reihenfolge der Dokumente in der View  (Gelesen 2696 mal)

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Hi zusammen

Wenn ich mit UnprocessedDocuments eine Dokument-Collection aus einer View fresse, sind die Dokumente in der Collection völlig ungeordnet.

Ich habe hier im Forum bereits eine Klasse für das Sortieren von Klassen gefunden.

Nun möchte ich aber dynamisch die Sortierung der View übernehmen, ohne für jede View das Script anpassen zu müssen.

In einer Testdatenbank stimmt die Reihenfolge überein mit der View, in der richtigen Datenbank aber leider nicht. Hat das was mit dem Index zu tun? Oder wisst ihr, wie man das beeinflussen könnte?  ???

Danke und Grüsse
Moritz

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us

In einer Testdatenbank stimmt die Reihenfolge überein mit der View, in der richtigen Datenbank aber leider nicht. Hat das was mit dem Index zu tun? Oder wisst ihr, wie man das beeinflussen könnte?  ???

Wenn ich in einer Doku irgendwo den Satz finde: Die Collection ist unsortiert, dann nehme ich das auch ernst.
Natürlich ist jede Collection irgendwie sortiert. Solche offiziell unsortierten Collections sind aber nach irgendwelchen internen Dingen sortiert, die von den Entwicklern rein aus Performance-Gesichtspunkten ausgewählt wurden. Die Entwickler von Notes selbst haben auch die Freiheit beim nächsten Release dieses interne Sortierkriterium zu ändern, weil in ihrem Vertrag (Kontrakt) mit den Notes-Anwendungsentwicklern (die Doku) eben unsortiert steht (es ist nix zugesichert).
Wenn es für die Testdatenbank zufällig passt, heisst das gar nichts. 
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Glombi

  • Gast
Unsortiert sind die Dokumente nicht. Aber die sind nicht so sortiert, wie die Einträge in der View stehen.
Dafür gibt es die NotesViewEntryCollection.

Ich denke, dass die Dokumente in einer NotesDocumentCollection nach dem Erstelldatum sortiert sind.

Andreas

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Ok. Danke für die Antworten!

Dann werde ich mal sehen, was sich machen lässt.

Grüsse
Moritz

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Falls es jemanden mal interessiert, wie ichs nun gemacht habe:

Ich bekomme die Collection mittels "UnprocessedDocuments".

Dann hole ich mir noch eine zweite Collection mit allen NotesViewEntries (da UIView.Documents leider auch eine nach Erstelldatum geordnete Collection liefert) per View.AllEntries.

Nun loope ich durch alle Entries durch und vergleiche die UniversalID mit allen UniversalIDs der ersten Collection. In etwa so:
Code
Set dc = Database.UnprocessedDocuments
Set ViewEntryCollection = View.AllEntries

Set ViewEntry = ViewEntryCollection.GetFirstEntry

'loop all entries and export the entry, if there's a corresponding selected doc
While Not (ViewEntry Is Nothing)
	Set doc = dc.GetFirstDocument
					
	'in every entry, loop every selected document
	While Not (doc Is Nothing)
		If doc.UniversalID = ViewEntry.Document.UniversalID Then
							
			'do sth with the document
							
			'count the exported document
			EntryPosY = EntryPosY + 1
							
			If EntryPosY >= dc.Count Then
				'if all docs have been exported, leave the loop
				Goto allDocs
			Else
				'don't search the remaining docs
				Goto nextDoc
			End If
		End If
						
		'navigate to the next document
		Set doc = dc.GetNextDocument(doc)
	Wend
					
nextDoc:
	'navigate to the next view-entry
	Set ViewEntry = ViewEntryCollection.GetNextEntry(ViewEntry)
Wend

allDocs:

So werden am Ende alle selektierten Docs in der richtigen Reihenfolge abgearbeitet.

Das grosse Problem in diesem Code ist die Performance. Wenn ich eine View mit 4'000 Dokumenten habe und nur das Letzte markiere, muss die Schleife trotzdem durch sämtliche Entries durch, bis sie das besagte Dokument findet.

Aber ich habe bis jetzt keine andere Möglichkeit gefunden, die Sortierung in der View mit den markierten Dokumenten zu übernehmen.  ::)

Grüsse
Moritz

P.S. Man möge mir bitte die beiden "Gotos" verzeihen. Die werd' ich später mal eliminieren  ;D

Offline Tode

  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
und warum loopst Du manuell und suchst Dir nicht einfach das Dokument über dc.GetDocument( ViewEntry ) ....

je nachdem in welchem Verhältnis die Anzahl der Selektierten Dokumente zur Anzahl der Dokumente in der View steht, könnte es noch performanter sein, wenn Du die UnprocessedDocuments durchläufst, dann aus den ViewEntries den entsprechenden Eintrag per GetEntry( ) bekommst, und Dir dann eine Liste aufbaust. Diese Liste sortierst Du mit hilfe eines Tricks und durchläufst dann diese Liste...

Code (einfach so getippt, nur als Konzept gedacht, VEC ist Deine ViewEntryCollection, dc die Unprocesseddocuments):

Dim docList list as NotesDocument
dim tmpEntry as NotesViewEntry
Dim sortIndizes as String
Dim tmpPos as String
Dim sortedPos as Variant
Dim tmpDoc as NotesDocument

Forall lDoc in dc
  set tmpEntry = VEC.GetEntry( lDoc )
  tmpPos = tmpEntry.GetPosition( "." )
  docList( tmpPos ) = lDoc
  if sortIndizes = "" then
    sortIndizes = |@Sort( "| & tmpPos & |"|
  else
    sortIndizes = sortIndizes & |:"| & tmpPos & |"|
  end if
End Forall

sortIndizes = sortIndizes & | )|

sortedPos = Evaluate( sortIndizes )

Forall pos in sortedPos
  Set tmpDoc = docList( pos )

... hier Deine Aktionen mit dem Dok...

Next

nur so als Denkanstoss... der erste Tipp bringt auf jeden Fall für Dich einiges an Performance, der zweite KANN Performance bringen, wenn z.B. 10 Dokumente selektiert sind und 4000 Dokumente in der View... Dann durchläufst Du eine 10er Schleife 2 mal anstatt einer 4000er Schleife 1 mal....

HTH
Tode

EDIT: Achtung: In einer Ansicht mit Kategorien liefert GetPosition solche Werte (schon mit sort sortiert):

1.1.1
10.1.1
2.1.1

da müsstest Du im Script das ganze noch "normieren" (Split nach "." , auf 5 Stellen normieren, dann wieder imploden), damit das so aussieht (wiederum nach sort):

00001.00001.00001
00002.00001.00001
00010.00001.00001

« Letzte Änderung: 11.08.06 - 15:46:57 von Tode »
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Super!  ;D

Dass das GetEntry auch mit Dokumenten als Parameter funktioniert hab' ich nicht gewusst.

Ich denke, ich werde deine zwei Punkte noch einbauen. Für deine Methode mit der Sortierung werde ich eine Weiche programmieren, die, wenn die Hälfte aller Docs und weniger markiert sind deine Variante anwendet und sonst meine.

Herzlichen Dank Tode!

Grüsse
Moritz

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Zitat
und warum loopst Du manuell und suchst Dir nicht einfach das Dokument über dc.GetDocument( ViewEntry ) ....

NA TOLL! Notes verliert, wenn ich das Dokument so hole, die ParentView und genau die brauche ich aber dringend um weiterzuarbeiten.

Mit ".GetNextDocument()" funktionierts, mit ".GetDocument()" gehts nicht.  >:( >:( >:(

UARGH! Ich schreib gleich eine Briefbombe an IBM.

Was für ein verkorktes Konzept lässt sowas überhaupt zu??

Moritz

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
Du holst dir ein Dokument eus einer Dokumentenliste. Woher soll das Dokument denn wissen, daß es zur Listenbildung aus einer View geholt wurde. Genaugenommen ist es auch gar nicht aus einer View geholt worden, sondern aus einer ViewEntryCollection bzw. aus dem Refernzobjekt eines einzelnen Viewentries.

Eine Viewentrycollection ist eine Sammlung sortierter Zeileneinträge einer Ansicht, deren einzelne Zeilen (die Viewentries) die Möglichkeit haben, das für die Anzeige verantwortliche Dokument als NotesDocument zu referenzieren.

Je nach Ansicht kannst du fünfmal auf das gleiche Dokument stoßen.
Merke: eine Viewentrycollection bildet sich zwar aus einer view, ist aber selbst weder view, noch Documentcollection.

Deshalb verliert das Dokument nicht den Parentview, sondern es hat diesen Bezug bei seiner Bildung überhaupt nicht besessen.

Wofür brauchst du denn noch die View an sich ?
« Letzte Änderung: 16.08.06 - 20:30:06 von LN4ever »
Situs vilate in isse tabernit.

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Moment. Ich bin mit jetzt nicht sicher, ob ich das verstanden habe:

Zitat
Du holst dir ein Dokument eus einer Dokumentenliste. Woher soll das Dokument denn wissen, daß es zur Listenbildung aus einer View geholt wurde.
Das weiss ich auch nicht, ich habe aber festgestellt, dass wenn ich die Dokumentliste über "UnprocessedDocuments" hole, die Dokumente offensichtlich eine ParentView besitzen.

Zitat
Genaugenommen ist es auch gar nicht aus einer View geholt worden, sondern aus einer ViewEntryCollection bzw. aus dem Refernzobjekt eines einzelnen Viewentries.
Indirekt wurde das Dokument aber eben doch aus einer View geholt, da "UnprocessedDocuments" von einer View stammt (soweit mein Verständnis).

Meiner Meinung nach, hat doch jedes Dokument in meiner DocumentCollection eine Referenz auf die ParentView, oder? Sonst könnte ich ja nicht darauf zugreifen (mit "GetNextDocument" funktionierts ja).

Warum spielt es nun eine Rolle, WIE ich an das Dokument aus der Collection komme, um die ParentView auszulesen?

Zitat
Wofür brauchst du denn noch die View an sich ?
Eigentlich brauche ich nicht die View, sondern "ColumnValues". Diese beiden Attribute stehen und fallen aber gleichzeitig.

Bitte um Korrektur, falls ich da was falsch verstanden habe.

Grüsse
Moritz

Offline LN4ever

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 505
  • Geschlecht: Männlich
Wenn du die ColumnValues brauchst, dann stehen dir diese direkt aus der ViewEntrycollection über die Viewentries zur Verfügung.

Dein Problem ist doch, daß du jetzt nur die UNPROCESSEDDOCUMENTS dabei abarbeiten willst.

Du brauchst also ein Array, das eine eindeutige Dokumentverbindung ermöglicht - ich empfehle die NoteID. Dieses Array bildest du aus der DOCUMENTCOLLECTION der UNPROCESSEDDOCUMENTS.

Und dann läufst du an der VIEWENTRYCOLLECTION entlang und schaust bei jedem Entry, wenn er ein DOCUMENT ist, ob die NoteID in deinem Array vorhanden ist. Wenn ja, machst du etwas damit (die ColumnValues stehen dir aus dem Viewentry ja zur Verfügung). Wenn du ein Dokument nur einmal bearbeiten willst, solltest du dein Array der NoteIDs zweidimensional auslegen und die Abarbeitung in der zweiten Dimension abspeichern (du kannst in der View ja mehrfach auf dieses Dokument stoßen).

Anders geht es nicht.
Situs vilate in isse tabernit.

Offline Untitled

  • Senior Mitglied
  • ****
  • Beiträge: 364
    • Musiker24.ch - Musiker und Bands finden
Zitat
Und dann läufst du an der VIEWENTRYCOLLECTION entlang und schaust bei jedem Entry, wenn er ein DOCUMENT ist, ob die NoteID in deinem Array vorhanden ist.
Ja klar, das hab ich ja schon gemacht. Siehe ->
Zitat
'loop all entries and export the entry, if there's a corresponding selected doc
While Not (ViewEntry Is Nothing)
Set doc = dc.GetFirstDocument

'in every entry, loop every selected document
While Not (doc Is Nothing)
If doc.UniversalID = ViewEntry.Document.UniversalID Then

Ich hätte einfach anstelle des "GetDocument", auch gleich mit der ViewEntry arbeiten können, da hast du recht.

Aber ist jetzt eh egal. Ich habe die Performance-Steigerungs-Variante nummer zwei von Tode übernommen und da wird diese Loop sowieso überflüssig.

Die Frage, warum die ParentView und die ColumnValues verschwinden, wenn ich das Dokument über "GetDocument" hole, bleibt aber noch offen. Ich denke aber, das wird ein Bug sein, und der wird bis Lotus Notes 8.0 auch nicht behoben werden  ::)

Danke für die Hilfe!
Moritz

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz