Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: jo@chim am 16.02.07 - 11:24:32

Titel: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 16.02.07 - 11:24:32
Ich habe eine mehrfach kategorisierte Ansicht in der Form

Kategorie1
  Unterkategorie1
  Unterkategorie2
Kategorie2
  Unterkategorie1
  Unterkategorie2
...

uiview.CaretCategory gibt in LS den Wert der Kategorie im Fokus zurück - also "Unterkategorie2", wenn Kategorie1/Unterkategorie2 ausgewählt ist.
Gibt es eine Möglichkeit, hierzu die übergeordnete Kategorie, also "Kategorie1" in diesem Fall, zu ermitteln?

Hintergrund: ich benötige für ein Skript die DocumentCollection aller auf die Kategorie im Fokus folgenden Dokumente.

Wenn ich per

category = uiview.CaretCategory      
Set view = uiview.View
Set nav = view.CreateViewNavFromCategory(category)

einen Navigator erstelle, funktioniert das nur auf der Ebene der ersten Kategorie, nicht in den Folgekategorien ...
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Axel am 16.02.07 - 11:31:56
Du müsstest das Feld mit der 1.Kategorie des makierten Dokumentes auslesen und dann mit einem Search alle Dokumente in der DB suchen. Als Ergebnis erhälst du dann eine DocumentCollection.

Eine andere Möglichkeit sehe ich im Moment nicht.


Axel
 
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 16.02.07 - 11:51:08
Danke für die Antwort Axel.

Es ist überhaupt kein Dokument markiert - dann wäre es ja in der Tat kein Problem, per view.GetAllDocumentsByKey und einem Werte-Array als Parameter, den ich aus dem markierten Doc hole, die DocCollection zu ermitteln.

Es geht mir vielmehr darum, dass der Anwender nicht erst ein Dokument markieren muss, sondern dass es ausreicht, wenn er den Fokus auf eine Kategorie setzt, um per Skript eine Liste aller darunterliegenden Dokumente (an Excel in meinem Fall) zu übergeben.
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: DerAndre am 16.02.07 - 11:53:49
Hilft dir vielellicht die GetPrevSibling, GetNextSibling, SiblingCount usw. weiter?
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 16.02.07 - 12:10:03
:-|

... das Problem ist doch, dass ich an das Entry-Objekt erst über die CreateViewNavFromCategory-Methode herankomme. Und das funktioniert nur auf der ersten Kategorieebene. Auf den folgenden Ebenen besitzt der so erstellte ViewNavigator keine Entries, aus denen ich die übergeordnete Ebene ermitteln könnte.
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: DerAndre am 16.02.07 - 12:28:46
Wenn Da nur der Focus drauf ist kommst Du ja mit

   db.GetDocumentByID(uiview.CaretNoteID)

an das Doc. Darüber sollte es dann doch möglich sein, das hinzubekommen?

