Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пишу базу
Форум программистов > Базы данных и администрирование > Lotus > Lotus - Программирование
Страницы: 1, 2
phantom76
Всем привет,
пишу базу для отчетов..
появились вопросы: (заранее спасибо за помошь!!)

1. Возможно ли реализовать механизм разграничения доступа к полям? т.е. один пользователь может редактировать в документе только одни поля, другой только другие, третий все.
как я понял это все можно реализовать создав соответствующие формы для каждого типа пользователей и через роли им назначить. Чтобы с данной формой редактировать могла только нужная роль пользователей , в свойствах формы выставляю на последней закладке права - "кто может создавать док по этой форме" - этого будет достаточно или есть другой способ (например на уровне полей или секций !?) ?
2. В случае если в разных репликах пользователи будут редактировать один документ , но разные поля, в итоге не приведет это к конфликту репликаций?
Medevic
1. В принципе нет. Можно только шифровать поля. Остальное делается в UI и создаёт только иллюзию разграничения прав.
2. Да. Но можно изменить свойтво формы Conflict Handling или соответствующее поле $ConflictAction в документе.
Akupaka
1) разграничение доступа к полям можно по-разному реализовать, это могут быть и Controlled Access секции, и скрытие, и другие варианты smile.gif

2) приведет smile.gif но, можно постараться уменьшить вероятность конфликта - свойство обработки конфл. ситуаций на форме; потом, желательно максимально уменьшить возможность редактирования дока разными пользователями в одно и то же время или разграничить между ними поля, которые они могут редактировать (это к пп1)

Цитата(Medevic @ 29:07:2008, 12:09 ) *
1. В принципе нет. Можно только шифровать поля. Остальное делается в UI и создаёт только иллюзию разграничения прав.

см. isProtected
phantom76
спасибо за ответы!!

т.е. в итоге в итоге я смогу построить архитектуру при которой, все данные хранятся в одном документе, а 4 разных пользователя заполняют каждый свою часть полей? , т.е. что это будет все-таки 1 документ а не 4 ?
Medevic
Цитата(Akupaka @ 29:07:2008 - 14:13) *
см. isProtected

Как мне кажется, это практически бесполезное свойство. Не получится это сделать:
Цитата(phantom76 @ 29:07:2008 - 13:47) *
один пользователь может редактировать в документе только одни поля, другой только другие, третий все.



Цитата(phantom76 @ 29:07:2008 - 14:22) *
т.е. в итоге в итоге я смогу построить архитектуру при которой, все данные хранятся в одном документе, а 4 разных пользователя заполняют каждый свою часть полей? , т.е. что это будет все-таки 1 документ а не 4 ?

Ну а почему бы не сделать в 4-х документах?
Еще можно дать всем права Readers, а поля через агент менять.
phantom76
Цитата(Medevic @ 29:07:2008, 13:27 ) *
Как мне кажется, это практически бесполезное свойство. Не получится это сделать:




Ну а почему бы не сделать в 4-х документах?
Еще можно дать всем права Readers, а поля через агент менять.


алгоритм работы базы должен быть такой:

есть менеджер базы - он имеет право на создание шаблона отчета с заданными параментрами для подразделений, есть 4 ответственных лица в подразделениях, которые должны заполнить соответствующие разделы в этом отчете.
и в итоге отчет должен быть предоставлен руководителю как единая форма.
соответственно если это будет уже 4 документа, то нужно будет или по ним построить 5-ый итоговый и предусмотреть механизм переноса начальных данных введенных менеджером в документы подразделений, вот пока размышляю как логичнее построить этот процесс?
Akupaka
в программировании нельзя руководствоваться терминами "кажется" и подобными wink.gif

указанное свойство итемов isProtected небезполезно, если им правильно пользоваться...
а свойство формы Conflict handling = Merge Conflicts очень даже хорошо справляется, если пользователи изменяли разные поля...
и то, что требуется phantom76 можно сделать, правильно все организовав, и с помощью единого документа...

зы: а еще можно не использовать лотус wink.gif


Цитата(phantom76 @ 29:07:2008, 12:48 ) *
алгоритм работы базы должен быть такой:

есть менеджер базы - он имеет право на создание шаблона отчета с заданными параментрами для подразделений, есть 4 ответственных лица в подразделениях, которые должны заполнить соответствующие разделы в этом отчете.
и в итоге отчет должен быть предоставлен руководителю как единая форма.
соответственно если это будет уже 4 документа, то нужно будет или по ним построить 5-ый итоговый и предусмотреть механизм переноса начальных данных введенных менеджером в документы подразделений, вот пока размышляю как логичнее построить этот процесс?

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

