Не срабатывает закрытие формы

  • Автор темы Автор темы romanko
  • Дата начала Дата начала
подстановка значения в поле1(если документ новый - несохраненный), поле пустое.

А зачем все в одно место впихивать? Разделите. У вас поле отдела вообще надо сделать computed when composed и вставить формулу определения отдела в него.
 
Как я понял, задача состоит в том, что-бы не дать возможность создавать док юзеру, если он не входит в список ролей.

Тогда проверять на @IsNewDoc - какой смысл - док всегда новый.
Если док создается с кнопки - там и делать проверку. Входит - @Command([Compose]; ....), нет - @Return(@Prompt(......)).

Если хочется в форме - то не давать открывать док в Queryopen с проверкой на новизну ну и, Continue = False.

Что-то типа:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim acl As NotesACL
Dim entry As NotesACLEntry
Set db = session.CurrentDatabase
Set acl = db.ACL
Set entry = acl.GetEntry( session.UserName )
If ( entry Is Nothing ) Or Isnewdoc Then
continue = False
Elseif Not ( entry.IsRoleEnabled( "Какая-то роль" ) ) Then
continue = False
End If
End Sub

Наверное так.
 
Если у пользователя есть определенная роль то в поле1 должно быть соответствуующее значение(это при открытии сохраненного документа),если же значение в поле1 не совпадает с тем которое там должно быть то выскакивает месаге ошибка и при закрытии или при нажатии на кнопку на ошибку должно закрыться форма где он вводит свои данные.Если документ новый(несохраненный) то в зависимости от роли в поле1 должно подставляться определенное значение.
Хорошо. Теперь надо понять, что это не одна задача, а две разные задачи!
1-я:
"Если документ новый(несохраненный) то в зависимости от роли в поле1 должно подставляться определенное значение."
Т.е. при выполнении условий, поле должно получить
2-я:
"Если у пользователя есть определенная роль то в поле1 должно быть соответствуующее значение(это при открытии сохраненного документа),если же значение в поле1 не совпадает с тем которое там должно быть то выскакивает месаге ошибка и при закрытии или при нажатии на кнопку на ошибку должно закрыться форма"

1-я задача решается путем записи значения в поле, в случае выполнения условий.
Например, в поле, в формулу по-умолчанию можно написать:
@If(@IsMember("[ROLE-NAME]"; @UserRoles)); "Field-Value-If-Role-Enabled"; "Field-Value-If-Role-Is-Not-Enabled")

2-я:
В обработчике события формы QueryOpen необходимо выполнить проверку условий и разрешить либо запретить открытие документа.
Узнать есть ли роль скриптом проще всего, используя специальную команду, которая выполняет формулу из скрипта. Но ею не следует злоупотр*цензура*ть. Но здесь подходит.
Например, заготовка функции:
Код:
Public Function IfUserHasRole(ARole As String) As Boolean
Dim ur As Variant
ur = Evaluate({@IsMember("[} & ARole & {]"; @UserRoles)})
IfUserHasRole = ur(0)
End Function
Рекомендую потратить пару минут и почитать о Evaluate в справке.
Саму функцию можно поместить в раздел формы (Globals), чтобы она была доступна в любом скрипте формы и элементов на ней.
Либо можно поместить ее в LotusScript Library, а саму библиотеку подключить в форме через USE

Обработчик получится приблизительно такой:
Код:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim someFieldValue As String
If Not(Isnewdoc) Then
someFieldValue = Source.Document.GetItemValue("SomeFieldName")(0)
If IfUserHasRole("ROLE-NAME") And (someFieldValue = "Some-Special-Value") Then
Continue = True
Else
Continue = False
Messagebox "Условия не выполнены! Документ не может быть открыт.", 0, "Уведомление"
End If
End If
End Sub

Забегу наперед! Это может быть не понятно, но важно не забыть!
Если документ новый, то объект Source.Document не существует еще. Поэтому, если надо будет в момент открытия документа на редактирование что-либо писать через back-end документ, то необходимо писать в Postopen с учетом Source.EditMode.

Добавлено:
... не будет правильно работать, если пользователь не будет явно прописан в ТУД. С этим надо быть аккуратным.

Добавлено: romanko
в справке посмотри обязательно!
Индекс: Fields, working with\described
И те доки, на которые этот ссылается: о типах полей, о том, будет ли поле изменяемым пользователем или программно.

