Накосячил с полем типа Readers

  • Автор темы rainstor
  • Дата начала
R

rainstor

Гость
#1
Вобщем такая ситуация.

В документе есть поле AReaders (тип, соответственно, Readers). Поле многозначное.
При сохранении документа этому полю присваивается значение в зависимости от выбора радиобаттона. И я следующим образом присвоил значение этому полю:

If Source.FieldGetText("field1") = "var1" Then
Call Source.FieldSetText("AReaders", "[rol1]")
Call Source.FieldAppendText("AReaders", "[rol2]")
End If

И теперь я не могу ни просмотреть этот документ и вообще ничего-либо с ним сделать. Пробовал и на локальной копии и на сервере. Пробовал агентом и обновлять значение поля и удалять это поле. Ничего не помогает... Документ просто не отображается и все!

Помогите плиз.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#2
ну дык назначь себе эти роли. делов-то
а вообще - заведи роль [Admin] и добавляй ее по умолчанию во все документы в поле AuthorsID. И назначь эту роль себе... или еще кому-нить
 
R

rainstor

Гость
#3
Так эти роли назначены у меня :) В том-то и дело. И обе сразу назначал, и по отдельности каждую...
 
R

rainstor

Гость
#5
Почему авторс должен быть? И что мне теперь делать с этим документом? Можно его как-то сделать видимым или хотя бы удалить?
 
R

rainstor

Гость
#7
Нет, агента запускал и на серверной и на локальной копии
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#8
Почему авторс должен быть? И что мне теперь делать?
AuthorsID - поле предназначено для предоставления прав автора. т.е. если пользователь указан в этом поле - он получает возможность редактировать документ не только в UI но и в бекэнде
ReadersID - для предоставления прав на просмотр.

Если важны документы - попробуй сделать копию на локаль, но без наследования ACL. должно помочь.
Если и это не поможет - поменяй расширение базы на ntf и создай по этому "шаблону" новую базу

Ну и надеюсь понятно, что это все лучше делать с копией рабочей базы?

ну а вообще - разработку и тестирование надо вести на отдельной базе (шаблоне) а не сразу на боевой

Так.... что-то я пропустил... с этими ролями ты не видишь документ вообще? или просто не можешь его редактировать?
 
R

rainstor

Гость
#9
С Full Access Admininstration документ видно?
Я на сервере не являюсь администратором. Я просто программист
Если важны документы - попробуй сделать копию на локаль, но без наследования ACL. должно помочь.
Непомогло
Если и это не поможет - поменяй расширение базы на ntf и создай по этому "шаблону" новую базу
Непомогло
ну а вообще - разработку и тестирование надо вести на отдельной базе (шаблоне) а не сразу на боевой
Я в курсе об этом. Просто база - небольшая, вспомогательная и не особо важная. С другими базами так и делаю :)
Так.... что-то я пропустил... с этими ролями ты не видишь документ вообще? или просто не можешь его редактировать?
Вообще не вижу документ, которому присвоены эти роли.

А вообще роли я правильно присвоил? В смысле по коду?
 

divankin

Senjor developer
13.08.2009
182
0
Москва
#10
Запусти Lotus Administator.
Открой сервер, где находится база.
Включи режим Administration->Full Access Administrator. (Предполагается, что ты прописан в поле Full Access Administrators на вкладке Security в настройках сервера)
После перезахода в базу ты сможешь видеть все документы в базе.

Как уже сказали, на будущее заведи в базе роль, которую прописывай в поле типа Readers для всех документов с непустым полем типа Readers.

Update: если ты не имеешь права администрирования сервера, то попроси проделать все вышеописанное администратора.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#11
Программист с обрезанными правами это круто!!!!

If Source.FieldGetText("field1") = "var1" Then
Call Source.FieldSetText("AReaders", "[rol1]")
Call Source.FieldAppendText("AReaders", "[rol2]")
End If
меня терзают смутные сомнения по поводу правильности кода. Такие манипуляции надо делать в бекэнде
Почитай хелп по NotesItem class.
Обрати внимание на свойства IsAuthors, IsNames, IsReaders
 
R

rainstor

Гость
#13
Что интересно, если полю AReaders присваивать значение следующим образом и убрать multiple value, то все нормально роли работают:

If Source.FieldGetText("field1") = "var1" Then
Call Source.FieldSetText("AReaders", "[rol1]:[rol2]")
End If
 

divankin