я бы выбрал, все-таки, отдельные документы, т.к. здесь предусматривается одновременная работа с документом, т.е. вероятность одновременной правки документа стремится к 100%

т.е. к примеру, Ваш менеджер создает документ, устанавливает его статус "жду ответа", остальные заходят в этот документ и нажимают на княпку "ответ", при этом создается ответный документ, в котором пользователь заносит данные... каждый отвечает, в итоге получается документ и дочерние к нему...
эти дочерки можно различными способами обработать:
- можно просто отображать их в виде как связанные доки;
- можно серверным агентом поместить данные из ответов в родительский, а дочерние убить;
- можно отображать данные из дочерок в открытом родительском в виде встроенного вида, либо в какие-то поля засовывать данные при открытии;

либо другим способом...
phantom76
спасибо, все приму к сведению smile.gif
phantom76
какой лучше функцией восспользоваться для проверки наличия\отсутствия у пользователя определенной роли, с целью скрытия секции на форме?
Akupaka
@IsMember()
@UserRoles
phantom76
спасибо! smile.gif
я так понял на локале @UserRoles не работает?

Text list. Each item in the list is the name of a role that the current user has in the current database. The role names are enclosed in brackets. Returns an empty string ("") if the current database is local and "Enforce a consistent Access Control List across all replicas" is not in effect.
kizarek
phantom76
правильно понял)
Akupaka
понял-то правильно, но есть ведь и вторая часть ответа - Returns an empty string ("") if the current database is local and "Enforce a consistent Access Control List across all replicas" is not in effect
так что, можно сделать чтобы работало

эта галка находится на закладке дополнительных параметров ТУД
phantom76
еще вопросик, глюк какой-то..

на форме пытаюсь спрятать секции в зависимости от роли, соответственно в опции: Hide paragraph if formula is true: ставлю "галку" и пишу формулу: @If(@IsMember("[user1]"; @UserRoles);@True;@False) , но заметил такой глюк, что зачастую скрывает только имя секции, если она развернута на форме..

как правильно реализовать этот механизм?
Akupaka
ну, либо сделать так чтобы секция не раскрывалась, либо добавить в скрытие того, что внутри секции ту же проверку на роль...
к стати, достаточно написать @IsMember("[user1]"; @UserRoles) , она сама вернет @True
phantom76
вот еще вопросик:

хочу в документе дополнительно контролировать модификацию определенных полей по последнему изменению,: дату и автора
для чего на форме созданы соответсвтующие поля, сначала использовал в вычисляемых полях фомулы вида :
@If(@IsMember("[Roles1]"; @UserRoles);@Name([CN];@UserName);"");
@If(@IsMember("[Roles1]"; @UserRoles);@Now;"");

но в этом случае, пользователь с другой ролью, очищает поля по "иначе" (может присваивать полю свое текущее значение?! )
поставил все эти формулы в QuerySave на форме,

@If(@IsMember("[Roles1]"; @UserRoles);@SetField(Updatedby1;@Name([CN];@UserName));"");
@If(@IsMember("[Roles1]"; @UserRoles);@SetField(Updated1;@Now);"");

но почему-то не работают они там..
Medevic
Цитата(phantom76 @ 5:08:2008 - 14:45) *
может вместо "иначе" присваивать полю свое текущее значение?!

Присвой. smile.gif

Цитата(phantom76 @ 5:08:2008 - 14:45) *
поставил все эти формулы в QuerySave на форме, но почему-то не работают они там..

Кавычки не забыл в @SetField?
phantom76
а где кавычки-то ? вроде не забыл..
@SetField( fieldName ; value ) имя поле идет разве в кавычках?


понял.. имя поля должно быть в кавычках smile.gif))
Medevic
Ну да.
phantom76
Спасибо, все заработало! smile.gif
phantom76
а какое ограничение существует на размер одного документа в БД в 7-ке ?
Akupaka
ограничений на размер документа, в принципе, нет smile.gif
есть ограничение на размер summary-полей, и на сумму размеров summary-полей...
summary-поле не должно превышать 32 КБ (в реале около 28-29)
сумма summary-полей не должна превышать 64 КБ (тут тоже врут smile.gif)
phantom76
Цитата(Akupaka @ 6:08:2008, 10:13 ) *
ограничений на размер документа, в принципе, нет smile.gif
есть ограничение на размер summary-полей, и на сумму размеров summary-полей...
summary-поле не должно превышать 32 КБ (в реале около 28-29)
сумма summary-полей не должна превышать 64 КБ (тут тоже врут smile.gif)

