• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

<index><STRONG><index><STRONG>Reminder</STRONG> <DIV class="\&

  • Автор темы Idea
  • Дата начала
I

Idea

Уважаемые форумчане, помогите решить следующую проблему. Необходимо создавать документ Reminder в календаре и заполнять его поля при нажатии кнопки. код которой представлен ниже. Суть действа - из документа берется его заголовок, дата события, период уведомления, и список адресов, которым послать оповещение в указанное время. Проблема первая- дата задается в поле текущего документа MDate, и успешно из него извлекается (формат даты аналогичен как в Reminder), но в соответствующее поле Reminder-а она не записывается. Проблема вторая - необходимо заполнить поля подформы Reminder-а для нотификации. Как обратиться из лотусскрипт к полям с именами, начинающихся со знака $??? Ругается он на них страшно.

Код:
 Sub Click(Source As Button)

Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim maildb As NotesDatabase
Dim doc As NotesDocument
Dim mailDBName As Variant
Dim pee As Variant
Dim sbj As Variant
Dim uidoc As NotesUIDocument
Dim rtitem As NotesRichTextItem

Set uidoc = ws.CurrentDocument

mailDBName = Evaluate({@MailDbName})
Set maildb = session.GetDatabase(mailDBName(0), mailDBName(1), False)

pee = ws.PickListStrings(PICKLIST_CUSTOM, True, 	"lotus2/IATE",	"PRANAPrj.nsf" , "PranaTeam", "Notify users","Select some addressees", 2)
If Not Isempty(pee) Then
Set doc = maildb.CreateDocument
doc.Form = "Appointment"
doc.AppointmentType = "4"	

doc.StartDate =uidoc.Document.MDate		 //дату получаем, но никуда не пишем

doc.dispAlarms = "1"
doc.tmpOffset = uidoc.Document.Timeout
doc.AlarmMemoOptions = "2"						  //на самом деле $AlarmMemoOptions
delim = "," 
doc.AlarmSendTo = Implode(pee, delim)		 // на самом деле $AlarmSendTo

sbj = "Actually Milestone: " + uidoc.FieldGetText( "Title" ) 
doc.Subject = sbj
Set rtitem = New NotesRichTextItem(doc, "Body" )
Call rtitem.appendText("Document link:")
Call rtitem.addNewLine(2)
Call rtitem.AppendDocLink( uidoc.document, " " )
Call rtitem.Update

End If
End Sub
 
V

vvlad

на первый взгляд не хватает
Call doc.Save( False, True )
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Вот мой пример. Ставит напоминание в свой календарь.
Код:
Dim ws As New NotesUIWorkspace
...
Set ni = doc.GetFirstItem("AlarmDateTime") 'AlarmDateTime - поле типа Date/Time.
Set alarmDateTime = ni.DateTimeValue
mailDBName = Evaluate({@MailDbName})
Set maildb = New NotesDatabase(mailDBName(0), mailDBName(1))
Set maildoc = maildb.CreateDocument
With maildoc
.Form = "Appointment"
.~$AlarmTime = alarmDateTime.LSLocalTime
.~$Alarm = 1
.Subject = doc.Subject ' Тема
.CalendarDateTime = alarmDateTime.LSLocalTime
.StartDateTime = alarmDateTime.LSLocalTime
.ReminderTime = alarmDateTime.LSLocalTime
.EndDateTime = alarmDateTime.LSLocalTime
.ExcludeFromView = Evaluate({"D" : "S"})
.Principal = doc.AuthorFull ' полное имя автора
.~$AltPrincipal = doc.Author ' альтернативное имя автора
.AppointmentType = "4"
.~_ViewIcon = 10
End With
Call maildoc.Save(True, True, True)
Call maildoc.PutInFolder("($Alarms)")
Call ws.CheckAlarms

Ставить можно только себе. Если ты хочешь еще кому-то, то боюсь ничего не получится.
 
V

vvlad

<!--QuoteBegin-Medevic+28:02:2007, 17:16 -->
<span class="vbquote">(Medevic @ 28:02:2007, 17:16 )</span><!--QuoteEBegin-->Ставить можно только себе
[snapback]57610" rel="nofollow" target="_blank[/snapback]​
[/quote]

гм... Даже если есть доступ к "чужой" базе?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-vvlad+28:02:2007, 17:19 -->
<span class="vbquote">(vvlad @ 28:02:2007, 17:19 )</span><!--QuoteEBegin-->гм... Даже если есть доступ к "чужой" базе?
[snapback]57611" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ага.
 
V

vvlad

Я лично, не пробовал, но теоретически не вижу проблем, в том что бы создать в чужой базе документ по форме Appointment...

Или имеется в виду, что такое напоминание не сработает у владельца базы?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Дело в том, что после создания напоминания нужно вызывать метод notesUIWorkspace.CheckAlarms(). В хелпе так и написано:
You use this method when creating a new alarm from a template. Any time a template creates a new appoint event that contains an alarm, the template script calls CheckAlarms, causing the daemon to check for new alarms.
Без этого нет гарантий, что напоминание появится. Причем в календарике оно будет висеть как надо, но окошко не выскочит.

