Получение списка пользователей на сервере

  • Автор темы SparkLone
  • Дата начала
S

SparkLone

#1
Доброго,
Не подскажете элегантный способ програмно получить полный список пользователей?
Задача:
Админ на сервере запускает базу, она ему выводит список ВСЕХ пользователей зарегеных на сервере (по крайней мере тех для которых создан MailFile). Список вида: First/Last/Mailfile с чекбоксами. После выбора нужных пользователей жмется кнопка ОК и производятся определенные действия над мейловыми базами юзеров. При этом то же поле MailFile возможно будет скрыто от глаз (т.к. для принятия решения о выборе пользователя Админом это не нужное поле, но нужное для выполения задачи после выбора).

Таким образом вопроса 2:
1) Каким образом лучше реализовать визуальную составляющую? Т.е. как отобразить список с чекбоксами на форме (опять таки, чтобы часть полей были доступны впоследствии, но невидимы пользователю скрипта)
2) Каким образом сформировать сам список пользователей. может я чего то не понимаю, но нет функции которая бы просто вывела список зарегенных пользователей.
Полную информацию как я понимаю содержит только вьюха $Users, но там куча дублирования

DbLookup не совсем подходит, т.к. по сути в моей задаче никаких ограничений нет
Код:
query = "@DbLookup({Notes} : {NoCache}; {" + db.Server + "} : {"+ db.FilePath + "}; {$Users}; {" + ЧтоИщем + "}; {ПолеГдеИщем})"
DbColumn в принципе по идее то что надо, но опять таки - куча дубликатов в сулчае выборки из $Users
Код:
query = "@DbColumn({Notes} : {NoCache}; {" + db.Server + "} : {"+ db.FilePath + "}; {$Users}; 1)"
Единственный вариант, который вижу - делать комплексно - сначала делать выборку всех MailAddress из вьюхи $VIMPeople (ибо FullName не всегда уникально как я понял), распарсить MailAddress на 2 части: FullName и MailDomain. И по этим данным проводить поиск в вьюхе $Users. Хотя муторно все это, может есть все таки более "человеческий" способ?
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#2
а чем не подходит стандартный диалог выбора пользователей ?
например, многозначное поле типа dialogList, на второй закладке выбор - Use Address dialog for choices
или тоже самое в кнопке для поля fl_Users(Text or Names)
Код:
def:=fl_Users;
names:=@PickList( [Name]; def );
 
S

SparkLone

#3
Как я понял - данный метод позволяет выбирать группы и вообще любых юзеров (с локальной книги в том числе), мне же необходимо чтобы :
1) выборка шла только с определенного адрес-бука
2) возможно было задавать критерии выборки (к примеру всех юзеров у которых задан mailFile)
Второй пункт по моему даже @PickList( [Custom].. не позволит сделать..
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#4
Для: SparkLone
NotesDatabase.Search

А визуально вывести в Listbox.
 

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#5
можно извратиться сделать по другому..
например, в АК создать группу, в которую будут входить необходимые пользователи ..
аналогично написанному ранее в поле или в кнопку добавить @sort(@ExpandNameList("имя сервера:"путь к АК"; "имя группы"))..

единственный минус это нужно вести контроль (руками, агентами) актуальности пользователей в этой группе

но LS использовать все же лучше (тут я согласен с Medevic)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#6
можно не извращаться, а сделать свое представление в нужной домино директории, который будет формировать нужный набор документов, в нужном виде....

а потом юзать банальное NotesUIWorkspace.PickListCollection()
 

Omh

Lotus team
04.07.2007
2 210
1
#7
Для: Akupaka
Да ладно, как будто всегда у девелопера есть права ковырять серверный names.nsf?
Думаю надо каким-то образом сёрчить names.nsf а результ, действительно, запихнуть в ws.Prompt
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#8
Для: Akupaka
Да ладно, как будто всегда у девелопера есть права ковырять серверный names.nsf?
Думаю надо каким-то образом сёрчить names.nsf а результ, действительно, запихнуть в ws.Prompt
хм... может и "да ладно" :) я просто предложил способ. в условиях задачи не сказано было, что его нельзя править :)

ЗЫ: у меня был доступ, и мне даже доверяли!.. ;)
 
S

SparkLone

#9
Для: Medevic
Я так понимаю, NotesDatabase.Search - альтернатива поиску (вместо того же DBLookup к примеру, прост опозволяет задавать условия отбора). Но не совсем понял как его применять, как показал хелп + поиск - его используют чтобы находить нужные документы. К примеру db.Search({Form = "имя формы" & FLD_NAME = "значение поля"}, Nothing, 0)
В моем же случае надо делать выборку строк, или я не прав?
1) Как можно сделать поиск в конкретном View?
2) можно ли за раз вытащить нужные поля (а не так как я описывал в первом посте)?
Был бы признателен за пример, хотя бы в общем виде..