Добавлено: И еще, если необходимо запретить пользователю создавать документ по определенной форме на основании некотороего условия, то приглядись к совету:
Если док создается с кнопки - там и делать проверку. Входит - @Command([Compose]; ....), нет - @Return(@Prompt(......)).
Но необходимо будет у формы отключить возможность создавать по ней документы из меню Create.
И сделать, например, в представлении кнопку с кодом, который проверяет условия, и, если выполняются, выполняет @Command([Compose]; ....), иначе показывает уведомление.
Либо, как сдесь советуют
Если хочется в форме - то не давать открывать док в Queryopen с проверкой на новизну ну и, Continue = False
расширить обработчик выше таким образом:
Код:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim someFieldValue As String
If Not(Isnewdoc) Then
someFieldValue = Source.Document.GetItemValue("SomeFieldName")(0)
If IfUserHasRole("ROLE-NAME") And (someFieldValue = "Some-Special-Value") Then
Continue = True
Else
Continue = False
Messagebox "Условия не выполнены! Документ не может быть открыт.", 0, "Уведомление"
End If
Else
If IfUserHasRole("ROLE-NAME") Then
Continue = True
Else
Continue = False
Messagebox "Условия не выполнены! Документ не может быть создан.", 0, "Уведомление"
End If
End If
End Sub
 
А чем не устраивает NotesDatabase.QueryAccessRoles ? зачем городить проход по ентрисам и собакоформулы?
 
А чем не устраивает NotesDatabase.QueryAccessRoles ?
Наверное мне этот метод не очень нравится, вот я про него и не помню ;)
С другой стороны, писать вспомогательную функцию все-равно придется. А остальное - суть рефакторинг :facepalm:
 
Вопрос почему когда по первой задачи я на поле ставлю условие
@If(@IsMember("[1]"; @UserRoles); "Field-Value-If-Role-Enabled"; "Field-Value-If-Role-Is-Not-Enabled")
@If(@IsMember("[2]"; @UserRoles); "Field-Value-If-Role-Enabled"; "Field-Value-If-Role-Is-Not-Enabled")
То не срабатывает если Роль="[2]". Как несколько условий добавить?
 
А если так?
@If(@IsMember("[2]"; @UserRoles) | @IsMember("[1]"; @UserRoles); "Field-Value-If-Role-Enabled"; "Field-Value-If-Role-Is-Not-Enabled")
Справка по @if
@If( condition1 ; action1 ; condition2 ; action2 ; ... ; condition99 ; action99 ; else_action )
 
Либо так, если одновременно не может быть у пользователя роли 1 и 2:
@If(@IsMember("[1]"; @UserRoles); "Field-Value-If-Role1-Enabled"; @IsMember("[2]"; @UserRoles); "Field-Value-If-Role2-Enabled"; "Field-Value-If-Role1&2-Is-Not-Enabled")
...
Если одновременно может быть, возможно, надо так, но тогда на поле надо поставить галку Allow multiple values:
@If(@IsMember("[1]"; @UserRoles); "Field-Value-If-Role1-Enabled"; "Field-Value-If-Role1-Is-Not-Enabled"):
@If(@IsMember("[2]"; @UserRoles); "Field-Value-If-Role2-Enabled"; "Field-Value-If-Role2-Is-Not-Enabled")
 
@If(@IsMember("[1]"; @UserRoles); "Field-Value-If-Role-Enabled"; "Field-Value-If-Role-Is-Not-Enabled")
@If(@IsMember("[2]"; @UserRoles); "Field-Value-If-Role-Enabled"; "Field-Value-If-Role-Is-Not-Enabled")
это синтаксически неправильно. в @-формулах вспомните свой с-синтаксис - там команды отделяются ;
соответственно, два @If должны отделяться ;
Результат @-формулы - это либо то, что вернет @return(), либо результат последнего выражения.
И раньше ведь nvy пояснял, что для 150 с чем-то организаций вариант с ролью неправильный - количество ролей превысит лимиты лотуса, зачем тогда опять его "пилить"? Кажется, опять идем по кругу. %)
 
Да проще было сразу все сделать самим, чем пытаться объяснить. (сорри за оффтоп).
 
тут получается вот этот код я добавил в декларатионс
Function IfUserHasRole(ARole As String) As Boolean
Dim ur As Variant
ur = Evaluate({@IsMember("[} & ARole & {]"; @UserRoles)})
IfUserHasRole = ur(0)
End Function
а этот в квериопен
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Dim someFieldValue As String
If Not(Isnewdoc) Then
someFieldValue = Source.Document.GetItemValue("field1")(0)
If IfUserHasRole("[1]") And (someFieldValue = "1") Then
Continue = True
Else
Continue = False
Messagebox "Условия не выполнены! Документ не может быть открыт.", 0, "Уведомление"
End If
End If
End Sub
и если я открываю сохраненый документ в котором в field1=1 и у пользователя роль = 1 то оно не открывает.
 
А квадратные скобки нафига два раза подставлять?
ur = Evaluate({@IsMember("[} & ARole & {]"; @UserRoles)})
If IfUserHasRole("[1]") And (someFieldValue = "1") Then
 
romanko ,
функция реализована так, чтобы необходимо было передавать ей параметром лишь название самой роли, без квадратных скобок.
Будь внимательнее! И еще, в нотесе есть дебагер скрипта Debug Lotus Script. Правда, в зависимости от версии клиента, меню его вызова может быть в разных местах :)
В 6-ках было меню File / Tools, если не ошибаюсь. В 7-8-ках в меню Tools
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab