Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: TomLudwig am 23.02.05 - 15:11:29
-
Hallo zusammen,
ich habe eine kategoriesierte Ansicht.
Nun möchte ich mit dem NotesNavigator alle Dokumente in der Ansicht einer bestimmten Kategorie durchgehen. Ist das überhaupt möglich?
Leider finde ich in der Hilfe zwar Methoden wie GetNextCategory usw. Aber nicht eine Methode die z.B. heißt GetCategory.
Kann mir jemand helfen? Danke, Gruß Tom
-
Hi,
muss das unbedingt der NotesNavigator sein? Was mir spontan einfällt wäre GetAllDocumentsByKey aus der NotesView-Klasse. Dann hast du alle dokument in einer Collection.
Axel
-
Sind die Dokumente dann in der gleichen sortierten Reihenfolge wie in der View?
Hintergrund:
Ich möchte im Web einen Next und Previous Button im Dokument einfügen um zum nächsten oder vorherigen Dokument springen zu können.
Da wärs schlecht, wenn die Collection nicht irgendwie sortiert ist...
-
Hi,
ich glaube ja. Allerdings bin ich mir nicht ganz sicher.
Axel
-
Ich probiers aus.
Vielen dank...
-
Hi,
das Ergebnis würde mich interessieren.
Axel
-
NotesDocumentCollection ist nicht sortiert.
Alternative:
Falls es in der Ansicht durch die du iterieren möchtest möglich ist, das Dokument per key (ggbfls mehrere Spalten) in der View zu finden, dann geht einfach view.getNextDocument (doc).
-
Ich hab es jetzt mit folgendem Code gemacht. Funktioniert eigentlich einwandfrei. Oder hat noch jemand was dran auszusetzten?
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim item As NotesItem
Dim view As NotesView
Dim col As NotesDocumentCollection
Dim FirstDoc As NotesDocument
Dim ThisDoc As NotesDocument
Dim LastDoc As NotesDocument
Dim TempDoc As NotesDocument
Set db = session.CurrentDatabase
Set doc = session.DocumentContext
If doc.IsNewNote Then Exit Sub
Set view = db.GetView("view")
Set col = view.GetAllDocumentsByKey("MeineKategorie",True)
Set FirstDoc = col.GetFirstDocument
Set LastDoc = col.GetLastDocument
Set ThisDoc = FirstDoc Do While doc.UniversalID <> ThisDoc.UniversalID
Set ThisDoc = col.GetNextDocument(ThisDoc)
Loop
Set item = doc.GetFirstItem("NsfName")
If ThisDoc.UniversalID = FirstDoc.UniversalID Then
Call doc.ReplaceItemValue( "PrevDocLink", "<span class=""grey"">None Found</span>")
Else
Set TempDoc = col.GetPrevDocument(ThisDoc)
Call doc.ReplaceItemValue( "PrevDocLink", "<a href=""" + item.Text + "/0/" + TempDoc.UniversalID & "?OpenDocument"">Vorheriges Dokument</a>")
End If
If ThisDoc.UniversalID = LastDoc.UniversalID Then
Call doc.ReplaceItemValue( "NextDocLink", "<span class=""grey"">None Found</span>")
Else
Set TempDoc = col.GetNextDocument(ThisDoc)
Call doc.ReplaceItemValue( "NextDocLink", "<a href=""" + item.Text + "/0/" + TempDoc.UniversalID & "?OpenDocument"">Nächstes Dokument</a>")
End If
End Sub
-
ist es nicht effizienter, das mit einer Single Category View zu machen ?
v.a. für die runtime.
NotesCollections sind nicht sortiert.
-
Single Category View geht aus dem Grund nicht, da ich unzählig viele Views bräuchte.
So habe ich nur einen View in dem alle Kategorien drin sind.
-
Ist das nicht der Trick einer Single Category View, dass da nur immer eine Kategorie angezeigt wird, obwohl mehrere da sind. Keine Energie jetzt ein Beispiel zu posten, aber ich empfehle garantiert ernsthaft, mal in die Suche der Designerhilfe "Einzelne Kategorie in eingebetteten Ansichten anzeigen" einzugeben.
Auf jeden Fall kann ich dir sicher sagen, dass NotesDocumentCollection nicht sortiert ist.
-
Aber wie soll ich denn aus dem WebQueryOpen auf die eingebettete Ansicht zugreifen können ?!?
Sorry, wenn das jetzt ne dämliche Frage war....
-
Du musst das ganz anders machen. Mit treat content as html Ansichten geht es ziemlich sicher (99.9%). Mit der Kombination von Html, Formeln und JavaScript in Ansichten kann man echt eine Menge machen.
Performance-Mässig ist auch WebQueryOpen nie eine gute Idee. V.a. skalliert das nicht bezogen auf gleichzeitig zugreifende User.
Ich bin echt unter zeitdruck, aber vielleicht kann ich am Wochenende eine Session einlegen und deine Requirements wie ich sie verstehe implementieren.
Wenn du über Script gehst, geht es so nicht.
Aber NotesDocumentCollection eben auch nicht, da unsortiert.
Eine Möglichkeit fürs erste wäre eine View zu basteln, wo in der ersten Spalte die Kategorie steht und in der 2. Spalte die DocUnique ID des Dokuments. Dann kannst du das gegenwärtig gewälte Dokument per vw.getDocumentByKey finden und das nächste und vorherige per getNextDocument oder getPreviousDokument. Da kannst du dann abfragen, ob das next- oder prev-Dokument den gleichen Wert im Feld Kategorie besitzt.
-
Das hab ich ja schon in meinem WebQueryOpen-Agenten gemacht.
Ich hab mir alle Dokumente einer Kategorie in einer collection geholt. Hab mir das Dokument mit der aktuellen UNID geholt und geschaut ob es ein nächstes bzw. vorheriges Dokument aus der zuerst geholten collection gibt.
Oder?!?
-
Again. NotesDocumentCollections sind d.e.f.i.n.i.t.i.v. unsortiert.
Bzgl. Datenstrukturen kann man hier von einem unsortierten Set sprechen (keine Duplikate, unsortiert). Bitte um Korrektur von Jens, falls das jetzt falsch war.
Aber du wirst aus einer notesDocCollection.getNextDocument(foundDoc) nicht immer das nächste Dokument in der Ansicht finden, weil es eben unsortiert ist, dh die Sortierung richtet sich nach irgendwelchen internen Implementierungen, die wir eh nicht verstehen und auch nicht abwärtskompatibel sind.
-
Gut, dann werd ich einfach mal warten. Vielleicht hast ja wirklich am WE Zeit mal so eine kleine Beispiel DB zu machen.
Ich würd mich auf jedenfall bedanken. Weil ich im Moment keinen Plan habe wie.
Wenn ich jedoch was hinbekomm meld mich mich noch mal.
Danke, danke, danke, Gruß Tom