Oder hab ich jetzt einen denkfehler?
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 16.02.07 - 12:34:13
... hatte ich gerade soeben versucht - gibt mir aber Nassssing zurück :-(

Eine Kategorie hat zwar offensichtlich eine NoteID, wird aber nicht durch ein Dokument repräsentiert, mutmasse ich mal.
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: DerAndre am 16.02.07 - 12:38:05
 :P
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 16.02.07 - 13:02:44
(http://ec3.images-amazon.com/images/P/B000ESWK92.01-A2X3FMBNSRPS6U._SCMZZZZZZZ_.jpg)

... und schon gleich nicht gegen IBM: wird mich wohl noch übers Wochenende beschäftigen, das Problem.

Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Tode am 19.02.07 - 10:13:39
Was Du willst habe ich schon mal umgesetzt, allerdings ist das ein wirklich wilder Stunt und ein Konglomerat aus Script- und Formel- Agenten.

Da mich das ganze mehrere Tage meiner Zeit gekostet hat, und ich als Dienstleister mit sowas mein Geld verdiene, kann ich Dir den Code nicht einfach hier posten, aber nur so viel:

Mit Script alleine habe ich keinen Weg gefunden, das zu realisieren.

Bis jetzt...

Ich habe mir grade noch mal die Klassen angesehen und bin auf eine Lösung gekommen, die eventuell klappen könnte, nur wie's mit der Performance aussieht, weiss ich nicht:

Du könntest einen NotesViewNavigator bauen und Dich über GetNextCategory so lange durchhangeln, bis Entry.NoteID = CaretNoteID ist. Dann kannst Du ja wieder rückwärts gehen bis Du auf der Haupt- Category bist...

Gruß
Tode
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 19.02.07 - 12:29:08
Hmmm ... ja: danke für den Tipp Tode, das klingt vielversprechend. Werde mir das mal ansehen & den Code dann hier posten, falls es klappt.
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 19.02.07 - 15:08:14
Negativ: entry.NoteID gibt bei Kategorien einen Leerstring zurück, ich kann also nicht mit uiview.CaretNoteID vergleichen ...

... Bluadige Hennakröpf!
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Fedaykin am 19.02.07 - 17:36:18
Diese Funktion gibt dir das darauffolgende Dokument zurück wenn Du Kategorie markiert hast. Hoffe hilft und ist sicher noch optimierungsfähig. Aber jetzt erst mal Feierabend und Bierchen trinken.  ;D

Function NextDocInUIView(db As NotesDatabase,UIView As NotesUIView) As NotesDocument
   Dim vwnav As NotesViewNavigator
   Dim vwEntry As NotesViewEntry
   Dim Found As Boolean
   
   Found=False
   
   Set vwnav=UIView.View.CreateViewNav
   
   Set NextDocInUIView=db.GetDocumentByID(UIView.CaretNoteID)
   If NextDocInUIView Is Nothing Then
      Set vwEntry=vwnav.GetFirst
      Do Until vwEntry Is Nothing
         If vwEntry.IsCategory Then
            If vwEntry.ColumnValues(vwEntry.IndentLevel) =uiview.CaretCategory Then
               Found=True
            End If
         Else
            If Found Then
               Set NextDocInUIView=db.GetDocumentByID(vwEntry.NoteID)
               Exit Do
            End If
         End If
         Set vwEntry=vwnav.GetNext(vwEntry)
      Loop
   End If
End Function
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 20.02.07 - 10:32:05
Dankeschön! Hoffe, das Bier hat geschmeckt :-)
Nachdem ich in Deiner Funktione den NotesView ausdrücklich deklariere
   Set view=uiview.View
   Set vwnav=view.CreateViewNav
läuft es (vorher gabs ne Object variable not set).
Allerdings auch nur bei maximal zwei Kategorienebenen (eine Haupt-, eine Unterkategorie) - bei einer tieferen Hierachie gibt die Funktion falsche Ergebnisse oder ebenfalls ovns zurück.
Es bleibt also spannend ...
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Tode am 20.02.07 - 14:11:15
Die Funktion von Fedaykin fällt dummerweise schon bei diesem Konstrukt auf die Nase:

HauptKat 1
 Unterpunkt
HauptKat 2
  Unterpuinkt

Wenn der Cursor also auf "Unterpunkt" auf Hauptkat 2 steht, es aber unter Hauptkat 1 schon einen Unterpunkt mit gleichem Namen gibt...

So einfach geht das nicht...

Tode
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 20.02.07 - 14:31:12
 :-: Ich gewinne langsam den Eindruck, dass das gar nicht geht ...
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: DerAndre am 20.02.07 - 14:47:13
Doch Verweis auf...  ;)

Was Du willst habe ich schon mal umgesetzt, allerdings ist das ein wirklich wilder Stunt und ein Konglomerat aus Script- und Formel- Agenten.

Da mich das ganze mehrere Tage meiner Zeit gekostet hat, und ich als Dienstleister mit sowas mein Geld verdiene, kann ich Dir den Code nicht einfach hier posten, aber nur so viel:

Mit Script alleine habe ich keinen Weg gefunden, das zu realisieren.

Bis jetzt...

Ich habe mir grade noch mal die Klassen angesehen und bin auf eine Lösung gekommen, die eventuell klappen könnte, nur wie's mit der Performance aussieht, weiss ich nicht:

