Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: awagner am 04.04.08 - 09:33:35

Titel: Rolle von User auslesen
Beitrag von: awagner am 04.04.08 - 09:33:35
Hallo zusammen,

ich habe folgendes Problem:

Ein User kann mehrere Rollen haben (z.B. [LESER] und [OE_1])
Es gibt aber auch User, die nur die Rolle [LESER].
In der DB gibt es einige Rollen, die mit "OE_" beginnen, die dann lauten: [OE_1], [OE_2], [OE_*].

Hat ein User eine Rolle, die mit "OE_" beginnt, soll diese eine Rolle in ein Feld geschrieben werden.

Wie kann ich nun überprüfen, ob der User eine Rolle hat, die mit "OE_" beginnt?

Grüße
Andi
Titel: Re: Rolle von User auslesen
Beitrag von: ZaLudtske am 04.04.08 - 09:39:13
In welcher Sprache soll das gelöst werden Script oder Formel-Sprache?

In Script würde ich die mich durch die Werte iterieren und Funktion Left zum Vergleich nutzen.

In der Formel-Sprache würde ich mit der @For-Schleife und die @Left Funktion nutzen.

Bestimmt geht es auch ohne @For, da müßte man etwas spielen oder einer unserer Cracks schießt das aus der Hüfte.

Rainer
Titel: Re: Rolle von User auslesen
Beitrag von: m3 am 04.04.08 - 09:41:17
@UserRoles und @IsMember hätte ich gesagt. Das müsste sogar ohne For-Schleife gehen.
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 04.04.08 - 09:48:35
am liebsten wärs mir in der formelsprache.

@m3: aber mit @IsMember müsste ich doch den User auf alle Rollen überprüfen

z.B.: @If(@IsMember("[OE_1]";@UserRoles); "[OE_1]"; nächste prüfung auf [OE_2]...) das wird ja ewig viel...

das 1 und 2 bei den Rollen steht nur als beispiel, ich kanns also ned hochzählen...
Titel: Re: Rolle von User auslesen
Beitrag von: m3 am 04.04.08 - 09:52:11
Andi, Designer-Hilfe genau lesen ;) Du kannst Ihm auch für die Rollen eine Liste übergeben.
... @IsMember("[OE_1]":"[OE_3]":"[OE_3]";@UserRoles) ...
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 04.04.08 - 09:53:51
 ::)

mh... ok,,, da haste wohl recht...

aber dann weiß ich, dass er mitglied einer dieser rollen ist,,,
und wie kann ich dann genau diese eine rolle in ein feld schreiben?

ich steh momentan ziemlich aufm schlauch
Titel: Re: Rolle von User auslesen
Beitrag von: ZaLudtske am 04.04.08 - 09:58:25
Bei der Übergabe einer Liste als Suchkriterium müssen alle Elemente der 1. Liste in der zu druchsuchende Liste vorhanden sein, so dass dies hier nich klappen würde.

Hier ein Zitat aus der Designer-Hilfe:

Zitat
Wenn es sich bei beiden Parametern um Listen handelt, gibt diese Funktion den Wert 1 zurück, sofern alle Elemente von Textliste1 in Textliste2 enthalten sind.


Ich denke wenn man ohne @for arbeiten will, dann sollte die Form ungefähr so aussehen:

