Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: dia am 06.10.08 - 10:57:26

Titel: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 10:57:26
Ich brüte jetzt schon eine Weile über dem Problem ohne eine Lösung gefunden zu haben.

Ich habe ein Listenfeld in dem ich Mehrfachwerte zulasse.
Nun möchte ich gern, dass beim Speichern (der Zeitpunkt spielt eigentlich keine Rolle) alle Einträge in dem Listenfeld ausgewählt werden.

Mit Call uidoc.FieldSetText("Feldname", "Wert") kann ich einen Wert auswählen aber nicht mehrere bzw. alle. Und Call uidoc.FieldSetText("Feldname", "Wert1" : "Wert2") mag er auch nicht.

Jemand eine Idee?
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: DAU-in am 06.10.08 - 11:03:27
Im Backenddokument hast du Zugriff auf das Item als Array.
Aber ich verstehe den Sinn nicht:

Der Anwender wählt erst einige Werte aus, und anschliessend werden beim Speichern einfach alle eingetragen?
Warum muss der Anwender da überhaupt rumklicken?

Grüsse

DAU-in
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: jBubbleBoy am 06.10.08 - 11:08:06
Im Frontend musst das so machen:
uidoc.FieldSetText("Feldname", "Wert1, Wert2")

, ist hier das Trennzeichen für Mehrfachwerte, so wie im Feld definiert.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Thomas Schulte am 06.10.08 - 11:14:53
Anita hat recht.

Was ist der Sinn des ganzen?

Wenn ich beim Speichern eh alle Werte aktiv schalte, warum dem Benutzer dann überhaupt die Illusion geben das er da irgendetwas beeinflussen kann?
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 11:18:11
Das Feld ist unsichtbar und wird vom Benutzer nicht bearbeitet. Denkbar wäre aber ein Button "alle Auswählen" für den Benutzer um ihn nicht alle einzeln anhaken zu lassen.

uidoc.FieldSetText("Feldname", "Wert1, Wert2") hat jetzt auf anhieb erstmal gar nichts bewirkt. Es ist danach nichts ausgewählt. Ich teste das nochmal in einer etwas leereren Maske.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: jBubbleBoy am 06.10.08 - 11:23:27
Wenn es unsichtbar ist, dann kannst Du es auch nicht im Frontend bestücken, dann nur im backend.
uidoc.document.feldname = array
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 11:32:20
Super vielen Dank jBubbleBoy mit uidoc.document.feldname = array funktionierts. Wobei ich nicht ganz verstehe warum uidoc.FieldSetText("Feldname", "Wert1, Wert2") nicht funktioniert, denn zum testen ist das Feld im Moment natürlich sichtbar. Aber gut seis drum per Backend funktionierts.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: DAU-in am 06.10.08 - 12:11:49
Warum willst da bei einem versteckten Feld mit Frontendmethoden arbeiten, wenn du beim Speichern im Backend etwas belegst?
Und warum machst du nicht einfach ein berechnetes Feld daraus?
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Thomas Schulte am 06.10.08 - 12:22:55
Und wenn schon, dann probiers es mal damit:

uidoc.fieldsettext("Feldname",split("wert1,wert2,wert3,...",","))
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: jBubbleBoy am 06.10.08 - 12:39:42
uidoc.fieldsettext("Feldname",split("wert1,wert2,wert3,...",","))

ich hab es zwar nicht getestet, das sollte aber nicht funktionieren ;) denn der Rückgabewert ist hier ein Array und das klappt nicht mit der Funktion "fieldsettext".
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 12:54:58
Warum willst da bei einem versteckten Feld mit Frontendmethoden arbeiten, wenn du beim Speichern im Backend etwas belegst?
Und warum machst du nicht einfach ein berechnetes Feld daraus?

Die Datenbank ist nicht von mir. Da ich aber heute anscheinend der einzige Notes Entwickler hier bin ist das Problem bei mir gelandet.
Ich möchte nicht mit Frontendmethoden arbeiten. Ich suchte nur irgend einen Weg das Problem zu lösen. Und da im QuerySave schon einiges an code stand hab ich meinen code einfach unten dran gehangen.
Was für einen Vorteil hätte ich wenn ich das Feld berechnet mache?
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Thomas Schulte am 06.10.08 - 13:05:26
Da deine Benutzer offensichtlich nur die Möglichkeit haben, alles an oder alles aus, würdest du dir mit einem berechneten Feld den ganzen Script Zirkus sparen können.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 13:24:46
Da deine Benutzer offensichtlich nur die Möglichkeit haben, alles an oder alles aus, würdest du dir mit einem berechneten Feld den ganzen Script Zirkus sparen können.