Du könntest einen NotesViewNavigator bauen und Dich über GetNextCategory so lange durchhangeln, bis Entry.NoteID = CaretNoteID ist. Dann kannst Du ja wieder rückwärts gehen bis Du auf der Haupt- Category bist...

Gruß
Tode
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 20.02.07 - 15:00:18
Da ich auch mein Geld damit verdiene & schon mehrere Stunden sinnlos daran rumprogrammiert habe, hab ichs jetzt über eine Kategorienauswahl per Dialogbox umgesetzt ;)

Aber das wäre doch mal ein Hinweis an die Kollegen von Big Blue: CaretCategory als Array mit den Kategorien und Subkategorien des Entries. Dann würde man die ganze Frickelei nicht benötigen.
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Thomas Schulte am 20.02.07 - 15:07:58
Dann mach doch einen Enhancement Request auf.  >:D
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 20.02.07 - 15:19:35
Ah, Dich gibts ja auch noch ... Grüss' nach Gulmbach  :)
Zu meiner Schande muss ich gestehen, dass ich noch nie einen Request eröffnet habe. Ich würde das aber schon als sinnvolle Erweiterung sehen (falls nicht doch noch ein Notes-Titan 312.ten Grades daher kommt und es als Funktion GetEntryHierarchy oder so umsetzt).
Erklärsdmerwissgäid?
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Thomas Schulte am 20.02.07 - 15:24:46
Im Prinzip machst du einen ESR auf und verlangst dann wenn es keine Lösung gibt das daraus ein Enhancement Request gemacht wird.
ESRs kannst du hier: http://www-306.ibm.com/software/support/probsub.html?ibmsst=allSupport aufmachen.
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: jo@chim am 20.02.07 - 15:30:49
Und dann warte ich solange wie auf die Zertifikate für mein 6er Update (11 Monate)?  :P
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Thomas Schulte am 20.02.07 - 15:37:03
Länger .....
Titel: Re: LS: Übergeordnete Kategorie Wert zurückgeben
Beitrag von: Tode am 20.02.07 - 18:20:56
da meine Lösung ziemlich aufwändig ist, und die Anpassung an neue Ansichten immer ein wenig Zeit bedeutet, lässt mich das Thema nicht mehr los.

Also habe ich angefangen zu experimentieren.

Folgendes habe ich rausgefunden:

Die Pseudo- NoteID ist so aufgebaut:

80 000004
80 steht dabei für die "Ebene":
Oberste Ebene = 80
Zweite Ebene = 81
dritte Ebene = 82
u.s.w.
Man kann also die Ebene berechnen aus:

(xx - 80) + 1 (hexadezimal)

so weit so gut.

der hintere Teil ist schlicht und ergreifend eine laufende Nummer, die immer um 4 erhöht wird.
Die Nummerierung erfolgt dabei nach dem auftauchen in der Ansicht.

Erstelle ich als erstes ein Dokument mit der Kategorie "Test", dann hat die Kategorie Test in der Ansicht die Nummer
80000004

Erstelle ich nun ein Dokument in der Kategorie "ABC\123", dann bekommt die Kategorie "ABC" die Nummer
80000008
und die Kategorie "ABC\123" die Nummer
8100000C

"ABC\345" bekommt dann logischerweise
81000010

So... wir wissen jetzt also, dass jede Kategorie genauf 1 ID bekommt.
Kriegen wir es jetzt hin, eine Zuordnungstabelle Kategorie <> ID zu erstellen, dann wissen wir immer, wo der Cursor steht.
(dummerweise nur auf EINER replik auf EINEM Server... wir müssten das Ding also für jeden Server getrennt ablegen)

Problem: Diese Zuordnungstabelle muss ziemlich dynamisch sein. Entfernt man das letzte Dokument aus einer Kategorie und erstellt dann ein neues, dann hat die "neu erzeugte" View- Kategorie auch eine neue Nummer....

Vielleicht hat ja jemand Lust auf ein wenig Brainstorming....

Gruß
Tode