<!--QuoteBegin-vvlad+28:02:2007, 17:27 -->
<span class="vbquote">(vvlad @ 28:02:2007, 17:27 )</span><!--QuoteEBegin-->Я лично, не пробовал, но теоретически не вижу проблем, в том что бы создать в чужой базе документ по форме Appointment...
[snapback]57613" rel="nofollow" target="_blank[/snapback]​
[/quote]
Я пробовал. Поначалу работало нормально. Но со временем некоторые пользователи переставали получать уведомления.
 
V

vvlad

<!--QuoteBegin-Medevic+28:02:2007, 17:32 -->
<span class="vbquote">(Medevic @ 28:02:2007, 17:32 )</span><!--QuoteEBegin-->Я пробовал. Поначалу работало нормально. Но со временем некоторые пользователи переставали получать уведомления.
[snapback]57614" rel="nofollow" target="_blank[/snapback]​
[/quote]

Учту на будущее, Спасибо!
 
I

Idea

Ещё раз поясню вопрос. Напоминание фактически ставится себе, но если поставлена галочка "Notify me", открывается подформа, в которой можно задать период, когда напомнить и указать, кому послать сообщение в это время. Суть того, что должно быть - дата события берется из текущей формы и передается в напоминание ( сейчас этого не происходит - хз почему), на подформе с уведомлением необходимо изменить значения полей (выставить галочку "уведомить юзверей" и указать, кому именно отправить послание). Проблема в том, что имена этих полей начинаются со знака $, как мне к ним обратиться из LS?
вышеупомянутые строки
Код:
 		Call doc.Save(True, True, True)
Call ws.CheckAlarms()

положение не спасли.
 
V

vvlad

<!--QuoteBegin-Idea+1:03:2007, 11:11 -->
<span class="vbquote">(Idea @ 1:03:2007, 11:11 )</span><!--QuoteEBegin-->имена этих полей начинаются со знака $, как мне к ним обратиться из LS?
[snapback]57694" rel="nofollow" target="_blank[/snapback]​
[/quote]

link removed
 
V

vvlad

<!--QuoteBegin-vvlad+1:03:2007, 11:31 -->
<span class="vbquote">(vvlad @ 1:03:2007, 11:31 )</span><!--QuoteEBegin-->а какой тип у переменной ni и alarmDateTime?
[snapback]57705" rel="nofollow" target="_blank[/snapback]​
[/quote]

NotesItem и NotesDateTime
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+1:03:2007, 11:30 -->
<span class="vbquote">(Idea @ 1:03:2007, 11:30 )</span><!--QuoteEBegin-->а какой тип у переменной ni и alarmDateTime?
[snapback]57703" rel="nofollow" target="_blank[/snapback]​
[/quote]
ni - NotesItem
alarmDateTime - NotesDateTime
 
I

Idea

Спасибо всем большое - работает. Только вот возникла необходимость взять дату и время из разных полей и вписать в аналогичные поля даты и времени ремаиндера. Сделала задание даты как в примере, пыталась понять смысл строк
Код:
 		doc.CalendarDateTime = remtime .LSLocalTime	
doc.ReminderTime = remtime .LSLocalTime
doc.EndDateTime = remtime .LSLocalTime
doc.StartDateTime = remtime .LSLocalTime

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

В общем как в значение поля, в котором пользователь задает только дату (время соответственно стоит 00:00) поставить время из другого поля?) Хотя я думаю это изврат. Может можно что-то более изящное придумать? Вариант - давайте поправим время прям в редакторе ремаиндера заказчика не устраивает. А вариант - вводить дату и время ручками (если ж поставить отображение даты и времени, подсказка с календарем исчезает) - по-моему неудобно.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+1:03:2007, 15:46 -->
<span class="vbquote">(Idea @ 1:03:2007, 15:46 )</span><!--QuoteEBegin-->В общем как в значение поля, в котором пользователь задает только дату (время соответственно стоит 00:00) поставить время из другого поля?) Хотя я думаю это изврат. Может можно что-то более изящное придумать? Вариант - давайте поправим время прям в редакторе ремаиндера заказчика не устраивает. А вариант - вводить дату и время ручками (если ж поставить отображение даты и времени, подсказка с календарем исчезает) - по-моему неудобно.
[snapback]57766" rel="nofollow" target="_blank[/snapback]​
[/quote]
Сделай два поля. Одно с датой(StartDate), другое со временем(StartTime).
И скрытое, которое будет содержать дату и время, с формулой:
Код:
@If(@IsNull(StartDate) | @IsNull(StartTime); @Nothing; @TimeMerge(StartDate; StartTime))
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+1:03:2007, 15:46 -->
<span class="vbquote">(Idea @ 1:03:2007, 15:46 )</span><!--QuoteEBegin-->я понимаю, что это как раз про дату с временем, но не понимаю, откуда такие названия полей (у формы же вроде другие и у ремаиндера нет например даты окончания), однако если хоть какую-нить строку убрать, уже ничего не получается. В общем как обычно - работает, но хз почему))

[snapback]57766" rel="nofollow" target="_blank[/snapback]​
[/quote]
А ты создай напоминание и посмотри потом какие поля у документа. Остальное - методом тыка. :huh:
 
