Можно Ли Агентом Менять Документ Если В Querymodechange Continue=false

  • Автор темы FilFly
  • Дата начала
F

FilFly

#1
Добрые, люди подскажите пож. уже голову сломал..Задача следующая:
Есть документ и определенный круг пользователей должен только нажимать на кнопку из вьюшки.. а та в свою очередь должна менять определенные поля. Сами эти пользователи не должны иметь прав менять документ!!! Для этого я в событии QueryModeChange...
вот что написал v=Evaluate({@Contains(@UserNamesList;"[NotChange]")})
If v(0)=1 Then Continue=False And Messagebox ("Вы не можете редактировать документ")

Вроде как работает.. Потом почитав умные книжки сделал агента который запускается от админа (Run on behalf of) и в агенте прописал: uidoc.editmode=True, но мне все равно выдает ошибку когда я под пользователем(который не может менять документ) нажимаю на кнопку... ((
Подскажите плиз как решить данную задачу???
 

dimat

Lotus team
31.07.2008
516
0
#2
может менять значения в бэкенде?
Кнопка на вьюшке примерно с таким кодом
Код:
dim ns as new notessession
dim db as notesdatabase
set db=ns.currentdatabase
dim dc as notesdocumentcollection
set dc=db.unprocesseddocuments 'Берем выделеные документы в коллекцию
dim doc as notesdocument
set doc=dc.getfirstdocument
while not doc is nothing 
call doc.replaceitemvalue("SomeField","SomeValue")
call doc.save(true,false)
set doc=dc.getnextdocument
Wend
 

nvyush

Lotus team
22.04.2009
2 317
0
#3
Потом почитав умные книжки сделал агента который запускается от админа (Run on behalf of) и в агенте прописал: uidoc.editmode=True, но мне все равно выдает ошибку когда я под пользователем(который не может менять документ) нажимаю на кнопку... ((
Невнимательно читали. Чтобы агент работал от админа, его нужно запускать на сервере (agent.RunOnServer(noteID)). Вызываете из кнопки/агента серверный агент, он изменяет нужные поля документа и сохраняет его, потом переоткрываете документ. В серверном агенте никаких UI классов/методов быть не должно.
 
F

FilFly

#4
А можно передать параметр (в моем случае введенное текстовое значение) этому агенту???
Я просто посмотрел в справке туда передается NOtesId дока с которым можно работать..
а у меня основная задача помимо вычисляемых полей добавлялся введенный текст пользователя в определенное поле...
Не могу найти как это можно сделать ((
 

dimat

Lotus team
31.07.2008
516
0
#5
А можно передать параметр (в моем случае введенное текстовое значение) этому агенту???
Я просто посмотрел в справке туда передается NOtesId дока с которым можно работать..
а у меня основная задача помимо вычисляемых полей добавлялся введенный текст пользователя в определенное поле...
Не могу найти как это можно сделать ((
Создайте служебный док, в нем записать id документа, который необходимо изменить, новое значение и передайте его NOteId агенту
 
F

FilFly

#6
Создайте служебный док, в нем записать id документа, который необходимо изменить, новое значение и передайте его NOteId агенту
Воспользовавшись Вашими идеями сделал так:

Dim ns As New notessession
Dim db As notesdatabase
Set db=ns.currentdatabase
Dim doc As notesdocument
Dim item As NotesItem
TextFio=Inputbox$("Введите "")
DocId=GetDocid
Set doc=db.getDocumentByID(DocId)
Set item=doc.replaceitemvalue("Text",TextFio)
Call doc.save(True,False)

Где GetDocid эта функция которая вычисляет DocId нужного документа через UI
ну и соответственно потом открывается этот документ в бэкенде и все здорово меняется ))
И агента писать не надо! СПАСИБО!

Надеюсь это правильный подход ))
 

dimat

Lotus team
31.07.2008
516
0
#7
>Где GetDocid эта функция которая вычисляет DocId нужного документа через UI

Зачем же такие извращения?;)
Код:
dim ns as new notessession
dim db as notesdatabase
set db=ns.currentdatabase
dim dc as notesdocumentcollection
set dc=db.unprocesseddocuments 'Берем выделеные документы в коллекцию
dim doc as notesdocument
set doc=dc.getfirstdocument 'первый выделенный документ в представлении
TextFio=Inputbox$("Введите "")
call doc.replaceitemvalue("Text",TextFio)
call doc.save(true,false)
 
F

FilFly

#8
>Где GetDocid эта функция которая вычисляет DocId нужного документа через UI

Зачем же такие извращения?;)
Код:
dim ns as new notessession
dim db as notesdatabase
set db=ns.currentdatabase
dim dc as notesdocumentcollection
set dc=db.unprocesseddocuments 'Берем выделеные документы в коллекцию
dim doc as notesdocument
set doc=dc.getfirstdocument 'первый выделенный документ в представлении
TextFio=Inputbox$("Введите "")
call doc.replaceitemvalue("Text",TextFio)
call doc.save(true,false)
Я ДИКО извиняюсь просто в самом начале неправильно написал : кнопка не во вьюшки а на форме!! и мне надо было чтобы пользователь кнопкой менял токо этот документ )))
и этот документ только один... ))
И из за этого смотрел в сторону UI и совершенное забыл про реализацию бэкенда (думал что он мне тоже не даст изменять эти поля) )))