Verstehe ich nicht ganz. Ich muss das Feld nur berechnet machen und schon sind automatisch alle Einträge darin ausgewählt?

Die Werte müssen alle ausgewählt sein, weil es eine (villeicht auch noch mehr) Stellen gibt in der einfach der Feldname genutzt wurde um zu überprüfen was dort für Einträge drin sind. Das hat natürlich nicht funktioniert, weil das Ergebnis immer nichts war, weil man nur die ausgewählten Werte zurück bekommt. Also war meine Idee um das Problem zu lösen einfach dafür zu sorgen, dass alle ausgewählt sind. Somit müsste das ganze dann auch an allen Stellen funktionieren die ich jetzt vielleicht nicht gefunden habe.

Ach ja ich habs getestet:
uidoc.fieldsettext("Feldname",split("wert1,wert2,wert3,...",","))
Geht nicht weil er an der Stelle einen String erwartet.

Ahh ich glaube ich weiß worauf du hinaus willst. Wenn ich das Feld berechnet mache könnte ich vielleicht als Wert die gleiche Formel angeben wie bei der Auswahlformel der Liste. Das werde ich mal versuchen.

Getestet und funktioniert. Also ist die Lösung doch so einfach.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Thomas Schulte am 06.10.08 - 14:15:47
Die Werte müssen alle ausgewählt sein, weil es eine (villeicht auch noch mehr) Stellen gibt in der einfach der Feldname genutzt wurde um zu überprüfen was dort für Einträge drin sind. Das hat natürlich nicht funktioniert, weil das Ergebnis immer nichts war, weil man nur die ausgewählten Werte zurück bekommt. Also war meine Idee um das Problem zu lösen einfach dafür zu sorgen, dass alle ausgewählt sind. Somit müsste das ganze dann auch an allen Stellen funktionieren die ich jetzt vielleicht nicht gefunden habe.

Das ist jetzt wirklich AUA. Um die Korrektur der Überprüfug welche Werte ausgewählt wurden zu umgehen baust du die Anwendung einfach so um, das jetzt grundsätzlich immer alle Werte ausgewählt werden?

In der Logik ist ein Loch so groß, da kannst du mit einem Panzer durchfahren.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: DAU-in am 06.10.08 - 14:18:30

Die Werte müssen alle ausgewählt sein, weil es eine (villeicht auch noch mehr) Stellen gibt in der einfach der Feldname genutzt wurde um zu überprüfen was dort für Einträge drin sind. Das hat natürlich nicht funktioniert, weil das Ergebnis immer nichts war, weil man nur die ausgewählten Werte zurück bekommt. Also war meine Idee um das Problem zu lösen einfach dafür zu sorgen, dass alle ausgewählt sind. Somit müsste das ganze dann auch an allen Stellen funktionieren die ich jetzt vielleicht nicht gefunden habe.


Wie sollen dort auch Werte drin stehen, wenn das Eingabefeld versteckt ist?
Vasteh ich hier was nicht richtig?

Suchst du evt. nur eine Fehlerbehandluing für ein leeres Feld?
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Axel am 06.10.08 - 14:32:57
Das Feld ist unsichtbar und wird vom Benutzer nicht bearbeitet. Denkbar wäre aber ein Button "alle Auswählen" für den Benutzer um ihn nicht alle einzeln anhaken zu lassen.

 ??? ???


Ich habe gerade mal das Ganze quergelesen. Was willst du denn mit diesem Stunt überhaupt errreichen. Das Ganze muss doch einen Sinn haben. Im Gegensatz zu obiger Aussage. -> Wie soll den ein Benutzer was markieren können, wenn er das Feld gar nicht sieht?

Axel

PS: Hast du eigentlich auch einen richtigen Namen? Dich immer nur beim Nicknamen anzusprechen ist sehr unpersönlich.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 15:06:21
Also wie es scheint muss ich jetzt doch etwas weiter ausholen. Der Bug, der einem Benutzer aufgefallen war war folgender. Er hat ein Dokument erstellt. In dem Dokument hat er eine Gruppe gewhält die das Dokument in einer bestimmten Ansicht sehen können soll. Wichtig hierbei ist, dass anscheinend in der Datenbank eine eigene Benutzerverwaltung porgrammiert wurde. Man kann also dort Gruppen anlegen und den Gruppen Benutzer zuweisen. Nun hat der Herr ein Dokument erstellt das Für eine bestimmte Gruppe sichtbar sein sollte. Ein Benutzer aus der Gruppe konnte das Dokument jedoch in der Ansicht nicht sehen. Also rief man mich an. Ich habe mir also die Ansichtsauswahlformel der Ansicht angeschaut.

