Clear Recent Contacts в почте

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#1
создаю письмо, в нем кнопку с кодом Lotus script:
Код:
-------button code-----
Sub Click(Source As Button)
Dim nab As NotesDatabase
Set nab = New notesdatabase("","names.nsf")
Dim view As NotesView
Set view = nab.GetView("(Recent Contacts)")
Dim vc As Notesviewentrycollection
Set vc = view.allentries
Call vc.RemoveAll(True)
Msgbox "Finished. Removed " & vc.Count & " temporary entries from your personal address book."
End Sub
'----- end code -----
отправляю, юзер жмет, но выскакивает ошибка "Object variable not set". Я думаю что у юзера не хватает прав на запуск скрипта. У меня поле Sign or run restricted LotusScript/Java agents: */DOM/ORG
Что нужно сделать, чтобы сработала кнопка?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#2
Код:
Sub Click(Source As Button)
On Error GoTo handler
Const FuncName = {Click} ' имя агента

' Твой код кнопки

Goto endh

handler:
Msgbox FuncName & ": " & Err &", в стр " & Erl & " " & Error$
Resume endh
endh:

End Sub
Узнаешь в какой строке ошибка.
Если есть "Object variable not set" значит скрипт запуск сделал, но свалился.
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#3
создал кнопку с именем 111 и код на ней:
Код:
Sub Click(Source As Button)
On Error Goto handler
Const FuncName = 111
Dim nab As NotesDatabase
Set nab = New notesdatabase("","names.nsf")
Dim view As NotesView
Set view = nab.GetView("(Recent Contacts)")
Dim vc As Notesviewentrycollection
Set vc = view.allentries
Call vc.RemoveAll(True)
Msgbox "Finished. Removed " & vc.Count & " temporary entries from your personal address book."
Goto endh
handler:
Msgbox FuncName & ": " & Err &", в стр " & Erl & " " & Error$
Resume endh
endh:
End Sub
ругается на строку
Set vc = view.allentries
самое интересное - если кнопку нажимет юзер из группы LocalDomainAdmins, то ошибка не появляется
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#4
нет доступа к вьюшке "(Recent Contacts)" , поэтому не получил он ее.
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#5
нет доступа к вьюшке "(Recent Contacts)" , поэтому не получил он ее.
а как сделать, чтобы юзер нажал на эту кнопку и у него очистились все Недавние контакты? Или как получить доступ к вьюшке?

Добавлено: есть ещё один скрипт:
With the introduction of the Recent Contacts view in Lotus Notes 8.x, I've found both myself and fellow Domino administrators wishing that this view was not populated and the function disabled.

Insert this LotusScript code into a button and email it to your users. Clicking on it will clear each user's Recent Contacts view and prevent repopulation.

Note: Be sure to create a log database called ClearContactsLog.nsf on your Domino server. Doing this will allow you to keep track of users who clicked the button.
Код:
Dim db As New NotesDatabase("","names.nsf")

Dim logdb As New NotesDatabase("<server name>","ClearContactsLog.nsf")

Dim view As NotesView

Dim doc As NotesDocument

Dim doc2 As NotesDocument

Dim logdoc As NotesDocument

Dim session As New NotesSession

Dim stream As NotesStream

Dim filename As String

Dim Response As Integer

Dim dateTime As New NotesDateTime( "" )

Dim nam As NotesName

Dim ErrorMsg As String

Dim Status As String

Dim item As NotesItem



On Error Resume Next



' Store the name of the user running this

Set nam = session.CreateName(session.UserName)



' Store the current date and time

dateTime.LSLocalTime = Now



' Create the entry for the log

Set logdoc = logdb.CreateDocument()

locdoc.Form = "Log Entry"



' Set the view to clear for the local contacts

Set view = db.GetView("(Recent Contacts)")

If view.AllEntries.Count > 0 Then

Set doc = view.GetFirstDocument

Do While Not (doc Is Nothing)

Set doc2 = doc

Set doc = view.GetNextDocument(doc)

Call doc2.RemovePermanently(True)

Loop

End If

If view.AllEntries.Count > 0 Then

Response = Msgbox("The view was not cleared successfully!" + Chr(10) + Chr(13) + "Click on OK to return to Notes then contact the Help Desk.",0 + 48,"Error During Clearing of Recent Contacts ")