например какие поля?
Akupaka
все те итемы, что isSummary = True smile.gif
по-умолчанию, все итемы, кроме РТ, которые созданы по полям на форме, isSummary = True
если Вы хотите запихать в итем многа-многа данных, то запихайте их с помощью LS, а перед сохранением сделайте итему isSummary = False
например:
doc.ReplaceItemValue("MegaItem", MegaArray).IsSummary = False


заметьте, что тут нет "Call", т.к. doc.ReplaceItemValue возвращает NotesItem, свойство IsSummary которого мы используем
phantom76
Спасибо теперь понятно smile.gif
Akupaka
к стати, я забыл сказать, что не РТ-поле, у которого isSummary = false, тоже ограничено 64 КБ (около 59)...
поэтому если надо ну очень много всего, то придется пихать в РТ-поле и парсить...
если интересно, то гляньте Known limits в хэлпе дизайнера, там это собрано в таблицу...



хм... сам глянул... не все там есть smile.gif
Sandr
Цитата(Akupaka @ 6:08:2008, 12:02 ) *
хм... сам глянул... не все там есть smile.gif


Блин, откуда ты такой умный? smile.gif
phantom76
спасибо нашел smile.gif
Akupaka
Цитата(Sandr @ 6:08:2008, 23:57 ) *
Блин, откуда ты такой умный? smile.gif

флудер
phantom76
как привести типы , чтобы текущее значение dateTime2 напечатать через Print ?

Dim dateTime2 As NotesDateTime
Dim doc As NotesDocument
Set dateTime2 = New NotesDateTime(doc.GetFirstItem("Rep_date").text)
Akupaka
я че-то понять не могу smile.gif
ты преобразовываешь какой-то текст (вероятно дату) в дату, а потом хочешь вывести ее текстом?..
в чем смысл? smile.gif

у класса notesDateTime есть свойства, глянь в хелпе, что тебе наиболее подходит, например, можешь использовать notesDateTime.LocalTime

print dateTime2.LocalTime
phantom76
Set dateTime2 = New NotesDateTime(doc.GetFirstItem("Rep_date").text) - иначе выдает ошибку типов...
Rep_date - поле на форме тип Date\Time
Morpheus
phantom76
Print Format( doc.GetItemValue("Rep_date")(0), "dd.mm.yyyy" )
phantom76
а Set dateTime2 = New NotesDateTime(doc.GetFirstItem("Rep_date").text) в каком формате лучше оставлять?
дальше dateTime2 сравниваю с dateTime3 которая равна Set dateTime3 = New NotesDateTime("Today")
Morpheus
Цитата(phantom76 @ 20:08:2008 - 21:51) *
а Set dateTime2 = New NotesDateTime(doc.GetFirstItem("Rep_date").text) в таком формате лучше оставлять?
дальше dateTime2 сравниваю с dateTime3 которая равна Set dateTime3 = New NotesDateTime("Today")

ну и к чему это должно привести ? (сравнение )
phantom76
да в принципе вот к чему...

If dateTime3.DateOnly <= dateTime2.DateOnly Then
Print "отправка напоминаний на отчет от"+ dateTime2.LocalTime
'рассылка уведомлений'
End If
Akupaka
Set notesDateTime = notesItem.DateTimeValue

->

Set dateTime2 = doc.GetFirstItem("Rep_date").DateTimeValue


ты уверен, что твое сравнение корректно? при таком условии если число дней месяца сегодня не больше чем в указанной дате, то будет отправка уведомлений, но не учитываются остальные параметры - год и месяц (время, как я понимаю, не надо)...
Medevic
А мне больше нравится работать с Variant of DataType 7.
Akupaka
smile.gif запутай его еще больше wink.gif
Medevic
Да наоборот проще. smile.gif
Цитата(phantom76 @ 21:08:2008 - 09:04) *
If dateTime3.DateOnly <= dateTime2.DateOnly Then
Print "отправка напоминаний на отчет от"+ dateTime2.LocalTime
'рассылка уведомлений'
End If