SELECT(@Contains(vrrAutor;@Name([CN];@UserName)) | @Contains(vrrFreigabePersonDisp;@Name([CN];@UserName)) | @Contains(vrrAdressatenGruppeDisp;"&V13_VRR_TR-Info_Admin") | @Contains(vrrAdressaten;@Name([CN];@UserName))) & (vrrDocStatus != "Papierkorb"   | @If((vrrFreigeben != "" & vrrFreigabe = "Ja")) & (Form = "vrrfrmNeuesDokument")& (vrrGueltigkeitDatum="" | vrrGueltigkeitDatum>=@Date(@Now)) | @AllChildren)

Die fette Stelle ist die, über die der Benutzer dieses Dokument angezeigt bekommen müsste. Also schaute ich mir die Maske an und suchte nach dem Feld vrrAdressaten. Das war ein unsichtbares Listenfeld. Das machte ich sichtbar und stellte fest, dass dort die richtigen Namen drin stehen. Jedoch wird mit @Contains(vrrAdressaten;@Name([CN];@UserName)) nur ausgewertet welche der Namen in der Liste denn auch selektiert sind. Und somit war vrrAdressaten logischerweise immer "". Die Liste war also korrekt gefüllt aber da kein Name selektiert war wurde das Dokument für die Person, die zwar in der Liste enthalten war nicht angezeigt, weil sie nicht selektiert wurde.

Also hätte ich die Ansichtsauswahl dahingehen ändern können, dass sie nicht den selektierten Wert der Liste abfragt sondern alle Werte in der Liste. Da wusste ich auf anhieb erstmal nich wie ich das machen könnte. Und des weiteren wusste ich nicht in welchen Ansichten vielleicht noch über diese Formel der Zugriff ausgewertet wird. Also war für mich die Lösung einfach alle Werte in der Liste selektieren und der Wert der abgefragt wird passt.

Zum Thema Benutzerverwaltun in einer Notesdatenbank braucht jetzt keine was zu sagen. Das finde ich auch unschön, und würde eine Benutzerverwaltung über die ACL vorziehen. Aber ich werde jetzt nicht die komplette Datenbank umkrämpeln.

Und nur nochmal um Missverständnisse zu vermeiden. Das Problem ist behoben und alles funktioniert einwandfrei. Wenn ihr trotzdem noch hilfreiche Tipps haben solltet dann bitte her damit.

Mein richtiger Name ist übrigens Mirko.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Axel am 06.10.08 - 15:17:01
Ok. Nun ist die ganze Sache klarer geworden. Normalerweise steuert man sowas über Leser- und/oder Autorenfelder. Aber sei's drum. Das Ganze im nachträglich umbauen birgt einiges an Risiken, sollte aber mal ins Auge gefasst werden.

Als einfache Alternative wäre auch z.B. ein einfaches berechnetes Textfeld (mit Mehrfachwerten) das alle entsprechenden Namen enthält denkbar. Dann bruahcst ud dir keine Gedanken zu machen welcher Wert jetzt selektiert wird oder werden muss.


Axel
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: DAU-in am 06.10.08 - 15:21:40

SELECT(@Contains(vrrAutor;@Name([CN];@UserName)) | @Contains(vrrFreigabePersonDisp;@Name([CN];@UserName)) | @Contains(vrrAdressatenGruppeDisp;"&V13_VRR_TR-Info_Admin") | @Contains(vrrAdressaten;@Name([CN];@UserName))) & (vrrDocStatus != "Papierkorb"   | @If((vrrFreigeben != "" & vrrFreigabe = "Ja")) & (Form = "vrrfrmNeuesDokument")& (vrrGueltigkeitDatum="" | vrrGueltigkeitDatum>=@Date(@Now)) | @AllChildren)

