Gelesen-Markierung pro Benutzer abfragen - Wie geht das?

  • Hallo Oliver,


    ich bin dabei dieses Thema weiter zu verfeinern. Vielleicht könntest du mir bei einer Problemstellung helfen:


    Ich möchte weiterhin das ich pro Element eine Kennzeichnung "von allen gelesen" per Regel vergeben kann wenn das Element von allen gelesen wurde.


    Entgegen dem o.g. Ansatz möchte ich aber nun eine Positivliste erstellen, allerdings auch hier mit der Besonderheit, dass einige Benutzer von der Regel ausgenommen werden. Diese Benutzer (z.B. "admin", "skriptbenuter", "pop3mobile", "hmueller" (wo kommt der denn her?? ;-) etc.) habe ich zusätzlich zu ihren definierten Benutzergruppen einer Benutzergruppe "Ausnahmeliste" zugewiesen.


    Nun würde ich gerne eine Abfrage "ReadByAll" programmieren die zum einen die Gruppenberechtigungen als auch die Benutzergruppe berücksichtigt. Also etwa:


    Wenn Element von allen Benutzern mit folgenden Kriterien gelesen wurde: (Zugriff auf Gruppe = TRUE) UND (Benutzergruppe <> "Ausnahmeliste"), dann ReadByAll = TRUE.


    Mein bisheriger Code der ermittelt welcher Benutzer das Element bereits gelesen hat sieht so aus:



    Aus den Docs habe ich mir schon versucht ein paar Infos zu holen und wollte mit der Klasse "
    TFbmUserCache.GetCategoriesByID" arbeiten, allerdings bekomme ich es nicht hin die beiden Bedingungen miteinander zu verknüpfen.


    Kannst du helfen?


    Lieben Gruß

  • Hi,


    im Grunde hast du schonmal alles richtig gemacht. Mit UserCache.GetCategoriesByID kannst du alle Benutzergruppen eines einzelnen Benutzers ermitteln. Also brauchst du eine zweite Integer-Liste. Da kommt das Ergebnis der Abfrage rein der Benutzergruppe rein.


    Ob der Benutzer in der entsprechenden Gruppe ist, kannst du so feststellen:


    if CategoriesOfUser.Find(123) then


    Etwas schwieriger wird es aktuell die ID der "Ausnahmeliste" festzustellen. Momentan gibt es da leider keine Anzeige in Greyhound für und eine passende Funktion GetIdByName bzw. andersrum fehlt da leider auch noch für Benutzergruppen (so sind sie ja eigentlich auch nicht gedacht - die Idee ist aber trotzdem gut). Du kannst die ID ermitteln, indem du einfach mal den Inhalt von CategoriesOfUser per SaveToStr in eine Anmerkung oder so schreibst. Die höchste ID sollte dann die gesuchte sein.


    Ein besser Weg wäre aber in meinen Augen, wenn du für die "Ausnahme"-Benutzer einfach ein benutzerdefiniertes Feld vom Typ "Boolean" verwendest und es für Benutzer freigibst. Ich glaube das ist wesentlich praktischer. :)

  • Hey Oliver,


    vielen Dank für die Infos. Das Prinzip habe ich verstanden, doch leider scheitere ich an der Syntax. Keine Ahnung wie ich die Categories in eine Integer Liste bekomme. Auch hatte ich die Idee die beiden Listen miteinander zu kombinieren um die Schnittmenge aus "nicht in der Ausnahmeliste" und "hat Zugriff auf Gruppe" zu erhalten (per TFbmIntegerListCombineType), hab ich aber auch nicht hinbekommen.


    Ich stoße mal wieder zu schnell an meine Grenzen, was auch daran liegt, dass ich nicht nach wie vor nicht verstehe was Klassen, Units, Funktionen, Items, Variablen usw. wirklich sind und wie man sie miteinander kombiniert. Da fehlt mir dann doch das nötige Fachwissen. Frustrierend! :-( Ich muss mal irgendwann nen Kurs machen... Trotzdem Danke für deine Zeit.


    In dem Zusammenhang wäre es schön generell mehr Quelltext-Beispiele in den Docs zu finden. Bei "SaveToStr" hat mir das beispielsweise sehr weiter geholfen. Vielleicht hast du ja noch mehr davon?


    Lieben Gruß

  • Hallo zusammen,


    nachdem mir Oliver mal wieder uneingeschränkt bereitwillig geholfen hat unseren Greyhound noch ein Stückchen praktischer zu gestalten möchte ich euch das Ergebnis dieser Zusammenarbeit nicht vorenthalten :-)


    Es gibt Nachrichten und Notizen die von mehreren zur Kenntnis genommen werden müssen/sollen. Sei es der letzte Newsletter vom Lieferanten an die Einkäufer, das letzte Schreiben zum Stand der Dinge des Steuerberaters an die Geschäftsleitung oder die interne Notiz an alle mit der Bitte seine jeweilige Tasse abends in die Spülmaschine zu räumen.


    Letzte Notiz beispielsweise landet vermutlich in einer Gruppe "Intern" wo sie bis zum Sankt Nimmerleinstag unerledigt den Arbeitsfluss stört, weil niemand diese erledigen kann, da man ja nicht weis ob die anderen die Info schon gelesen haben. Häufen sich solche Elemente, dann nimmt sie irgendwann niemand mehr wahr und man ist versucht wieder interne Rundmails zu schreiben.


    Mit einer Regel "Lesestatus ermitteln" bin ich also genau das Problem angegangen, dass man nicht weiß ob man ein Element erledigen soll oder nicht, weil man nicht weiß ob es von anderen Kollegen bereits zur Kenntnis genommen wurde.


    Die Idee


    Ich wollte in Abhängigkeit davon, ob ein Element von allen gelesen wurde oder nicht, eine Kennzeichnung setzen. Ist diese gesetzt, so weiß ich das alle das Element gelesen haben. Ich kann es nun nach dem Lesen entweder selber erledigen oder ich kann das eine Regel für mich erledigen lassen. Der Posteingang oder die Notizen-Pinwand räumt sich also quasi von selber auf, sofern man meine Regel mit einer Regel "Alle gelesenen Elemente die zuletzt vor x Tagen bearbeitet wurden erledigen" kombiniert.



    Zudem kann man an diesen Status weitere Regeln anknüpfen, beispielsweise eine Erinnerung an die entsprechenden Kollegen oder eine Nachricht an den Chef :whistling:


    Problematik


    Schnell stellte sich heraus das diese eigentlich simple Anforderung komplizierter umzusetzen ist als ursprünglich gedacht. Es waren nämlich im Wesentlichen drei Aspekte hinsichtlich der Frage "Wer ist eigentlich mit von allen gelesen gemeint?" zu berücksichtigen:

    • Benutzer wie der 'admin' oder auch eventuell vorhandene Systembenutzer (für RPC-Skripte, oder Gastbenutzer) müssen ausgenommen werden. Ansonsten erhält ein Element nie die Kennzeichnung von allen gelesen weil der 'admin' einfach kein Benutzer des Tagesgeschäfts ist, aber dennoch Zugriffsrechte hat (dazu gleich mehr).
    • Nicht alle Benutzer die im Greyhound angelegt sind sind auch aktiv. Deaktivierte Benutzer müssen ebenfalls aus der Abfrage rausgenommen werden
    • Letztendlich ist dann noch entscheidend, wer denn überhaupt Zugriff auf das jeweilige Element besitzt. Ein Benutzer ohne Zugriffsrechte kann ein Element schwerlich lesen und somit auch nicht seinen notwendigen Beitrag zur Erledigung leisten.


    Zudem war es mir dann auch nicht ausreichend zu wissen, DAS ein Element von allen gelesen oder auch noch nicht von alle gelesen war, sondern ich wollte auch wissen WER er noch nicht gelesen hat.


    Lösung


    Ich habe eine Regel "Lesestatus ermitteln" programmiert welche die oben genannten Anforderungen erfüllt und bei uns jetzt im Einsatz ist. Ich stelle sie hiermit der Allgemeinheit zur Verfügung. Vielleicht findet der ein oder andere diese ja hilfreich oder mag sich von den Quelltextzeilen weiter inspirieren lassen.


    Bitte habt Verständnis dafür das ich keinen Support für die Regel leisten und auch nicht dafür garantieren kann das sie in allen Umgebungen einwandfrei funktioniert. Es ist eine reine Quelltextregel, also solltet ihr schon ein paar Grundkenntnisse von der Greyhound Skriptsprache haben um sie richtig zu verwenden.


    Wer noch weitere Ideen oder Verbesserungsvorschläge hat - immer her damit! 8o


    Lieben Gruß

  • Merci Sascha, genau das hab ich gesucht und funktioniert 1a!


    EDIT: Nach etwas Anwendung stören mich nun die vielen Einträge im Systemprotokoll, eben alle 30 Minuten - ich möchte aber auch die Frequenz der Regelausführung nicht auf mehrere Stunden ausweiten. Gibt es eine Möglichkeit, die Systemprotokolleinträge bei Regelausführung zu unterbinden?




    PS: Ja ich weiß, uralt Thread :)

  • Das unterbinden der Systemprotokolleinträge ist nicht möglich. Damit würde man das Prinzip der vollständigen Nachvollziehbarkeit in GREYHOUND untergraben. Gerade mit Hinblick auf eine GoBD-Konformität ist so eine Möglichkeit ein No-Go.


    Ich habe mir deinen Wunsch aber zum Anlass genommen daraus einen Featurewunsch in unserem internen Bugtracker zu erstellen.