Пишу базу

  • Автор темы Автор темы phantom76
  • Дата начала Дата начала
а как задавать (создавать) ProfileDocument ? его должно определять какое-то поле?
да точку убрал сразу, была случайность..
но все равно всплывает предупрежедение и происходит остановка...

Function Mailer (Adreses As String, document As NotesDocument) As String
Dim s As New NotesSession
Dim memo As NotesDocument
Dim rtitem As NotesRichTextItem
Dim db1 As NotesDatabase
Set db1 = s.CurrentDatabase - будет ли работать в случае запуска агента на сервере?
'-------------------------------------------------------------------
' Создаем уведомление
'-------------------------------------------------------------------
memo.form = "Memo"
memo.SendTo = Adreses
memo.Subject = "Напоминание"
Set rtitem = New NotesRichTextItem (memo, "Body")
Call rtitem.AddNewline(1)
Call rtitem.AppendText("срок отчетности")
Call rtitem.AddNewline(2)
Call rtitem.AppendDocLink(document,db1.Title)
Call memo.Send(False)
mailer = "сообщение отправлено"

End Function


а вто sub из которой она вызывается:


Sub Initialize
Dim ses As New NotesSession
Dim db As NotesDatabase
Set db=ses.CurrentDatabase
Dim doc As NotesDocument
Dim memo As NotesDocument
Dim dc As NotesDocumentCollection
Dim dc2 As NotesDocumentCollection
Dim doc2 As NotesDocument
Dim s As String
Dim dateTime1 As NotesDateTime
Dim dateTime2 As NotesDateTime
Dim dateTime3 As NotesDateTime
Set dateTime1 = New NotesDateTime(Format (Today,"dd.mm.yyyy"))
Set dateTime3 = New NotesDateTime(Format (Today,"dd.mm.yyyy"))
Call dateTime1.AdjustDay(-31) ' устанавливаем дату на месяц назад
' -------------------------------------- читаем документ настройки
Print "-----------------START --------------------"
searchFormula2$ = {Form = "Settings"}
Set dc2 = db.Search(searchFormula2$,Nothing,0) ' выборка документов настройки
Set doc2 = dc2.GetFirstDocument
Print "отобрано документов настройки: " & dc2.Count

Print "-------------------------------------------------"
Print "отсечка для поиска " & dateTime1.DateOnly
searchFormula$ = {Form = "NewRep"}
Set dc = db.Search(searchFormula$, dateTime1,0) ' выборка документов за последний месяц
Set doc = dc.GetFirstDocument
Print "отобрано документов " & dc.Count
While Not (doc Is Nothing)
Set dateTime2 = New NotesDateTime(Format (doc.Getitemvalue("Rep_date")(0),"dd.mm.yyyy") )
Print "отсечка: " & dateTime2.timedifference(dateTime3) & " документ от " & dateTime2.DateOnly
' отбираем документы, у которых срок отчета не более недели
If dateTime2.timedifference(dateTime3) > 0 And dateTime2.timedifference(dateTime3) < 604800 Then
Print dateTime3.DateOnly +": отправка напоминаний на отчет от " + dateTime2.DateOnly
Print "date1_cur" & doc.GetItemValue("date1_cur")(0)
If doc.GetItemValue("date1_cur")(0)="" Then
Print "отправка уведомления в офис 1 : " & doc2.GetItemValue("Remind_1")(0)
' Print "поле документа: " & doc.GetItemValue("date1_cur")(0).text
Call mailer (doc2.GetItemValue("Remind_1")(0) ,doc) ----------------------------- здесь выдается Object Variable not set !


End If



End If

Set doc = dc.GetNextDocument(doc)
Wend


End Sub
 
"Couldn't get default view id for database"

вот на этой строке:
Call rtitem.AppendDocLink(document,db1.Title)
 
phantom76
ну так и задайте вид "по-умолчанию" для БД на которую делаете ссылку
 
phantom76
ну так и задайте вид "по-умолчанию" для БД на которую делаете ссылку
в любом удобном виде есть в свойствах Default when database is first opened
ставится только для одного вида, без вида по-умолчанию, почему-то, нельзя создать ссылки-линки на документы в РТ-полях...

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

возможно, избавиться от ошибок совсем это и не поможет, но во всяком случае не придется сидеть в отладчике и лопатить все вызовы функций, а сразу в мессадже увидишь, что ошибка в той-то строке той-то функции...
 