@if(@left(@userroles; 4) = "OE_"; ....

Das währe mein Ansatz den ich ausbauen würde.

Rainer
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 04.04.08 - 10:01:45
das mit dem @if(@left(@userroles; 4) = "OE_"; .... ist ein ganz guter ansatz
Danke schon mal,,,

aber was mach ich, wenn bei den User-Rollen eben jetzt zwei Rollen drinstehen

z.B. Leser und OE_1

dann kann ich ja nicht mehr mit @left arbeiten, weils ja dann immer falsch ist

 ??? ??? ???
Titel: Re: Rolle von User auslesen
Beitrag von: ZaLudtske am 04.04.08 - 10:05:11
Bei Listen werden alle Elemente der Liste verarbeitet. Sprich bei einem Element einmal, bei 2 Elmenent zweimal ....

Ich weis nur nicht ob du alle Rollen in das neue Feld übertragen willst oder nur eine.

Rainer
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 04.04.08 - 10:06:10
in dieses Feld möchte ich nur die eine Rolle, die mit "[OE_" beginnt übertragen
Titel: Re: Rolle von User auslesen
Beitrag von: ZaLudtske am 04.04.08 - 10:08:52
Dann würde ich mit der @For-Schleife arbeiten und nur gezielt die Einträge in das andere Feld schreiben die mit "[OE_" beginnen.

Rainer
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 04.04.08 - 10:23:32
so ich hab jetzt endlich ne lösung gefunden ;)

hab ein berechnetes feld genommen und als vorgabewert folgendes reingeschrieben:

_role := @Middle(@Implode(@UserRoles);"[OE_"; "]");
_role := "[OE_" + _role + "]";
_role;

danke für eure Hilfe!!!
Titel: Re: Rolle von User auslesen
Beitrag von: LN4ever am 04.04.08 - 23:37:07
Mit dieser Lösung ist natürlich für alle (periodischen) Agenten, die im Server- Userkontext laufen - dazu zählen auch die Agenten, die vom Benutzer angestoßen werden, aber ONBEHALF mit einem anderen Benutze, z.B. dem Server laufen - der Befehl COMPUTEWITHFORM ab sofort strengstens verboten.

Gruß

Norbert
Titel: Re: Rolle von User auslesen
Beitrag von: koehlerbv am 05.04.08 - 00:18:42
Gehört die Methode ComputeWithForm der NotesDocument class nicht sowieso streng verboten, Norbert? Mit all den bekannten Nebenwirkungen? Aber Du hast natürlich ohne jegliche Frage vollkommen Recht - wenn das eingesetzt wird, zeigt ComputeWithForm, dass es unter diesen Umständen wirklich funktioniert  ;)

Zum eigentlichen Thema: Kommt für Andi auch LotusScript in Frage? Damit liesse sich das doch sicherer und vor allem transparenter abdecken.

Bernhard
Titel: Re: Rolle von User auslesen
Beitrag von: LN4ever am 05.04.08 - 13:22:29
Ich habe mich höchst indirekt ausgedrückt und mit meinem Posting einen - durchaus bedenkenswerten - Seiteneffekt in den Vordergrund gehoben. Jetzt möchte ich einmal deutlicher werden. Dafür komme ich auf den Ursprungstext des ersten Postings zurück:

Zitat
Hat ein User eine Rolle, die mit "OE_" beginnt, soll diese eine Rolle in ein Feld geschrieben werden.

Wie kann ich nun überprüfen, ob der User eine Rolle hat, die mit "OE_" beginnt?

Die Philosophie lehrt uns: was ich nicht sagen kann, das kann ich auch nicht denken. Deshalb ist sprachliche Klarheit so wichtig. Weil sie uns hilft, den richtigen Lösungsansatz zu suchen. Alle Antworten stürzen sich allein auf den zweiten Punkt, die technische Umsetzung einer technischen Anfrage.

Lautet dort die Anforderung nicht vielmehr: In jedem Dokument vom Typ X soll für jede Rolle [OE_x] vermerkt werden, wenn mindestens ein Benutzer mit einer solchen Rolle [OE_x] dieses Dokument gelesen/bearbeitet/freigegeben/abgelehnt hat.

Das klingt nach Workflow. Soll/muß das wirklich unbemerkt geschehen oder ist es nicht vielleicht viel erstrebenswerter, den zu protokolierenden Vorgang auch bewußt durch Drücken einer Schaltfläche herbeizuführen und mit Namen und Datum zu protokollieren ? Muß ein Benutzer etwas tun oder soll eine Maschine etwas tun ?