' Store what is to be saved in the log

ErrorMsg = "Error During Clearing of Recent Contacts "

Status = "View not cleared"

End If



' Now, add the parameter line to the NOTES.INI

filename = Left(db.FilePath, Len(db.FilePath) - 14) + "NOTES.INI"

Set stream = session.CreateStream

' Use name of text file as subject

If Not stream.Open(filename, "ASCII") Then

Response = Msgbox("The process was aborted!" + Chr(10) + Chr(13) + "Click on OK to return to Notes then contact the Help Desk.",0 + 48,"Error During Clearing of Recent Contacts ")

' Store what is to be saved in the log

ErrorMsg = "Error During Clearing of Recent Contacts "

Status = "Cannot open INI file"

Exit Sub

Else

' Write the correct line to the bottom of the NOTES.INI

stream.WriteText "DisableDPABProcessing=1" + Chr(10) + Chr(13)

Response = Msgbox("The process has completed." + Chr(10) + Chr(13) + "Click on OK to return to Notes then close Notes and re-open it.",0 + 64,"Clearing of Recent Contacts Completed")

' Store what is to be saved in the log

Status = "Success"

End If

' Write this information to the log file

Call logdoc.AppendItemValue("A$LOGTIME",Cdat(dateTime.DateOnly + " " + dateTime.TimeOnly))

Call logdoc.AppendItemValue("A$PROGNAME", "Clearing of Recent Contacts ")

Call logdoc.AppendItemValue("A$USER", nam.Common)

Call logdoc.AppendItemValue("A$ACTION", Status)

If ErrorMsg <> "" Then

Call logdoc.AppendItemValue("A$ERRMSG", ErrorMsg)

End If

Call logdoc.Save(True,False)
но он тоже не отрабатывает, если жмет на кнопку обычный юзер - ошибка:
The view was not cleared successfully! Click on OK to return to Notes then contact the Help Desk.
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#6
а как сделать, чтобы юзер нажал на эту кнопку и у него очистились все Недавние контакты? Или как получить доступ к вьюшке?
А она хоть есть в его names.nsf ?
И еще один глупый вопрос у него доступ какой к names.nsf ? он по умолчанию вроде manager должен быть.
у меня 8.5.3 и твой первый код нормально отработал, так что проблема в доступе. Смотрите от него.
Еще он мог не добавить твою подпись в ECL, поэтому и ошибка.
Как вариант подписать код кем-то из группы LocalDomainAdmins.
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#7
А она хоть есть в его names.nsf ?
И еще один глупый вопрос у него доступ какой к names.nsf ? он по умолчанию вроде manager должен быть.
у меня 8.5.3 и твой первый код нормально отработал, так что проблема в доступе. Смотрите от него.
Еще он мог не добавить твою подпись в ECL, поэтому и ошибка.
Как вариант подписать код кем-то из группы LocalDomainAdmins.
names.nsf локальная права на нее Манагер, вьюшка недавних контактов есть, доступ к почтовой базе по-умолчанию Editor, галки включены Create Documents, Delete Documents, Create personal folder/views, Create shared folders/views, Read public documents, Write public documents и Replicate or copy documents. Нет прав на Create private agents, Create LotusSciprt/Java agents.
Я в группе LocalDomainsAdmins у которой права манагера, создаю кнопку вообще от имени Админа. В первом случае при нажатии ничего не происходит, только ошибку выдает, со вторым скриптом чуть лучше, появляется окно безопасности, в котором даже выбрав "Доверять автору всегда" нет доступа к записи в БД логов и ошибка "The view was not cleared successfully! Click on OK to return to Notes then contact the Help Desk."