Для: Akupaka
К сожалению ковырять names.nsf мне действительно никто не даст.
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#10
Для: SparkLone
Код:
Dim dc As NotesDocumentCollection
Dim db As NotesDatabase
Dim doc As NotesDocument
...
Set dc = db.Search({Form = "Person" & !@IsNull(MailFile)}, Nothing, 0)
Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
... что-нибудь делаем
Set doc = dc.GetNextDocument(doc)
Wend
Получим коллекцию документов (пользователей с непустым полем "MailFile"). Проходимся по ним в цикле и выводим куда надо.
<!--QuoteBegin-SparkLone+7:02:2008, 14:03 -->
<span class="vbquote">(SparkLone @ 7:02:2008, 14:03 )</span><!--QuoteEBegin-->1) Как можно сделать поиск в конкретном View?
[snapback]97092" rel="nofollow" target="_blank[/snapback]​
[/quote]
Метод notesView.FTSearch. Или взять условие отбора и скопировать его в db.Search.

<!--QuoteBegin-SparkLone+7:02:2008, 14:03 -->
<span class="vbquote">(SparkLone @ 7:02:2008, 14:03 )</span><!--QuoteEBegin-->2) можно ли за раз вытащить нужные поля (а не так как я описывал в первом посте)?
[snapback]97092" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно. Через @DbLookup, @DbColumn.
Иначе только в цикле.
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#11
ну, тогда Search удобно юзать :rolleyes:
только это не альтернатива, а сам поиск и есть :D
возвращает метод коллекцию документов, что просто - отлично и удобно :)

Form = "Person", MailSystem = "1", вот тебе условия поиска по базе домино директории человеком у которых нотес-почта используется, к примеру...

если поиск по виду, то либо notesView.getDocumentsByKey, либо notesView.FTSearch...
 
S

SparkLone

#12
Для: Medevic
Спасибо, по моему то что дохтур прописал ) И забить тогда на вьюхи и проч извращенья с парсиногом полей. Плохо, когда теоритическая база слабенькая..
Теперь буду разбираться с выводом в ListBox )
 
S

SparkLone

#13
Хм.. Кстати, только у меня так, или так запланированно - db.Search({Form = "Person"}, Nothing, 0) - не ищет самого запустившего как я понял.
Я проверял работу скрипта под админом на сервере (комп - одновременно и клиент и сервер) - его данных почему то в списке нет..
 
S

SparkLone

#15
Sandr
А в каких случаях его может не быть? Под админом я прекрасно логинюсь в клиенте, все вроде работает.
Для меня этот вопрос довольно критичен. Ибо если для каких то пользователей данный способ (db.Search) не прокатит - нужно делать по другому..
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#16
Для: SparkLone
Так открой АК и посмотри есть ли он там.
db.Search ищет всё. Главное, чтобы права были. :)
 
S

SparkLone

#17
Для: Medevic
Уууй.. Прошу прощения, невнимательность - вот главная беда.. ) Первый документ всегда глотался.
Код:
			Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
Set doc = dc.GetNextDocument(doc)
If(doc Is Nothing) Then
Msgbox "end"
Else
...			
End If
Wend
Кстати, не подскажете по поводу сортировки, как я понимаю, надо будет определять свой массив, сортировать его. Затем на основании его делать отдельное поле, с уже отсортированными данными (в виде красиво отформатирвоанной строки толкьо с нужными полями), и на основании этого поля - делать вывод в ListBox соответственно. При выборе в ListBox нужных строк - по номерам строк делать выборку из массива и собственно уже работать с нужными данными.
Вариант нормальный или опять таки есть решение намного проще? )
 
S

Sandr

#18
мдя...:)

Код:
 Set doc = dc.GetFirstDocument
While Not (doc Is Nothing)
Msgbox "Делаем тут, а не после получения следующего!!!"
Set doc = dc.GetNextDocument(doc)
Wend
 

Omh

Lotus team
04.07.2007
2 210
1
#19
Для: Sandr
Ведь может захотеться удалить документ в цикле, али нет?

Так что конструкция вида
Код:
Dim Doc as NotesDocument
Dim NextDoc as NotesDocument

Set Doc = Dc.GetFirstDocument
While Not Doc Is Nothing
Set NextDoc = Dc.GetNextDocument(Doc)
'а тут хоть удаляй :)
Set Doc = NextDoc
Wend
тоже имеет право на жизнь ;)
 
S

SparkLone

#20
Sandr
Эээ.. Я поместил код с ошибкой чтобы показать где именно она была. Потому и разместил код с фразой "Первый документ всегда глотался", к слову что я понял где она находится )

По поводу сортировки и отображения - задача может усложниться.. Возможно прийдется давать возможность пользователю выбирать - по каким полям сортировать.