Erst eine klare Vorstellung davon, was ich will, führt mich zu einer Lösung, die der Anforderung entspricht.

Und meine feste Überzeugung in diesem Fall ist, daß hier eine nicht problemadäquate Lösung gesucht und eingesetzt wurde, und zwar nicht aus Mangel an Codierungsfähigkeit, sondern aus mangelhafter Problemanalyse.

Gruß

Norbert
Titel: Re: Rolle von User auslesen
Beitrag von: koehlerbv am 07.04.08 - 00:43:52
Volle Zustimmung, Norbert. Es ist ja nach wie vor unklar, *was* wirklich *wann/unter welchen Bedingungen* *genau* erfolgen soll.
Und mit dem gefundenen Konstukt kann sehr viel schief gehen: ComputeWithForm hast Du schon erwähnt, wie schnell ist ein @Command ([ToolsRefreshSelectedDocs]) vom Admin eingesetzt, ein User hat mehr als eine OE_-Rolle usw.
Solange unbekannt ist, was wirklich erreicht werden soll, sind wirklich hilfreiche Antworten (die erstmal ja mehr in Richtung Architektur gehen müssen) nahezu unmöglich. Das "Erledigt"-Symbol vor dem Thread halte ich daher auch für verfrüht - vor allem in Hinsicht darauf, dass hier in Zukunft auch andere auf den Thread stossen werden und denen dann ggf. suggeriert wird: "So macht man das.". Das "Was" ist ja noch immer unklar ...

Bernhard
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 07.04.08 - 08:12:52
Guten  Morgen zusammen,

Aufgabenstellung ist es, das Leute Dokumente aus einer Datenbank nur dann Lesen bzw. Bearbeiten dürfen, wenn dieses Dokumente jemand aus seiner Abteilung erstellt hat.

Ein User kann höchstens 3 Rollen haben (siehe unten), aber nur eine OE_-Rolle!

Es gibt jetzt folgende Felder, die die Berechtigung steuern.

f_Full   - - - Rolle [FULL]; Autorenfeld; diese Rolle hat auf alle Dokumente Schreibrecht
f_Read - - - Rolle [READ]; Leserfeld; diese Rolle hat auf alle Dokumente Leserechte
f_OE - - - Rolle [OE_*]; Autorenfeld; diese Rolle hat auf die Dokumente aus der eigenen Abteilung Schreibrechte

Die Felder werden alle beim Anlegen berechnet.

In dieser Datenbank wird es (vorerst) keine Agenten geben, oder irgendwelche große Funktionen, wo die ComputeWithForms-Problematik auftauchen könnte.

@Bernhard: LotusScript kommt für mich auch in Frage, ich dachte mir nur, dass es vll. in Formel leichter wäre ;)

@Norbert: Habe das Erledigt-Symbol wieder entfernt.

Gruß Andi

Titel: Re: Rolle von User auslesen
Beitrag von: eknori am 07.04.08 - 08:24:52
Wenn es immer nur eine Rolle mit f_OE... gibt, dann würde ich es mit script machen:

etwa so:

Dim session As New NotesSession
Dim db As NotesDatabase
Dim acl As NotesACL
Dim entry As NotesACLEntry
Set db = session.CurrentDatabase
Set acl = db.ACL
Set entry = acl.GetEntry( session.UserName )
Forall r In entry.Roles
  if instr(cstr(r),"f_OE") > 0 then
    ' .... schreibe die Rolle in Feld
  end if
End Forall
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 07.04.08 - 08:46:05
Die User sind aber nicht namentlich in der ACL drin, sondern immer als Gruppe, die zu einer Rolle gehört.

und mit dem Befehl acl.GetEntry( session.UserName ) frage ich ja immer nur auf einen eindeutigen Namen ab.

Bei mir kommt es beim Schleifen-Start zu nem Laufzeit-Fehler "Object Variabel Not Set".