Senjor developer
13.08.2009
182
0
Москва
#14
Насчет правильности кода:
1. Действительно, не рекомендуется это делать UI методами.
2. По результатам работы кода в поле будет одно значение "[rol1][rol2]" потому что notesUIDocument.FieldAppendText добавляет текст, а не новое значение. Чтобы данный код работал, нужно дополнительно добавить любой из разделителей, указанных в свойствах поля. Поскольку впоследствие вы легко можете решить изменить в поле разделитель, используемый для ввода, и не вспомните, что это разделитель еще где-то используется, то мы приходим к одному из обоснований пункта 1.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#15
Что интересно, если полю AReaders присваивать значение следующим образом и убрать multiple value, то все нормально роли работают
хм... интересно... у меня установлено multiple value и все работает без проблем

просто тут
Код:
If Source.FieldGetText("field1") = "var1" Then
Call Source.FieldSetText("AReaders", "[rol1]")
Call Source.FieldAppendText("AReaders", "[rol2]")
End If
не правильно написано. по итогам этих операций у тебя будет установлена "[rol1][rol2]". И multiple value тут не при чем
 
R

rainstor

Гость
#16
:)
1. Действительно, не рекомендуется это делать UI методами.
Тогда вопрос. Какими еще методами можно это сделать при сохранении документа? (Сильно не пинайте - я в Лотусе новичек :))
2. По результатам работы кода в поле будет одно значение "[rol1][rol2]" потому что notesUIDocument.FieldAppendText добавляет текст, а не новое значение. Чтобы данный код работал, нужно дополнительно добавить любой из разделителей, указанных в свойствах поля. Поскольку впоследствие вы легко можете решить изменить в поле разделитель, используемый для ввода, и не вспомните, что это разделитель еще где-то используется, то мы приходим к одному из обоснований пункта 1.
Я так и понял что метод добавляет текст - поэтому в заголовке и написал что накосячил :)
Т.о. у меня сейчас в поле AReaders всего 1 значение ("[rol1][rol2]")? И соответсвенно такую роль мне никогда не создать...
Но что самое противное, во вью, категоризованному по дате, отображается дата создания этого документа, а сам документ нет (он 1 в этой дате), и соответственно в тоталсах этот документ также считается... И как убрать это теперь, я не знаю. Сам документ я создам заново за 1 мин
хм... интересно... у меня установлено multiple value и все работает без проблем
Да я думаю и у меня будут работать, просто когда пробовал снял эту галку.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 785
42
35
Киев
#17
Тогда вопрос. Какими еще методами можно это сделать при сохранении документа? (Сильно не пинайте - я в Лотусе новичек smile.gif)
Заводишь на форме скрытые поля со всеми нужными аттрибутами. Выставляешь опцию Computed when Composed
И в свойстве Value пишешь "[rol1]":"[rol2]"
 

divankin

Senjor developer
13.08.2009
182
0
Москва
#18
1. Что делать со старым документом, я написал выше: нужно пойти к администратору и проделать вышеописанные действия на его машине.
2. Как программно, рекомендуемо сделать поле типа Readers с нужным значением.

Const READERS_FIELD = "Readers"
Dim doc As NotesDocument ' объект через который делаются все операции чтения/записи полей документа гуру Лотуса
Dim itReaders As NotesItem

Set doc = uidoc.Document ' считаем, что объект типа NotesUIDocument был уже получен ранее
Set itReaders = doc.ReplaceItemValue(READERS_FIELD, "")
itReaders.IsReaders = True
' Всякие роли, группы и конкретные пользователи, которые должны иметь доступ
Call itReaders.AppendToTextList("[rol1]")
Call itReaders.AppendToTextList("[rol2]")
Call itReaders.AppendToTextList("1-я Группа пользователей")
Call itReaders.AppendToTextList("2-я Группа пользователей")
Call itReaders.AppendToTextList("CN=Конкретный Пользователь/OU=Наша фирма")
Call itReaders.AppendToTextList("CN=Другой Пользователь/OU=Наша фирма")
If itReaders.Text <> "" Then
' Если поле непустое, то обязательно добавляем группу видящих все документы в базе.
Call itReaders.AppendToTextList("[ReadAll]")
End If

P.S. И не плодите поля типа Readers в документе. Таких полей должно быть максимум одно
 
R

rainstor

Гость
#19
Ясно, спасибо.
И еще 1 вопросик. Почему в локальной копии (скопировал на уровне файловой системы) я не могу что-то делать с этими документами. Насколько я знаю на локальной машине не работает ACL. Или я ошибаюсь?
1. Что делать со старым документом, я написал выше: нужно пойти к администратору и проделать вышеописанные действия на его машине.
Админ щас в отпуске :(. Да и живет он в другом городе совсем, поэтому выцепить его - маловероятно...
 
K

K-Fire

Гость
#20
P.S. И не плодите поля типа Readers в документе. Таких полей должно быть максимум одно
Плохой совет. Очень плохой совет. Это все конечно дело вкуса, но в 100% приложений что я видел, везде используют несколько ридерских/авторских полей. И я сам использую всегда несколько, ибо с такой схемой работать гораздо проще и глюков меньше.