There is not a method in lotusccript to get the list of all users belonging to a group, and to complicate matters, groups can contain other groups as members.
To solve this problem I wrote getUsersByGroup function that returns the list of users belonging to a group, provided that:
- the public names.nsf is accessible
- users have a document “Person” in the public address book
- groups are defined in the names
- the maximum number of nested groups is 100, but you can change this setting changing the variable maxNestedGroup
I think that the function getUsersByGroup is also an example of a recursive function that uses the method Static to avoid to define the same variables more times .
The variable incrementIndex defines the increase in the index of the matrix usersTempList when you reach the limit.
The getUsersByGroup function returns a variant containing a string array whose elements are the users in the format [Firstname Lastname] / [domain] / [Country]
Option Public
Option Declare
Sub Initialize
ReDim usersTempList(10) As String
Dim users As Variant
Dim group As String
group = "[group name]"
users = getUsersByGroup(group, usersTempList)
ForAll v In users
Print CStr(v)
End ForAll
End Sub
Sub Terminate
End Sub
Function getUsersByGroup(groupName As String, usersTempList() As String) As Variant
Static incrementIndex As Integer
Static maxNestedGroup As Integer
Static s As NotesSession
Static db As NotesDatabase
Static dbNames As NotesDatabase
Static vwGroup As NotesView
Static vwPerson As NotesView
Static counter As Integer
Static nestedCounter As Integer
Dim doc As NotesDocument
Dim members As Variant
Dim user As NotesName
Dim userName As String
If (s Is Nothing) Then
Set s = New NotesSession
Set db = s.Currentdatabase
Set dbNames = s.Getdatabase(db.server, "names.nsf")
Set vwGroup = dbNames.Getview("($VIMGroups)")
vwGroup.Autoupdate = False
Set vwPerson = dbNames.Getview("($VIMPeople)")
vwPerson.Autoupdate = False
counter = 0
nestedCounter = 0
incrementIndex = 10
maxNestedGroup = 100
End If
nestedCounter = nestedCounter + 1
Set doc = vwPerson.Getdocumentbykey(groupName, True)
If Not(doc Is Nothing) Then
If (counter>UBound(usersTempList)) Then
ReDim Preserve usersTempList(UBound(usersTempList)+incrementIndex)
End If
Set user = New NotesName(doc.FullName(0))
userName = user.Abbreviated
usersTempList(counter) = userName
counter = counter + 1
Else
Set doc = vwGroup.Getdocumentbykey(groupName, True)
If Not(doc Is Nothing And nestedCounter<maxNestedGroup) Then
members = doc.Getitemvalue("Members")
ForAll v In members
Set user = New NotesName(CStr(v))
userName = user.Abbreviated
Call getUsersByGroup(userName, usersTempList)
End ForAll
End If
End If
If (nestedCounter=1 And UBound(usersTempList)>1) Then
getUsersByGroup = FullTrim(usersTempList)
End If
nestedCounter= nestedCounter - 1
End Function

Leave a Reply