Это работать не будет.
Поэтому делаем так:
Dim d As Variant
d = doc.GetItemValue("Rep_date")(0)
d = DateNumber(Year(d), Month(d), Day(d)) - это если надо от времени избавится.
If Today <= d Then
Print "отправка напоминаний на отчет от" + Cstr(d) - а можно Format использовать.
Today
Akupaka
вот теперь ему будет понятнее smile.gif а то написал про какие-то варианты 7... wink.gif
а то понятно, что будет некорректно... хотя, кто знает, что ему нужно было smile.gif
Azat
print# datetime2
Medevic
Цитата(Azat @ 21:08:2008 - 10:38) *
print# datetime2

Сработает? smile.gif
phantom76
Цитата(Akupaka @ 21:08:2008, 09:27 ) *
Set notesDateTime = notesItem.DateTimeValue

->

Set dateTime2 = doc.GetFirstItem("Rep_date").DateTimeValue


ты уверен, что твое сравнение корректно? при таком условии если число дней месяца сегодня не больше чем в указанной дате, то будет отправка уведомлений, но не учитываются остальные параметры - год и месяц (время, как я понимаю, не надо)...


вообще работает мой вариант (If dateTime3.DateOnly <= dateTime2.DateOnly Then..), причем выдает именно число.месяц.год
этот пример я взял из книги Lotus Developer's Toolbox (Марк Эллиот), он приводился в качестве метода сравнения дат
в описании сказано, что выдает the date part of a date-time, in the local time zone, вроде то что нужно..
Medevic
Цитата(phantom76 @ 21:08:2008 - 15:30) *
вообще работает мой вариант (If dateTime3.DateOnly <= dateTime2.DateOnly Then..), причем выдает именно число.месяц.год
этот пример я взял из книги Lotus Developer's Toolbox (Марк Эллиот), он приводился в качестве метода сравнения дат

Работает? Попробуй сравнить даты 21.08.2008 и 22.08.2007.
Akupaka
опс, сори, я был не внимателен... попутал с JS, видать...
хм... DateOnly возвращает строку, зависящую от локальных настроек... будет ли такая конструкция корректна по отношению к датам? ведь реально происходит сравнение не дат, а строк... вполне вероятно, что строка 01.02.2006 окажется больше строки 01.01.2008, т.к. сравнение строк происходит позначно, хотя дата 01.01.2008 будет больше 01.02.2006...
phantom76
да увидел, что некорректно работает... как же тогда правильно сравнивать даты? так как показывали выше?
исходя из этого и выборка документов из базы будет работать в моем случае не правильно:

CODE
Set dateTime1 = New NotesDateTime("Today")
Call dateTime1.AdjustDay(-31)
searchFormula$ = {Form = "NewRep"}
Set dc = db.Search(searchFormula$, dateTime1,0)


должен быть агент , принцип работы такой..
ищет документы за последний месяц и далее в этих документах смотрит в поле (rep_data) дату, если текущая дата лежит в интервале: "ep_data"-5 < "Today" < "rep_data" , то нарпавить уведомление адресатам..
Medevic
Цитата(phantom76 @ 21:08:2008 - 16:23) *
далее в этих документах смотрит в поле (rep_data) дату, если текущая дата лежит в интервале: "ep_data"-5 < "Today" < "rep_data" , то нарпавить уведомление адресатам..

Пиши сразу в формуле отбора.
Kee_Keekkenen
Цитата(phantom76 @ 20:08:2008, 21:51 ) *
а Set dateTime2 = New NotesDateTime(doc.GetFirstItem("Rep_date").text) в каком формате лучше оставлять?
дальше dateTime2 сравниваю с dateTime3 которая равна Set dateTime3 = New NotesDateTime("Today")


а так не пробовали ?
Set dateTime2 = New NotesDateTime(format (doc.Getitemvalue("Rep_date")(0),"dd.mm.yyyy") )
Set dateTime3 = New NotesDateTime(format (Today,"dd.mm.yyyy"))

if dateTime3.timedifference(dateTime2) > 0 then
' значение даты в Rep_date ранее чем сегодня
end if
xalet
а можете формулы для сравнения дат, не на лотус скрипте, а именно для SelectionFormula, примерчик привести?

View.SelectionFormula={SELECT (Form="НазваниеФормы")&(@Date(ДатаВПолеФормы1)=@Date("}+ДатаВОткрытойФорме+{"))}

такая не работает...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.