von dem her wird das wohl nicht so klappen, oder liege ich da jetzt falsch?
Titel: Re: Rolle von User auslesen
Beitrag von: eknori am 07.04.08 - 09:04:40
Gucke mal hier (http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/d223b12683f6a1438525711d006d2f9d?OpenDocument).
Evtl kommt du damit weiter
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 07.04.08 - 09:09:37
@eknori: Danke, das sieht jetzt aufn ersten Blick sehr hilfreich aus ;)

Aber wieso kann ich das mit der Formel, die ich oben angegeben habe, nicht lösen, wenn ein ComputeWithForms o.ä. ausgeschlossen werden kann?

Ich kann mir momentan keine negativen Auswirkungen vorstellen...
Titel: Re: Rolle von User auslesen
Beitrag von: koehlerbv am 07.04.08 - 11:20:45
Warum brauchst Du bei dieser Aufgabenstellung überhaupt solch ein Formelkonstrukt? Du willst das Autorenfeld doch sicher bei Erstellen des Dokumentes belegen. Dazu erstellst Du einfach ein Autorenfeld "Berechnet bei Anlegen" und schreibst dort die Rollen des aktuellen Users mit @UserRoles hinein. Du brauchst das doch nicht zu reduzieren auf "[OE_*]".

Wegen ComputeWithForm:
Wenn Du ein *berechnetes* Feld hast, dann würde ein ComputeWithForm immer die Rollen des *aktiven* Benutzers ermitteln und setzen. Und wenn das gerade der Server ist, mit dessen ID der Agent signiert wurde ...

HTH,
Bernhard
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 07.04.08 - 12:05:53
Das brauche ich aus diesem Grund, weil der User mehrere Rollen haben kann und dann werden ja alle Rollen in das Autorenfeld geschrieben...

Und es kann sein, das ein User eben mehr Rollen besitzt: [LESER], [OE_1]

Der User soll also alle Dokumente sehen können und die Dokumente von der Abteilung OE_1 bearbeiten können.

Aber wenn ich jetzt alle Rollen in ein Feld schreibe, so wird der User mit der Rolle [LESER] auch zum Bearbeiter.

Aus diesem Grund brauche ich eben dieses Konstrukt.

noch kurz zu ComputeWithForms:
Das mit dem berechneten Feldern ist mir klar, nur wird so ein Agent in dieser DB nicht laufen, deswegen sollte es auch keine Problme geben
Ich weiß... Sag niemals nie ;)

Wird mein Problem jetzt klarer?
Titel: Re: Rolle von User auslesen
Beitrag von: koehlerbv am 07.04.08 - 12:14:00
Dann hau' doch die unbenötigten Rollen mit @Trim (@ReplaceSubstring ... wieder heraus.

Bernhard
Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 07.04.08 - 13:15:29
aber was spricht gegen diese lösung???

_role := @Middle(@Implode(@UserRoles);"[OE_"; "]");
_role := "[OE_" + _role + "]";
_role
Titel: Re: Rolle von User auslesen
Beitrag von: dirk_2909 am 07.04.08 - 14:10:43
Code
@Middle(@Implode(@UserRoles);"[OE_"; "]");
Das spricht dagegen. Warum ein @Implode?

benutz doch mal @Transform. Da benötigst Du nur eine Zeile Code.


Titel: Re: Rolle von User auslesen
Beitrag von: awagner am 08.04.08 - 10:21:26
ich bekomm's mit dem @Transform ned hin  :(

@Transform( Liste ; Variablenname ; Formel )

ok, die Liste ist noch klar (@userroles) und bei der Variable irgend ne Variable,,,

Aber was muss ich jetzt bei meiner Formel hinterlegen, dass er mir nur die Rollen ausgibt, wo vorn dran ein "[OE_" steht?!


@dirk: was ist an nem @Implode so schlimm?