P.S. проверил - на локальную names.nsf у юзера группа LocalDomainAdmins вообще прав не имеет, она там отсутствует - может в этом дело? Добавил ЛокальныхАдминовДомена с правами Манагера - тот же результат
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#8
Код:
Sub Click(Source As Button)
On Error Goto handler
Const FuncName = "111"
Dim nab As NotesDatabase
Set nab = New notesdatabase("","names.nsf")
if nab is nothing then Error 5001, "No names.nsf"
if not nab.isopen then Error 5002, "Can't open names.nsf"
Dim view As NotesView
Set view = nab.GetView("(Recent Contacts)")
if view is nothing then Error 5003, "No view"
Dim vc As Notesviewentrycollection
Set vc = view.allentries
Call vc.RemoveAll(True)
Msgbox "Finished. Removed " & vc.Count & " temporary entries from your personal address book."
Goto endh
handler:
Msgbox FuncName & ": " & Err &", в стр " & Erl & " " & Error$
Resume endh
endh:
End Sub
Это должно работать, если проблем с доступом и правами у пользователя нет.
во втором ("<server name>","ClearContactsLog.nsf") - эта база существует? Доступ у пользователя какой к ней?
еще мега-кардино-костыльное решение решение: агент на сервере.
Но что-то у вас там с доступом.
Попробуйте еще ECL очистить все же. Пусть заново принимает.

Проверте еще код на другом пользователе, только не на себе.
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#9
проблема решилась и ответ был во втором посте:
нет доступа к вьюшке "(Recent Contacts)" , поэтому не получил он ее.
доступ то есть, но вьюшки самой нет. Не думал что в русском шаблоне вьюхи будут по-русски обзываться. Подправил строку
Код:
Set view = nab.GetView("(Recent Contacts)")
на
Код:
Set view = nab.GetView("(Недавние контакты)")
и сработал скрипт....хотя и выдал что удалено 0 записей (а удалил все).
Теперь возникла проблема - у части пользователей английский шаблон, у части русский. Как сделать сначала проверку на наличие вьюхи "Recent Contacts" и если её нет, то очистить "Недавние контакты"?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#10
Код:
Set view = nab.GetView("(Recent Contacts)")
if view is nothing then 
Set view = nab.GetView("(Недавние контакты)")
End if
If view is nothing then Error 5005, "Не найдено представление с контактами."
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#11
спасибо! Надо идти на курсы по LotusScript, чтобы народ не напрягать по мелочам.
Тему можно закрыть
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#12
Как показала практика - юзеры в большинстве случаев игнорируют нажатие кнопки, как с помощью агента принудительно очистить Recent Contacts при открытии юзером Лотуса?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#14
Можно еще сделать агентом по расписанию и запускать в час ночи каждый день.
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#17
Воткните его в почтовый шаблон, вызывайте из PostOpen базы.
Прошу прощения, я не изучал LS, но жизнь прижала использовать такие методы. Как его воткнуть в почтовый шаблон и как "вызвать"?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#18
Открывай шаблон в дизайнере, ищи Code -> DataBase Script, там событие PostOpen.
Код:
Sub Postopen(Source As Notesuidatabase)
Sub Postopen(Source As Notesuidatabase)
Dim db As NotesDatabase
Dim ag As NotesAgent
Set db = Source.Database

Set ag = db.Getagent(<имя агента>")
If Not ag Is Nothing Then Call ag.Run()
End Sub
Для агента выстави Trigger : NONE

Если я ничего не напутал
 

R4z0R

Well-Known Member
Lotus team
06.08.2009
204
1
#19
т.е я создаю агент "Test"с кодом:
Код:
Dim nab As NotesDatabase
Set nab = New notesdatabase("","names.nsf")
Dim view As NotesView
Set view = nab.GetView("(Recent Contacts)")
Dim vc As Notesviewentrycollection
Set vc = view.allentries
Call vc.RemoveAll(True)
Msgbox "Finished. Removed " & vc.Count & " temporary entries from your personal address book."
потом открываю шаблон, Code -> DataBase Script -> PostOpen и между Sub Postopen(Source As Notesuidatabase) и End Sub
вставляю код
Код:
	Sub Postopen(Source As Notesuidatabase)
Dim db As NotesDatabase
Dim ag As NotesAgent
Set db = Source.Database

Set ag = db.Getagent(Test")
If Not ag Is Nothing Then Call ag.Run()
и у юзера при открытии очистятся Недавние контакты? Или все же надо делать редизайн всех ПЯ?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#20
По сути да, примерно так. Ты на себе проверь только сначала.
Код:
Msgbox "Finished. Removed " & vc.Count & " temporary entries from your personal address book."
Думаю можно убрать, чтобы вообще пользователи не знали этого.
Или все же надо делать редизайн всех ПЯ?
Если хочешь всем такое, да, надо каждый ПЯ изменить.