Die fette Stelle ist die, über die der Benutzer dieses Dokument angezeigt bekommen müsste. Also schaute ich mir die Maske an und suchte nach dem Feld vrrAdressaten. Das war ein unsichtbares Listenfeld. Das machte ich sichtbar und stellte fest, dass dort die richtigen Namen drin stehen. Jedoch wird mit @Contains(vrrAdressaten;@Name([CN];@UserName)) nur ausgewertet welche der Namen in der Liste denn auch selektiert sind. Und somit war vrrAdressaten logischerweise immer "". Die Liste war also korrekt gefüllt aber da kein Name selektiert war wurde das Dokument für die Person, die zwar in der Liste enthalten war nicht angezeigt, weil sie nicht selektiert wurde.


ik versteh nur Bahnhof. Was bedeutet für dich selektiert? für mich heisst das vom Anwender angehakt/ ausgewählt, aber das kann ja nicht zutreffen, da das Feld versteckt ist.
Und @contains prüft, ob der Wert im Feld enthalten ist.
Mit 'die Liste war korrekt gefüllt' meinst du, dass der betreffende Name zur Auswahl in einem Listenfeld stand?


Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: Thomas Schulte am 06.10.08 - 16:01:27
SELECT(@Contains(vrrAutor;@Name([CN];@UserName)) | @Contains(vrrFreigabePersonDisp;@Name([CN];@UserName)) | @Contains(vrrAdressatenGruppeDisp;"&V13_VRR_TR-Info_Admin") | @Contains(vrrAdressaten;@Name([CN];@UserName))) & (vrrDocStatus != "Papierkorb"   | @If((vrrFreigeben != "" & vrrFreigabe = "Ja")) & (Form = "vrrfrmNeuesDokument")& (vrrGueltigkeitDatum="" | vrrGueltigkeitDatum>=@Date(@Now)) | @AllChildren)

Hi Mirko ...

Wenn das jemals funktioniert haben sollte was mit dem Select in dieser Anwendung getrieben wird, dann kann das nur Zufall gewesen sein. Zumindest wenn ich von deinen bisherigen Informationen ausgehe.

Siehe Online Hilfe zu @UserName ...

Usage
When a formula runs on a server, the agent signer is considered the current user. Using @UserName on a local database or in a private view in a server-based database returns the user's name. You should not use @UserName in a public view, doing so produces unpredictable results. Also, if the field that you are referencing changes, you will get unpredictable results because the index has to be rebuilt to accommodate the new information.
One use for @UserName is to display only those documents relevant to the current user. For example, your Service Request database could use @UserName in the private view named Assignments to display each technician's assignments, weeding out everyone else's:
SELECT @UserName=AssignedTo
However, the user can still design a different private view that retrieves all documents, so don't depend on @UserName as a security mechanism.

Also das kann nur funktionieren wenn das in "private" Views eingebaut wurde.
Dann will ich aber nicht wissen wieviele Benutzer die Datenbank hat. Und schon gar nicht, ob irgendjemand sich Gedanken über die Update Mechanismen die hinter Private Views liegen MÜSSEN, wenn jemand den Source für das Ding verändert, gemacht hat.
Titel: Re: Alle Werte eines Listenfelds auswählen
Beitrag von: dia am 06.10.08 - 16:09:41
Ja mit "die Liste war korrekt gefüllt" meinte ich dass die Namen alle zur Auswahl standen jedoch war keiner der Namen ausgewählt. Und wenn man dann dieses Feld einfach über den Feldnamen mit @contains abfragt dann sagt immer: Ne ist nicht drin. Weil vrrAdressaten = "" ist. Erst wenn etwas selektiert ist also ausgewählt wurde würde in vrrAdressaten dann der ausgewählte Name erscheinen. Da aber alle Namen in der Liste, die zur auswahl stehen das Recht haben sollen müssen alle ausgewählt sein um auch mit dem @contain gefunden zu werden. Ich hoffe jetzt ists klar geworden. Das Textfeld mit Mehrfachwerten von Axel find ich schonmal eine gute Idee. Das ist eigentlich völlig ausreichend. Ich hab halt einfach das Listenfeld genommen weils schon da war und auch schon korrekt bestückt. Auch mit der Nutzung von Leser- und Autorenfeldern muss ich dir Recht geben.

Jetzt mache ich aber erstmal Feierabend und Danke nochmal an alle die sich bei der Lösung des Problems beteiligt haben.

Edit: Bei dieser einen Ansicht handelt es sich tatsächlich um eine private Ansicht. Die anderen Ansichten scheinen auf den ersten Blick nicht derartige Auswahlformeln zu beinhalten. Sie sind aber teilweise in der Gliederung per HideWhen Formeln verborgen worden und dort wird natürlich auch @UserName verwendet. Ich werde mir das morgen nochmal in Ruhe angucken.