gcue Posted May 4, 2012 Author Posted May 4, 2012 right.. hmm im still open to count how many times a group gets processed.. if it happens 3 times then skip it dirty i know but at least it will stay fast.
water Posted May 4, 2012 Posted May 4, 2012 One time must be enough. I will post a simple example in a few minutes. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
water Posted May 4, 2012 Posted May 4, 2012 (edited) This should do what we need. A global string contains all processed groups separated by the pipe character ("|"). Before a group is processed the string is checked. If found, don't process this group again. If not, add the group to the string and process the group. Global $sGroupsProcessed = "|" $dbView = $db.GetView("Groups") $sGrouName = "Group name you want to process" $aResult = GetGroup_Members($dbView, $sGroupName) _ArrayDisplay($aResult) Exit Func GetGroup_Members($dbView, $group_name) If StringInStr($sGroupsProcessed, "|" & $group_name & "|") > 0 Then Return "" ; Group has already been processed $doc = $dbView.GetDocumentByKey($group_name, True) If Not IsObj($doc) Then Return "" $sGroupsProcessed = $sGroupsProcessed & $group_name & "|" ; Add processed group to string of processed groups $members = $doc.GetItemValue("Members") For $y = 0 To UBound($members) - 1 If $members[$y] = "" Then ContinueLoop If StringInStr($members[$y], "@") = 0 And StringInStr($members[$y], "CN=") = 0 Then ;this is how i know the member is a group $members_nested = GetGroup_Members($dbView, $members[$y]) ;so i pull group members again and add to the same array If IsArray($members_nested) Then $iMembers = UBound($members) ReDim $members[UBound($members) + UBound($members_nested)] For $z = 0 To UBound($members_nested) - 1 $members[$imembers + $z] = $members_nested[$z] Next EndIf Else ReDim $members[UBound($members) + 1] $members[UBound($members) - 1] = $members[$y] EndIf Next Return $members EndFunc ;==>GetGroup_Members Edited May 4, 2012 by water My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
gcue Posted May 4, 2012 Author Posted May 4, 2012 looking gooood - no crashes! only thing now is that i think its keeping the record count when theres an incrementation of the members array as part of its members ie: group a had 14 members and one of them was a nested group nested group members = 5 in the array result ill see the 14 members + the 5 + the number "14" from the first array haha
gcue Posted May 4, 2012 Author Posted May 4, 2012 should i go through the array and clean out any numbers? dont think any groups would have numbers as their names.
water Posted May 4, 2012 Posted May 4, 2012 As we never set element 0 of the resulting array to the number of elements I think $members = $doc.GetItemValue("Members")returns an array with the number of elements in element 0. ChangeFor $y = 0 To UBound($members) - 1toFor $y = 1 To UBound($members) - 1and the numbers should be gone. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
gcue Posted May 4, 2012 Author Posted May 4, 2012 yea i thought that too.. but the members returned from here $members = $doc.GetItemValue("Members") start at element 0 =)
water Posted May 4, 2012 Posted May 4, 2012 (edited) So the resulting array looks like? 14 ... 14 group names 5 ... 5 group names 3 ... 3 group names Edited May 4, 2012 by water My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
water Posted May 4, 2012 Posted May 4, 2012 When I check my code above we never set the number of elements in the array. Did you modify the code? Can you post the code you run? My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
gcue Posted May 4, 2012 Author Posted May 4, 2012 Func GetGroup_Members($dbView, $group_name) If StringInStr($sGroupsProcessed, "|" & $group_name & "|") > 0 Then Return "" $doc = $dbView.GetDocumentByKey($group_name, True) If Not IsObj($doc) Then Return "INVALID_GROUP" ;need this for later $sGroupsProcessed = $sGroupsProcessed & $group_name & "|" $members = $doc.GetItemValue("Members") For $y = 0 To UBound($members) - 1 If $members[$y] = "" Then ContinueLoop If StringInStr($members[$y], "@") = 0 And StringInStr($members[$y], "CN=") = 0 Then ;this is how i know the member is a group $members_nested = GetGroup_Members($dbView, $members[$y]) ;so i pull group members again and add to the same array If IsArray($members_nested) Then $iMembers = UBound($members) ReDim $members[UBound($members) + UBound($members_nested)] For $z = 0 To UBound($members_nested) - 1 $members[$imembers + $z] = $members_nested[$z] Next EndIf Else ReDim $members[UBound($members) + 1] $members[UBound($members) - 1] = $members[$y] EndIf Next $unique_members = _ArrayUnique($members) _ArrayDisplay($unique_members) Return $unique_members EndFunc ;==>GetGroup_Members
water Posted May 4, 2012 Posted May 4, 2012 Don't do _ArrayUnique in the function. Do it once in the main script. Change $unique_members = _ArrayUnique($members) _ArrayDisplay($unique_members) Return $unique_memberstoReturn $members My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
gcue Posted May 4, 2012 Author Posted May 4, 2012 (edited) i do it there because the main function has multiple column array and kind of difficult to do arrayunique with multiple dimensions and sometimes theres duped members between parent and nested groups Edited May 4, 2012 by gcue
water Posted May 4, 2012 Posted May 4, 2012 Then you could use _ArrayDelete to remove the first row of the array. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
gcue Posted May 4, 2012 Author Posted May 4, 2012 k - thanks for all your help water - definitely a huge help =)
water Posted May 4, 2012 Posted May 4, 2012 Fine. Problem solved - thread closed My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki
gcue Posted May 8, 2012 Author Posted May 8, 2012 (edited) not sure what is going on here.. it seems that the array unique is applying to the contacts array in GetContacts_XML($xml_file) function because some of the members are missing in some of the groups that are being queried. if i remove all the groups that are being queried and just leave the one that was missing members before - it works well even if it has multiple nested groups within it. however i need the arrayunique to accurately display each group's member listing expandcollapse popupFunc GetContacts_XML($xml_file) _XMLFileOpen($xml_file) If FileExists($xml_file) Then FileDelete($xml_file) EndIf Local $contacts[1] $dbView = $db.GetView("Groups") $groups_count = _XMLGetNodeCount("/imClientConfig/contactList/group") For $x = 1 To $groups_count $group_name = _XMLGetAttrib("/imClientConfig/contactList/group[" & $x & "]", "name") $group_members = GetGroup_Members($dbView, $group_name) If $group_members = "INVALID_GROUP" Then ReDim $invalid_groups[UBound($invalid_groups) + 1] $invalid_groups[UBound($invalid_groups) - 1] = $group_name EndIf For $y = 0 To UBound($group_members) - 1 ReDim $contacts[UBound($contacts) + 1][3] $contacts[UBound($contacts) - 1][0] = $group_name $contacts[UBound($contacts) - 1][1] = $group_members[$y] $contacts[UBound($contacts) - 1][2] = "PUBLIC_GROUP" Next Next _ArraySort($contacts, 0, 0, 0, 0) Return $contacts EndFunc ;==>GetContacts_XML Func GetGroup_Members($dbView, $group_name) If StringInStr($sGroupsProcessed, "|" & $group_name & "|") > 0 Then Return "" ; Group has already been processed $doc = $dbView.GetDocumentByKey($group_name, True) If Not IsObj($doc) Then Return "INVALID_GROUP" $sGroupsProcessed = $sGroupsProcessed & $group_name & "|" ; Add processed group to string of processed groups $members = $doc.GetItemValue("Members") ;~ _ArrayDisplay($members, "before") For $y = 0 To UBound($members) - 1 If $members[$y] = "" Then ContinueLoop If StringInStr($members[$y], "CN=") = 0 Then ;this is how i know the member is a group $members_nested = GetGroup_Members($dbView, $members[$y]) ;so i pull group members again and add to the same array If IsArray($members_nested) Then $iMembers = UBound($members) ReDim $members[UBound($members) + UBound($members_nested)] For $z = 0 To UBound($members_nested) - 1 $members[$iMembers + $z] = $members_nested[$z] Next EndIf Else ReDim $members[UBound($members) + 1] $members[UBound($members) - 1] = $members[$y] EndIf Next $unique_members = _ArrayUnique($members) If StringIsDigit($unique_members[0]) = 1 Then _ArrayDelete($unique_members, 0) EndIf for $x = UBound($unique_members)-1 to 0 step -1 If StringInStr($unique_members[$x], "CN=") = 0 Then ConsoleWrite($unique_members[$x] & @CRLF) _ArrayDelete($unique_members, $x) EndIf Next _ArraySort($unique_members) Return $unique_members EndFunc ;==>GetGroup_Members Edited May 8, 2012 by gcue
gcue Posted May 8, 2012 Author Posted May 8, 2012 (edited) i figured out the issue.. i added this line $sGroupsProcessed = "" before Return $unique_members thanks again water! Edited May 8, 2012 by gcue
Spiff59 Posted May 8, 2012 Posted May 8, 2012 (edited) Wouldn't you want to reset the variable to $sGroupsProcessed = "|" Since your search for already-processed-groups requires a leading "|" in front of each group name? Using the Assign()/IsDeclared() method might also accomplish what you're doing now by building and searching a string of processed group names. typo Edited May 8, 2012 by Spiff59
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now