Огромное Спасибо что наставили на путь истинный ;)
 

nvyush

Lotus team
22.04.2009
2 317
0
#9
Есть документ и определенный круг пользователей должен только нажимать на кнопку из вьюшки.. а та в свою очередь должна менять определенные поля. Сами эти пользователи не должны иметь прав менять документ!!! Для этого я в событии QueryModeChange...
вот что написал v=Evaluate({@Contains(@UserNamesList;"[NotChange]")})
If v(0)=1 Then Continue=False And Messagebox ("Вы не можете редактировать документ")
все здорово меняется ))
И агента писать не надо! СПАСИБО!
Надеюсь это правильный подход ))
Исходя из поставленной задачи — неправильный. Если всё "здорово меняется" вышеприведённым кодом, значит у пользователей есть доступ на редактирование документа и, соответственно, при некоторой сноровке они смогут написать "умную" кнопку, которая позволит им изменить ЛЮБОЕ поле этого документа. И, кстати, а QueryOpen Вы тоже заблокировали? Документ ведь можно открыть и по CTRL+E. Да и отладчик никто не отменял...
 
F

FilFly

#11
Исходя из поставленной задачи — неправильный. Если всё "здорово меняется" вышеприведённым кодом, значит у пользователей есть доступ на редактирование документа и, соответственно, при некоторой сноровке они смогут написать "умную" кнопку, которая позволит им изменить ЛЮБОЕ поле этого документа. И, кстати, а QueryOpen Вы тоже заблокировали? Документ ведь можно открыть и по CTRL+E. Да и отладчик никто не отменял...
Документ для пользователя может открываться. А для пользователей стоит запрет в АЦЛ-е на создание агентов + все пользователи работают на терминале где стоит обычный клиент без дизайнера...
Так что мне кажется им придется очень постараться чтобы изменить этот документ...

Единственное чего не знаю- это можно ли "создать умную кнопку" из обычного клиента ((

Да еще одно как я понимаю (смутно вспоминаю администрирование) при "должной настройке" серверов агенты могут исполняться только под теми пользователями которые указаны на закладке security --Programmability Restrictions... А там стоят только те кто пишет код...
 

nvyush

Lotus team
22.04.2009
2 317
0
#12
Документ для пользователя может открываться.
По CTRL+E он сразу открывается в режиме редактирования и Ваша блокировка в QueryModeChange не спасёт.
Единственное чего не знаю- это можно ли "создать умную кнопку" из обычного клиента ((
Создаёте в панели инструментов кнопку с кодом FIELD Zarplata := 100500100500; встаёте в представлении на нужный документ клацаете на эту кнопку и идёте в бухгалтерию ;).

Добавлено
все пользователи работают на терминале где стоит обычный клиент без дизайнера...
Разработку веду на виртуалке, где установлен клиент с дизайнером. Тестирую на компе с таким же клиентом, как и у пользователей (без дизайнера), для удобства тестирования/отладки добавил в панель инструментов кнопку "Отлачик LotusScript"...
 

savl

Lotus team
28.10.2011
2 131
102
#13
По CTRL+E он сразу открывается в режиме редактирования и Ваша блокировка в QueryModeChange не спасёт.
Обходится дополнительно на PO.

Вызывает событие QMC

FilFly, если пользователи не могут сами менять документ, то просто не делай их авторами.
Тогда они не смогу редактировать - это путь с агентом, который выполняется от имени админа, который может редактировать.
 

nvyush

Lotus team
22.04.2009
2 317
0
#14
Обходится дополнительно на PO.
Можно и в QO проверять режим открытия и не давать открывать на редактирование, только вопрос не в этом.
Единственно надёжный способ не дать пользователям возможности редактировать документ — не давать им прав автора документа.