Das Notes Forum
Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: help am 07.12.11 - 08:58:31
-
Hallo
und einen schönen guten Morgen.
ich habe 3 Listen mit Benutzern und möchte in der 4 ten Liste nur die Benutzer die in allen 3 Listen vorkommen
und auch nur diese dann anzeigen lassen ich hoffe Ihr könnt mir weiter helfen.
Listen Vergleich
_result:= @DbLookup("";"Server:"names.nsf";"($Users)";"ug-DeptManager";"members");
_result2:= @DbLookup("";"Server":"names.nsf";"($Users)";"ug-SectionManager";"members");
@If(as_department != ""; _result3:= @DbLookup("";Server":"names.nsf";"($Users)";as_department;"members");"");
Liste1:=@Text(_result);
Liste2:=@Text(_result2);
Liste3:=_result3;
Liste4 := @Replace(Liste1 ; Liste2 ; Liste3) ;
@Name([CN]; Liste4)
-
Erinnerst Du Dich an den Hinweis von Bernhard, keine Servernamen hart in Formeln einzutragen?
Beherzige das unbedingt, und zwar von Anfang an, sonst fällst Du eines Tages voll auf die Nase!
Ansonsten schau Dir mal @Keywords an
-
ups ok danke
-
Im grunde klappt das schon aber die liste ist schon fertig befor ich aus der combo box was ausgewählt habe ???
-
und es ändert sich auch nichts wenn ich einen anderen wert auswähle
-
Von Combobox stand bisher nichts in Deiner Problembeschreibung.
Ist das Feld berechnet? Ist in der Combobox eingetragen, dass das Dokument neu berechnet werden soll, wenn sich der Wert ändert ("Felder bei Schlüsselwertänderung aktualisieren")?
-
Hallo Peter
also ich habe eine combobox editierbar mit Schlüsselwertänderungen aktualisieren mit abteilungen ->Verkauf,Lager etc.
nun habe ich eine 2te Combobox editierbar mit Schlüsselwertänderungen aktualisieren-> Benutzer auswählen
Die 2 te Combobox hat d.o. angegebene Formel hinterlegt ich möchte nun eine Liste mit den nächsten Benutzer
beispiel
ich habe die abteilung verkauf gewählt
nun möchte ich in der 2 ten combobox den nächten vorgesetzten auswählen
der vorgesetzte muss benutzer der abteilung verkauf sein und in der gruppe managment oder in der gruppe geschäftsführer
Lösung???
-
Hast Du in der zweiten Combobox "Auswahl bei Dokumentaktualisierung aktualisieren" angekreuzt?
-
hallo peter
ja das habe ich
-
Gut, und nun sortiere bitte nochmal alles. Wo steht welche Formel? Welcher Fehler tritt wann und wo auf?
-
die Formel steht in der 2ten Combo box
-
Beantworte doch bitte wenigstens mal die Fragen, die man Dir stellt. So kann das wirklich nichts werden!
Bernhard
-
_result:= @DbLookup("";"Server:"names.nsf";"($Users)";"ug-DeptManager";"members");
_result2:= @DbLookup("";"Server":"names.nsf";"($Users)";"ug-SectionManager";"members");
@If(as_department != ""; _result3:= @DbLookup("";Server":"names.nsf";"($Users)";as_department;"members");"");
Liste1:=@Text(_result);
Liste2:=@Text(_result2);
Liste3:=_result3;
Liste4 := @Replace(Liste1 ; Liste2 ; Liste3) ;
@Name([CN]; Liste4)
diese Formel steht in der 2ten combobox
-
und wenn ich nun den ersten wert in der ersten combobox ändere sollte sich der wert in der zweiten combobox an hat des Formel auch ändern und das geschied nicht
da bleibt immer der selbe wert stehen
-
Die erste Combox heißt as_department?
-
ja genau
-
Dein Hauptproblem ist wohl diese Formel
Liste4 := @Replace(Liste1 ; Liste2 ; Liste3) ;
Liste1 sind die DeptManager (z.B. Hans Meier und Paul Schulze)
Liste2 sind die SectionManager (z.B. Werner Schmitt und Hugo Schröder)
Liste3 sind die Mitarbeiter der Abteilung (z.B. Fritz Müller)
Deine Formel macht jetzt folgendes:
In der Liste der DeptManager werden die SectionManager durch die Abteilungsmitarbeiter ersetzt.
Solange kein SectionManager gleichzeitig auch DeptManager ist, enthält die Liste nur die DeptManager, ansonsten werden diese Personen mit Doppelfunktion durch irgendwelche Mitarbeiter der Abteilung ersetzt. Und dazu schreibst Du, dass die Formel grundsätzlich funktioniert.
Ich behaupte entschieden das Gegenteil!
Also, dort musst Du ansetzen
-
ok und wenn ich nun das so schreibe
Liste1:=@Text(_result);
Liste2:=@Text(_result2);
Liste3:=_result3;
Liste4 := @Keywords(Liste1 ; Liste2;Liste3 ) ;
@Name([CN]; Liste4)
-
aber auch hier bekomme ich immer die selben mit arbeiter
ich möchte eigendlich die liste as_department mit der liste dept manager vergleichen oder
die liste as_department mit der Liste section manager vergleichen
-
Das Prinzip habe ich verstanden. Du solltest vielleicht Dein Problem in mehrere Stufen aufteilen.
Als erstes solltest Du in der ersten Box die Abteilung auswählen, so dass in der zweiten Box die Mitarbeiter der Abteilung angezeigt werden (also nur Deine Liste 3). Erst wenn das vernünftig funktioniert (Auswahl einer anderen Abteilung bringt eine geänderte Liste der Abteilungsmitarbeiter), fängst Du an, die Mitarbeiter zu filtern.
So kommst Du schneller voran und kannst den Fehler besser einkreisen.
-
Was soll eigentlich das @Text bei Liste1:=@Text(_result) ?
Das hat zwar mit dem eigentlichen Problem nichts zu tun, ist aber Quatsch.
Bernhard
-
Wahrscheinlich hat damit mal jemand eine Fehlermeldung umgangen, dann wird der Fehler in einen Text umgewandelt und kann weiterverarbeitet werden. Und solange kein Mitarbeiter "Eintrag im Index nicht gefunden" heißt, klappt das auch noch. Schön ist natürlich etwas anderes.
-
_result := @DbLookup("";"Server:"names.nsf";"($Users)";"ug-DeptManager";"members");
_result2:= @DbLookup("";"Server":"names.nsf";"($Users)";"ug-SectionManager";"members");
bei result fehlt bei "Server das hintere Hochkommata.
Das kann doch gar nicht funktionieren, oder?
-
bei result fehlt bei "Server das hintere Hochkommata.
Das kann doch gar nicht funktionieren, oder?
Das war die Reaktion auf meinen Mecker, dass Servernamen nicht hart verdrahtet werden sollten, daraufhin wurden im Beitrag die Servernamen durch "Server" ersetzt, was keinen Deut besser ist (da es immer noch hart ist und nur anonymisiert wurde). Dabei hat sie sich dann auch noch verschrieben...
-
Hallo Peter
ich habe deinen Rat befolgt und habe nun folgendes gemacht :
@If(as_department != ""; _result3:= @DbLookup("";"Server":"names.nsf";"($Users)";as_department;"members");"");
Augabe passt.
_result:= @DbLookup("";"Server":"names.nsf";"($Users)";"ug-DeptManager";"members");
Ausgabe passt
_result2:= @DbLookup("";"Server":"names.nsf";"($Users)";"ug-SectionManager";"members");
Ausgabe passt.
_temp:=_result+_result2;
_temp;
Ausgabe passt.
Bis hier hin passt das was mir das System zurückgibt,
aber ab hier nicht mehr.
_ergeb:="";
@For(i :=1;
i <= @Elements(_result3) & _ergeb = "";
i := i +1;
result := @If(
@IsMember(_result3; _temp); _result3 ; ""
)
);
_ergeb;
Das _ergeb bleibt leer
warum???
-
Hier passt wieder einiges nicht:
Was ist _result3? Das fragst Du nur ab, weist ihm aber nie einen Wert zu.
Deine Schleifenvariable inkrementierst Du nur, wenn i < als Anzahl der _result3-Elemente. Das wird natürlich nie was.
Zum Schluss lässt Du Dir _ergeb ausgeben. Das ist aber dank Deiner Zuweisung eh leer.
Bernhard
-
Hallo Bernhard
in _result3 stehen alle Mitarbeiter die uber das Feld as_department abgefragt wurden
@If(as_department != ""; _result3:= @DbLookup("";"Server":"names.nsf";"($Users)";as_department;"members");"");
Wenn as_department (comobox) Verkauf ausgewählt hat dann stehen in _result3 alle Mitarbeiter des Verkaufs.
somit ist _result3 nicht leer und je nach as_department stimmt die Ausgabe, wenn ich mit _result3 ausgeben lasse.
-
Ich würde da anders herangehen.
_result1 ist die Liste der Manager A
_result2 ist die Liste der Manager B
_result3 ist die Liste der Abteilungsmitarbeiter
Du willst als Ergebnis die Manager A und B der Abteilung haben.
_tmp1 := @Trim (@Replace (_result3; _result1; "")); -> Abteilungsmitarbeiter ohne Manager A
_tmp2 := @Trim (@Replace (_tmp1; _result2; "")); -> Abteilungsmitarbeiter ohne Manager A und ohne Manager B
@Trim (@Replace (_result3; _tmp2; "")); -> Manager A und Manager B der Abteilung
Einziger Haken an dem ganzen Konstrukt: Wenn sich in den Gruppen nicht nur Mitarbeiter, sondern auch Gruppen befinden, klappt das nicht (hat aber nichts mit meiner Formel, sondern mit Deinem Ansatz zu tun)
-
Danke Peter
aber ist das jetzt der Querschnitt von allen? Denn ein Benutzer fehlt mit bei der ausgabe der in der liste _result3 und auch in result ist sonst sind alle da die da sein müssten.
Nein da werden keine Gruppen eingetragen
-
Was verstehst Du unter Querschnitt?
Ich habe aus der Liste der Abteilungsmitarbeiter erst alle Manager A und B entfernt. Bleibt übrig eine Liste der Mitarbeiter, die weder Manager A noch B sind. Wenn dann aus der Liste aller Abteilungsmitarbeiter alle die entfernt werden, die weder Manager A noch B sind, müssen alle Manager A und B der Abteilung übrig bleiben.
-
dann ist es nicht richtig sorry vielleicht habe ich es falsch interpretiert.
_result3 ->liste der arbeiter
gebe mir die Namen der arbeiter welche in _result2 oder in _result sind
(so bekomme ich dann eine Liste der Vorgesetzten aus der Abteilung, es kann mehr als einer sein er muss nur in Manager A oder Manager B sein)
deswegen hatte ich die For schleife gemacht.
im Grunde würde ich sagen
Liste 1 ->alle Arbeiter aus der Gruppe as_department (aus der Combobox ausgewählt)
ergebnis:="";
For(i=1;i< als Liste1;i++)
ergebnis:=If( ist i nun in der ManagerA oder ManagerB dann gebe eine neue Liste mit diesen namen aus
so in etwa
-
Genau das mache ich (ginge sicher auch etwas kürzer, wollte es aber verständlich darstellen).
Also nochmal mit Beispieldaten
_result1 -> "A" : "B"
_result2 -> "C" : "D"
_result3 -> "A" : "D" : "E" : "F"
_tmp1 := @Trim (@Replace (_result3; _result1; "")); -> Abteilungsmitarbeiter ohne Manager A
_tmp1 := @Trim (@Replace ("A" : "D" : "E" : "F"; "A" : "B"; "")); -> "D" : "E" : "F"
_tmp2 := @Trim (@Replace (_tmp1; _result2; "")); -> Abteilungsmitarbeiter ohne Manager A und ohne Manager B
_tmp2 := @Trim (@Replace ("D" : "E" : "F"; "C" : "D"; "")); -> "E" : "F"
@Trim (@Replace (_result3; _tmp2; "")); -> Manager A und Manager B der Abteilung
@Trim (@Replace ("A" : "D" : "E" : "F"; "E" : "F"; "")); -> "A" : "D"
Irgendetwas falsch dabei?
EDIT: Wenn Du das allerdings nur stumpf kopiert hast, ist Dir sicher nicht aufgefallen, dass ich Deine Variable _result mit einer 1 versehen habe. Mir wäre wichtig, dass Du verstehst, was Du tust, und nicht nur kopierst.
"Nicht kopieren, kapieren" (Daniel Goeudevert)
-
nein eigendlich das was ich brauche, und trotzdem fehlt mir ein Manager hmm
dann ist es nicht richtig sorry vielleicht habe ich es falsch interpretiert.
_result3 ->liste der arbeiter
gebe mir die Namen der arbeiter welche in _result2 oder in _result sind
(so bekomme ich dann eine Liste der Vorgesetzten aus der Abteilung, es kann mehr als einer sein er muss nur in Manager A oder Manager B sein)
deswegen hatte ich die For schleife gemacht.
im Grunde würde ich sagen
Liste 1 ->alle Arbeiter aus der Gruppe as_department (aus der Combobox ausgewählt)
ergebnis:="";
For(i=1;i< als Liste1;i++)
ergebnis:=If( ist i nun in der ManagerA oder ManagerB dann gebe eine neue Liste mit diesen namen aus
so in etwa
-
"in etwa" gibt es in der Programmierung prinzipiell nicht.
An sich wäre doch die kürzeste Form mit dem Permutationsoperator:
Arbeitermanager := Arbeiter *= ManagerA : ManagerB
Bernhard
-
UI, der ist schick, ist mir bisher noch nicht zwischen die Ohren geraten ...
-
Ich verwende sowas gerne z.B. in Hide-Whens:
!(@UsernamesList *= "[Administrator]" : "[Supervisor]" : "[Confurator]")
@Functions und -Operatoren auf Notes-Listen sind schon eine tolle Sache!
Bernhard
-
Ich möchte mich bei erst einmal für Eutre Hilfe bedanken.
Es hat jetzt geklappt :-)
Hallo Berhard
deine variante ist schön kurz, aber ich denke das ich im Moment nur froh bin das es läuft :-)
-
Und wie sieht jetzt der fertige Code aus, Bea? Den einen oder anderen Tipp werden wir da bestimmt noch geben können. Und was man sich im frühen Statdium gar nicht erst angewöhnt ...
Bernhard
-
Hallo Berhard
hier der fertige code aber ohne eure Hilfe wäre ich glaube ich verzweifelt danke :-)
@If(as_department != ""; _result3:= @DbLookup("";"Server":"names.nsf";"($Users)";as_department;"members");"");
_result:= @DbLookup("";"Server":"names.nsf";"($Users)";"AG-SEC-Managment";"members");
_result1:= @DbLookup("";"Server":"names.nsf";"($Users)";"AG-DEP-Managment";"members");
_result2:= @DbLookup("";"Server":"names.nsf";"($Users)";"AG-DeputyDepManagement";"members");
_tmp1 := @Trim (@Replace (_result3; _result; ""));
_tmp2:= @Trim (@Replace (_tmp1; _result1; ""));
_tmp3:= @Trim (@Replace (_tmp2; _result2; ""));
_tmp4 := @Trim (@Replace (_result3; _tmp3; ""));
@Name([CN];_tmp4)
-
Abgesehen davon, dass Bernhards *= Operator viel eleganter ist, sieht das ja ganz gut aus.
Eine Änderung würde ich aber einbauen:
@If(as_department != ""; _result3:= @DbLookup("";"Server":"names.nsf";"($Users)";as_department;"members");@Return (""));
Das bewirkt, dass die Funktion nicht weiter ausgeführt wird, wenn as_department leer ist, sondern "" zurückgegeben wird. Damit sparst Du Dir bei jedem F9 bei nicht gefülltem as_department drei DBLookups, das spart gerade bei neuen Dokumenten etwas Laufzeit.
-
Ok Peter,
da gebe ich dir recht das Bernhard seins eleganter ist.
danke Ich habe das @Return noch eingetragen
schönen Abend euch noch
-
Ausserdem nimmt man NIEMALS einen DBLookup ohne Error- Handling. Löscht jemand eine der drei Gruppen, dann kannst Du kein einziges Dokument mehr erstellen und bestehende nicht mehr abspeichern...
-
Natürlich, Tode ...
Ich bin mal so frei, und schreibe ein Beispiel
_r:= @DbLookup("";"Server":"names.nsf";"($Users)";"AG-SEC-Managment";"members");
_result:= @If (@IsError (_r); "";_r);
Abgesehen davon würde ich die Variablen sprechender benennen, das macht es leichter, den Code später zu verstehen.
Und es sind immer noch die Server hart gedrahtet ...
-
@Peter
... du nimmst ja das geforderte ErrorHandling ;)
... es gibt aber beim @DBLookup noch den Parameter "[FailSilent]" - das entspricht dem Ergebnis des Fehlerhandlings...
Toni
-
Failsilent ist auch ok, aber ich nehm trotzdem meist Peters variante... da kriege ich im debug- fall schneller und ohne den Lookup an sich zu verändern den tatsächlichen Fehler (Eintrag im Index nicht gefunden, Ansicht existiert nicht, datenbank existiert nicht... Auch nach über 10 Jahren Notes- Programmierung passiert mir das nämlich ab und zu, dass mal ein Lookup nicht funktioniert, und dann returne ich einfach meine variable mit dem lookup und sehe sofort woran es klemmt...
-
... ich mach es zumeist mit [FailSilent] - und im Fehlerfall verwende ich dann temporär das Fehlerhandling