Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: help am 07.12.11 - 08:58:31

Titel: Listen vergleichen
Beitrag 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)
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 09:17:51
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
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 09:20:39
ups ok danke
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 09:28:55
Im grunde klappt das schon aber die liste ist schon fertig befor ich aus der combo box was ausgewählt habe ???
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 09:31:40
und es ändert sich auch nichts wenn ich einen anderen wert auswähle
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 09:55:55
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")?
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 10:10:09
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???
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 11:20:01
Hast Du in der zweiten Combobox "Auswahl bei Dokumentaktualisierung aktualisieren" angekreuzt?
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 11:43:11
hallo peter
ja das habe ich
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 11:52:11
Gut, und nun sortiere bitte nochmal alles. Wo steht welche Formel? Welcher Fehler tritt wann und wo auf?
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 12:26:15
die Formel steht in der 2ten Combo box

Titel: Re: Listen vergleichen
Beitrag von: koehlerbv am 07.12.11 - 12:29:36
Beantworte doch bitte wenigstens mal die Fragen, die man Dir stellt. So kann das wirklich nichts werden!

Bernhard
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 12:46:37
_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
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 12:47:50
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
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 12:50:23
Die erste Combox heißt as_department?
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 12:55:38
ja genau
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 12:58:46
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
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 13:00:24
ok und wenn ich nun das so schreibe

Liste1:=@Text(_result);
Liste2:=@Text(_result2);
Liste3:=_result3;
Liste4 := @Keywords(Liste1 ; Liste2;Liste3 ) ;
@Name([CN]; Liste4)
Titel: Re: Listen vergleichen
Beitrag von: help am 07.12.11 - 13:02:21
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
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 13:07:18
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.
Titel: Re: Listen vergleichen
Beitrag von: koehlerbv am 07.12.11 - 13:10:03
Was soll eigentlich das @Text bei Liste1:=@Text(_result) ?

Das hat zwar mit dem eigentlichen Problem nichts zu tun, ist aber Quatsch.

Bernhard
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 13:15:38
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.
Titel: Re: Listen vergleichen
Beitrag von: DAU-in am 07.12.11 - 18:29:17
_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?
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 07.12.11 - 20:32:44
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...
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 14:11:29
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???
Titel: Re: Listen vergleichen
Beitrag von: koehlerbv am 08.12.11 - 14:23:27
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
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 14:29:17
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.

 
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 08.12.11 - 14:31:30
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)
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 14:37:04
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
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 08.12.11 - 14:46:53
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.
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 14:53:24
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
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 08.12.11 - 15:03:30
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)
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 15:09:05
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
Titel: Re: Listen vergleichen
Beitrag von: koehlerbv am 08.12.11 - 15:13:51
"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
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 08.12.11 - 15:21:11
UI, der ist schick, ist mir bisher noch nicht zwischen die Ohren geraten ...
Titel: Re: Listen vergleichen
Beitrag von: koehlerbv am 08.12.11 - 15:25:35
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
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 15:56:00
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 :-)

Titel: Re: Listen vergleichen
Beitrag von: koehlerbv am 08.12.11 - 16:03:11
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
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 16:13:53
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)
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 08.12.11 - 16:20:26
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.
Titel: Re: Listen vergleichen
Beitrag von: help am 08.12.11 - 16:27:21
Ok Peter,
da gebe ich dir recht das Bernhard seins eleganter ist.

danke Ich habe das @Return noch eingetragen

schönen Abend euch noch
Titel: Re: Listen vergleichen
Beitrag von: Tode am 08.12.11 - 16:41:15
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...
Titel: Re: Listen vergleichen
Beitrag von: Peter Klett am 08.12.11 - 16:47:20
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 ...
Titel: Re: Listen vergleichen
Beitrag von: ata am 08.12.11 - 17:25:46
@Peter
... du nimmst ja das geforderte ErrorHandling ;)

... es gibt aber beim @DBLookup noch den Parameter "[FailSilent]" - das entspricht dem Ergebnis des Fehlerhandlings...

Toni
Titel: Re: Listen vergleichen
Beitrag von: Tode am 09.12.11 - 08:06:09
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...
Titel: Re: Listen vergleichen
Beitrag von: ata am 09.12.11 - 08:32:07
... ich mach es zumeist mit [FailSilent] - und im Fehlerfall verwende ich dann temporär das Fehlerhandling