Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: botschi am 19.08.08 - 15:36:07

Titel: Verschachtelte Gruppen auflösen
Beitrag von: botschi am 19.08.08 - 15:36:07
Hallo,

über die Suche hier im Forum habe ich etliche Lösungen gefunden, die aber scheinbar unter ND8 nicht mehr funktionieren.
Ich habe u.a. diese Lösungen probiert
Code
This Formula language code retrieves the list of values in a Lotus Notes nested 
group, and then adds them to a list one by one -- as a common name if it's a 
person, or by looking up the values if it's a group. 
All you need to do is: 
1. Copy the Formula language code below. 
2. Paste it into a computed, multi-value field. 
3. Change the group name to match yours. 
4. Run the code. 
You can also add error trapping for the lookups as needed. 
db := "names.nsf";
svr := @Subset(@DbName;1);
luKey := "YourGroupNameGoesHere";
List := @DbLookup("":"NoCache"; 
svr: db; "($VIMGroups)"; luKey; 3);
@Unique(@Name([CN]; List));

@For(n := 1; n <= @Elements(List); 
n := n + 1; @If( (@Left(List[n] ; 2) = "CN") ; 
temp := temp : @Name([CN] ; List[n]); 
temp := temp : @Name([CN] ; @DbLookup
("":"NoCache";svr:db;"($VIMGroups)"; List[n] ; 3))
)
);

@Sort(temp)

Note: This tip will only work if you are using Lotus Notes Domino R6.x or 
greater. I know this may not always work for everyone, but it solved a lot of 
headaches for me.


################################################################################
###########
In R6, @expandgrouplist doesn't seem to work anymore. This @formula will get 
all members of groups, and it will also work for nested groups.

Code

ndb := @ServerName:"names.nsf";
vfield:=@IfError(@DbLookup
("":"nocache";ndb;"($Users)";Group;"Members");
group);
REM {Store result here};
resultList:="";
REM {List of processed groups to avoid infinite loops};
 processGroups:=""; counter:=0; @While(@Trim(vfield)!= "";
 allv := @Trim(vfield);
 current := allv[1];
 
 type := @NameLookup([noupdate];current;"Type");
 @if( @LowerCase(type)="group";
  @Do(
   add:= @If( @IsMember(current;processGroups);
      "";
      @IfError(@DbLookup("":"nocache";ndb;"
($Users)";current;"Members");current));
   @If(@Trim(add)="";
    resultlist:=resultlist:add;
    add=current;
    resultlist:=resultlist:add;
    resultList:=@Replace(resultList:add;current;"")
   );
   processGroups:=@Trim(processGroups:current);
   vfield:=@Trim(@Replace(allv;current;""):add)
  );
  @Do(
   resultList:=resultList:current;
   vfield:=@Trim(@Replace(allv;current;""))
  )
  );  
 @StatusBar(@Text(counter)+" - "+ 
@text(@Elements(vfield))+") > " + vfield[1] + "...");
 counter:=counter+1
);
@Trim(@Unique(resultList))

MEMBER FEEDBACK TO THIS TIP 
This solution is limited to R6 but it sure is simple. 
REM {This formula expands a group name 3 levels deep.} 

resultList := group; 
@For(n := 1;n <= 3;n := n + 1; 
resultList := @Transform(resultList;"var";
@IfError(@DbLookup("";"85256648:005C15D7";
"Groups"; var; "Members");var))); 
@Trim(@Unique(resultList)); 

—Bruce F. 
************************ 
A simpler solution that works fine in Notes 6 is: 
@ExpandNameList(Server : Database; GroupName) 
—J. Herman 

und diese
Code
	groupName$ = "GRUPPE"
	groupMembers = Evaluate( |@ExpandNameList(@Dbname;"| & groupName$ & |")| )
	Forall names In groupMembers
		Print names
	End Forall
es werden aber keine verschachtelten Gruppen aufgelöst.
Mach ich generell was falsch oder funktioniert die undokumentierte Formel nicht mehr??

Matthias
Titel: Re: Verschachtelte Gruppen auflösen
Beitrag von: koehlerbv am 19.08.08 - 15:39:26
Das ist die Sache mit den undokumentierten functions ...

Warum schreibst Du Dir das nicht fix selber in LS?

Bernhard
Titel: Re: Verschachtelte Gruppen auflösen
Beitrag von: botschi am 19.08.08 - 15:44:45
Weil ich das Rad nicht neu erfinden wollte und davon ausging, dass es eben nicht fix geht...
Ich habe die gepostete "Lösung" ja seit Jahren in meiner Sammlung, aber noch nie gebraucht- bis jetzt und stelle fest, sie geht nicht (mehr).


Matthias
Titel: Re: Verschachtelte Gruppen auflösen
Beitrag von: Hirnbeisz am 19.08.08 - 19:03:32
@ExpandNameList(_Server:_db;_group);
funktioniert auch unter Domino 8 genau so zuverlässig ( oder auch nicht zuverlässig) wie in den Vorgängerversionen, das Problem ist, daß ab einer bestimmten Größe (16 K ???) die Auflösung ohne jegliche Fehlermeldung nicht mehr funzt!
Titel: Re: Verschachtelte Gruppen auflösen
Beitrag von: thomson666 am 20.08.08 - 07:50:33
jop kann ich nur zustimmen, funktioniert perfekt der Befehl bis 16k...
leider eben ohne error... und das kann ja immer mal vorkommen das du 16k bei verschachtelten Gruppen erreichst..
Titel: Re: Verschachtelte Gruppen auflösen
Beitrag von: botschi am 20.08.08 - 10:34:28
Das ist ja aber genau das, was ich wollte...! Die Anzahl der Personen in den verschachtelten Gruppen.
Ich habs jetzt so gemacht, müsste eigentlich tun
Code
grp := gruppe;
ndb := @ServerName:"names.nsf";
vfield:=@IfError(@DbLookup("":"nocache";ndb;"($VIMGroups)";grp;"Members");
"Falsch");
REM {Store result here};
resultList:="";
REM {List of processed groups to avoid infinite loops};
processGroups:="";
counter:=0;
@While(@Trim(vfield)!= "";
 allv := @Trim(vfield);
 current := allv[1];

 type := @NameLookup([NoUpdate];current;"Type");
 @If( @LowerCase(type)="group";
  @Do(
   add:= @If( @IsMember(current;processGroups);
      "";
      @IfError(@DbLookup("":"nocache";ndb;"
($Users)";current;"Members");current));
   @If(@Trim(add)="";
    resultlist:=resultlist:add;
    add=current;
    resultlist:=resultlist:add;
    resultList:=@Replace(resultList:add;current;"")
   );
   processGroups:=@Trim(processGroups:current);
   vfield:=@Trim(@Replace(allv;current;""):add)
  );
  @Do(
   resultList:=resultList:current;
   vfield:=@Trim(@Replace(allv;current;""))
  )
  );
 @StatusBar(@Text(counter)+" - "+
@Text(@Elements(vfield))+") > " + vfield[1] + "...");
 counter:=counter+1
);
@Trim(@Unique(resultList));
@For(n := 1;n <= 5;n := n + 1;
resultList := @Transform(resultList;"var";

@IfError(@DbLookup("":"NoCache";@ServerName:"names.nsf";"($VIMGroups)"; var; "Members");var)

));

erg := @Elements(@Trim(@Unique(resultList)));
@SetField("ergebnis";erg)

Matthias