Протоколирование изменений полей в документе

Oksana

Lotus team
10.01.2006
329
0
#1
Задача следующая:
К документам базы данных доступ на редактирование имеют несколько человек. Необходимо возле некоторых полей отображать имя того кто его правил в последний раз.
Как я поняла языком функций здесь не обойдешься (если можно скажите как), а на скрипте еще ничего сама не писала.
Пожалуйста, скажите с чего начать. Алгоритм вроде понятен, считываем значение поля при переходе в режим редактирования, сравниваем со значением поля в момент сохранения, если не совпадает, в нужное поле прописываем имя текущего пользователя. Вроде так.
Но вот куда и в каком виде это все вставить? )
 

Gor

Well-known member
07.06.2005
517
1
#2
Можно попробовать сделать следующее...
В документе где необходимо сделать отметку о последнем изменении документа завести два поля - первое Avtor (names), второе Adata (дата изменения) к примеру. Оба поля естественно вычисляемые.
И на событие QueryOpen в этом документе повесить следующее:

Код:
Sub Queryopen(Source As Notesuidocument, Mode As Integer, Isnewdoc As Variant, Continue As Variant)
Set docs = Source.Document
Dim user As String
Dim session As New NotesSession	
Dim cdoc As NotesDocument 
Dim k As Integer
Dim S As String

User = session.UserNameList(0).abbreviated

If IsNewDoc Then
 Exit Sub
End If


Source.Document.Avtor    = Source.Document.Authors(Ubound(Source.Document.Authors))
Source.Document.AData  = Source.Document.LastModified	
End Sub
должен отображаться только тот кто внёс последнее изменение в документ в поле Avtor
 

Oksana

Lotus team
10.01.2006
329
0
#3
Спасибо, но не совсем то что нужно.
Например, есть поля А и В. Зашел Иванов и исправил только поле А (вот рядом с этим полем я хочу видеть Иванов), затем зашел Петров и исправил поле В (соответственно сохраняем его имя). В результате видим поле А правил Иванов, поле В правил Петров. Причем кто из них был последним не так важно.
 

Gor

Well-known member
07.06.2005
517
1
#4
ну тогда на событие OnChange поля какого надо повесь код получения пользователя и записывай в рядом стоящее поле получить на OnChange значение поля можно и с помощью Entry ев ...
ну а там в принципе только останется записать в рядом стоящее поле значение entryя Ну чёто в голову не лезет на вскидку больше ниего))
хотя есть ещё варианты...

Код:
Sub Onchange(Source As Field)
Dim workspace As New NotesUIWorkspace
Dim session As New NotesSession
Dim uidoc As NotesUIDocument
Dim acl As NotesACL  
Dim entry As NotesACLEntry
Dim uidb As NotesUIDatabase
Dim d As Variant

Set uidb = workspace.CurrentDatabase
Set db = session.CurrentDatabase
Set acl = db.ACL
Set entry = acl.GetEntry( session.UserName)

d = entry.Name
Set uidoc = workspace.CurrentDocument
Call uidoc.FieldSetText("dddd",d)

End Sub
[\code]
ну если всё так сделать то в поле dddd предполагается оно будет рядом стоящее с необходимым полем где нужно изменения произвести отобразится пользователь кто его поменяет
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Для: Gor
А зачем так сложно ? Можно без всяких entry имя пользователя записать.
через session.UserName
или session.Usernamelist(1).Common - альтернативное имя.
 

Gor

Well-known member
07.06.2005
517
1
#6
Для: Medevic
Ну в принципе да :)
Я же говорю что первое в голову пришло...
но насчёт этого не знал
session.Usernamelist(1).Common
почёму то мне при решении любой задачи на ум сразу приходят более тяжёлые решения...так уж...может понадобиться потом роли вытянуть или ещё чего нить...из ацль
но этот действительно вариант попроще...
 

Murtas

Lotus team
11.04.2006
128
0
#7
1. Если это частный случай ( т.е. нужно только для двух полей) то можно это дело обработать при сохранении документа - сравнить со значениями до и после ...

2. Хорошо бы иметь универсальный тул для протокола, в виде логов с конфигурационными документами (Форма + отслеживаемые поля). При сохранениии какой-то формы, я отслеживаю указанные поля и делаю запись в логе протокола. А потом успешно пользуюсь этой информацией. Гибко и практично. В этом случае лучше предоставить пользователю видеть весь протокол по изменению полей. А для того чтобы видеть имя изменившего, которого нужно показывать на против поля, нужно будет постараться положить инфу так, чтобы потом ее можно было выделить из протокола.