Спасибо, учту!

решаю задачку по модернизации одного приложения, один момент пока не решил.. суть: с формы происходит выбор имен из текущей адресной книги сразу из нужного вида, хочу сделать такк, чтобы появлялся вместо него стандартный "Use address dialog for choices" , чтобы была возможность выбирать персон из дополнительных адресных книг. Соответсвенно на форме есть Hotspot c обработчиком действия "клик":

Sub Click(Source As Button)
Call gl_add
End Sub

вызываемая функция:

Sub gl_Add
Dim vList As Variant
vList = getUIUsersList
If vList(0) = "" Then Exit Sub

nd.List = SumArraysEx(nd.List, vList, True)

Call gl_Refresh(True)
End Sub


и функция из библиотеки:

Function getUIUsersList
Dim vEmpty(0) As Variant

getUIUsersList = vEmpty

Dim vBooks As Variant

vBooks = ses.AddressBooks

Dim dbBook As NotesDatabase

Forall vBook In vBooks - это проверка ненужна будет (vBooks содержит все множество книг)
If vBook.IsPublicAddressBook Then

Set dbBook = vBook
Goto open_
End If
End Forall
Exit Function

open_:
Call dbBook.open("", "")

Dim ndc As NotesDocumentCollection
Set ndc = getPickListDocEx(dbBook, True, "People", "Пользователи", "Выберите:", "")

If ndc Is Nothing Then Exit Function

Dim vUsers As Variant
Redim vUsers(ndc.Count - 1) As Variant

Dim nd As NotesDocument
Set nd = ndc.getFirstDocument

Dim nIndex As Integer
While Not nd Is Nothing
vUsers(nIndex) = nd.FullName(0)

nIndex = nIndex + 1
Set nd = ndc.getNextDocument(nd)
Wend

getUIUsersList = vUsers
End Function


Что можно порекомендовать, чтобы функцию getUIUsersList - преобразовать для выбора адресатов из нескольких адресных книг? капаюсь в документации..
 
спасибо, помогло, все исправил :blink:
 
провожу проверку полномочий в форме через QueryOpen:

'Проверка доступа к документу'

continue = True
Set db = session.CurrentDatabase
Set acl = db.ACL
Set entry = acl.GetEntry( session.UserName )
If ( entry Is Nothing ) Then
continue = False
Elseif Not ( entry.IsRoleEnabled( "Admin" ) Or entry.IsRoleEnabled( "Editor" ) Or entry.IsRoleEnabled( "AllReaders" ) ) Then
continue = False
End If

Но, похоже, если юрез явно не присутствует в ACL это не работает, как быть в случае групп?
 
все обходится просто, если код открыт и руки...
Даже если код открыт, то сложно изменить документ, к которому у тебя доступа нет.

как обходиться? и чем заменить?
Например, добавлю свою кнопку с формулами @SetField(...).
Или, если дизайн открыт, то копирую твою форму в свою локальную базу. И открываю нужный документ через NotesUIWorkspace.DialogBox.
По-нормальному, это ACL и полями Authors и Readers.
 
Даже если код открыт, то сложно изменить документ, к которому у тебя доступа нет.
ну, с этим сильно не поспоришь :blink:
но во многих случаях доступ на чтение должен быть, но без возможности открывать документ на УИ...
видать в текущем случае именно так и получается...

Например, добавлю свою кнопку с формулами @SetField(...).
Или, если дизайн открыт, то копирую твою форму в свою локальную базу. И открываю нужный документ через NotesUIWorkspace.DialogBox.
По-нормальному, это ACL и полями Authors и Readers.
эти поля не помогают при указанной выше ситуации...
 
требуется обезопасить базу - 1 - зашифоровать , 2. запретить копирование и реплики

со вторым нет вопросов: отбираю права и как дополнение могу в свойствах репликации выставить - отмену для этой реплики.
а как ее зашифровать программно? административные средства известны.. что можно придумать?
 
интересует такой момент: - Существует ли функция( для @-формул) или свойство для объектов на LS , чтобы проверить перед сохранением документа изменили ли конкретное поле или нет?

P.S.
про вариант "запоминания" значения перез редактированием документа и последующим сравнением с содержанием поля все понятно..
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!