I

Idea

В общем код заработал, и даже периодически как надо, но есть такие кривые места. В общем в документе я ставлю галочку - типа "Уведомить", т.е. поставить ремаиндер. Код вешаю на событие PostSave. Создается ремаиндер, но когда я его открываю из календаря своего - вылезает окошко "Error trying to open document. Note item no found". Жмешь кнопку ОК и ремаиндер благополучно открывается. Мелочь, но неприятно. Это как-то связано с тем, что я накодила или это уже безобразия самого Лотуса?
И ещё одна неприятность. Так как в коде уже есть вызов сейва созданного ремаиндера, а юзвери наши хотят подстраховаться и нажимают на форме ремаиндера Save and Close, после чего им выдается страшное окошко - "Не буду ниче сохранять, док с таким ид уже есть в базе!". Они пугаются. Чем чревато вычеркивание из кода?
Код:
 Call doc.Save(True, True, True)
Call ws.CheckAlarms
Лотус же наверняка делает ЧекАлармс когда сохраняешь ремаиндер им самим или нет?
Ну или как вариант - можно ли ремаиндер не открывать на редактирование - засейвить его потихоньку и выдать юзверю сообщение - типа "я тут тебе ремаиндер сделан - хошь посмотреть - загляни в календарь свой"? Вот как поступить с точки зрения дружественности интерфейса?
Ну вот в общем вам и сам код, мало ли пригодится
Код:
Sub Postsave(Source As Notesuidocument)
Dim ws As New NotesUIWorkspace
Dim session As New NotesSession
Dim maildb As NotesDatabase
Dim doc As NotesDocument
Dim mailDBName As Variant
Dim pee As Variant
Dim sbj As Variant
Dim uidoc As NotesUIDocument
Dim rtitem As NotesRichTextItem
Dim ni As NotesItem
Dim remtime As NotesDateTime
'Dim stri As String

Set uidoc = ws.CurrentDocument

If (uidoc.Document.GetItemValue("Notify")(0) = "Notify") Then

Set ni = uidoc.Document.GetFirstItem("NotyTime") 'поле типа Date/Time.
Set remtime = ni.DateTimeValue

mailDBName = Evaluate({@MailDbName})
Set maildb = session.GetDatabase(mailDBName(0), mailDBName(1), False)

Set doc = maildb.CreateDocument
doc.Form = "Appointment"
doc.AppointmentType = "4"	

doc.CalendarDateTime = remtime .LSLocalTime	
doc.ReminderTime = remtime .LSLocalTime
doc.EndDateTime = remtime .LSLocalTime
doc.StartDateTime = remtime .LSLocalTime	

doc.dispAlarms = "1"
doc.~$AlarmMemoOptions = "2" 
delim = "," 
doc.~$AlarmSendTo = uidoc.Document.RemindPers

sbj = "Actually Milestone: " + uidoc.FieldGetText( "Title" ) 
doc.Subject = sbj
Set rtitem = New NotesRichTextItem(doc, "Body" )
Call rtitem.appendText("Document link:")
Call rtitem.addNewLine(2)
Call rtitem.AppendDocLink( uidoc.document, " " )
Call rtitem.Update
Call ws.EditDocument(True, doc, False)
Call doc.Save(True, True, True)
Call ws.CheckAlarms
End If
End Sub
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Idea+2:03:2007, 13:51 -->
<span class="vbquote">(Idea @ 2:03:2007, 13:51 )</span><!--QuoteEBegin-->Создается ремаиндер, но когда я его открываю из календаря своего - вылезает окошко "Error trying to open document. Note item no found". Жмешь кнопку ОК и ремаиндер благополучно открывается. Мелочь, но неприятно.
[snapback]57929" rel="nofollow" target="_blank[/snapback]​
[/quote]
Не хватает полей. Смотри мой код. Все эти поля нужны чтобы эта ошибка не появлялась.

<!--QuoteBegin-Idea+2:03:2007, 13:51 -->
<span class="vbquote">(Idea @ 2:03:2007, 13:51 )</span><!--QuoteEBegin-->Лотус же наверняка делает ЧекАлармс когда сохраняешь ремаиндер им самим или нет?
[snapback]57929" rel="nofollow" target="_blank[/snapback]​
[/quote]
Делает.

<!--QuoteBegin-Idea+2:03:2007, 13:51 -->
<span class="vbquote">(Idea @ 2:03:2007, 13:51 )</span><!--QuoteEBegin-->Ну или как вариант - можно ли ремаиндер не открывать на редактирование - засейвить его потихоньку и выдать юзверю сообщение - типа "я тут тебе ремаиндер сделан - хошь посмотреть - загляни в календарь свой"? Вот как поступить с точки зрения дружественности интерфейса?
[snapback]57929" rel="nofollow" target="_blank[/snapback]​
[/quote]
Можно. Только не забудь Call ws.CheckAlarms. :(
Если открывать напоминание только для того, чтобы пользователь нажал кнопку "Сохранить", то это явно не очень удобно. Я бы сообщение сделал.
 
Мы в соцсетях:

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