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

Тема в разделе "Lotus - Программирование", создана пользователем Idea, 28 фев 2007.

  1. Idea

    Idea Гость

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

    Код (Text):
     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
     
  2. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    на первый взгляд не хватает
    Call doc.Save( False, True )
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Вот мой пример. Ставит напоминание в свой календарь.
    Код (Text):
    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
    Ставить можно только себе. Если ты хочешь еще кому-то, то боюсь ничего не получится.
     
  4. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    <!--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]

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    Ага.
     
  6. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    Я лично, не пробовал, но теоретически не вижу проблем, в том что бы создать в чужой базе документ по форме Appointment...

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Дело в том, что после создания напоминания нужно вызывать метод notesUIWorkspace.CheckAlarms(). В хелпе так и написано:
    Без этого нет гарантий, что напоминание появится. Причем в календарике оно будет висеть как надо, но окошко не выскочит.

    <!--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]
    Я пробовал. Поначалу работало нормально. Но со временем некоторые пользователи переставали получать уведомления.
     
  8. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    <!--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]

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

    Idea Гость

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

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    <!--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]

    http://codeby.net/ipb.html?s=&sh...ost&p=57610
     
  11. Idea

    Idea Гость

    а какой тип у переменной ni и alarmDateTime?

    да, спасибо) уже разглядела - не успела отредактировать пост)
     
  12. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    <!--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
     
  13. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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
     
  14. Idea

    Idea Гость

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

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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).
    И скрытое, которое будет содержать дату и время, с формулой:
    Код (Text):
    @If(@IsNull(StartDate) | @IsNull(StartTime); @Nothing; @TimeMerge(StartDate; StartTime))
     
  16. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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:
     
  17. Idea

    Idea Гость

    В общем код заработал, и даже периодически как надо, но есть такие кривые места. В общем в документе я ставлю галочку - типа "Уведомить", т.е. поставить ремаиндер. Код вешаю на событие PostSave. Создается ремаиндер, но когда я его открываю из календаря своего - вылезает окошко "Error trying to open document. Note item no found". Жмешь кнопку ОК и ремаиндер благополучно открывается. Мелочь, но неприятно. Это как-то связано с тем, что я накодила или это уже безобразия самого Лотуса?
    И ещё одна неприятность. Так как в коде уже есть вызов сейва созданного ремаиндера, а юзвери наши хотят подстраховаться и нажимают на форме ремаиндера Save and Close, после чего им выдается страшное окошко - "Не буду ниче сохранять, док с таким ид уже есть в базе!". Они пугаются. Чем чревато вычеркивание из кода?
    Код (Text):
     Call doc.Save(True, True, True)
    Call ws.CheckAlarms
    Лотус же наверняка делает ЧекАлармс когда сохраняешь ремаиндер им самим или нет?
    Ну или как вариант - можно ли ремаиндер не открывать на редактирование - засейвить его потихоньку и выдать юзверю сообщение - типа "я тут тебе ремаиндер сделан - хошь посмотреть - загляни в календарь свой"? Вот как поступить с точки зрения дружественности интерфейса?
    Ну вот в общем вам и сам код, мало ли пригодится
    Код (Text):
    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
     
  18. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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. :(
    Если открывать напоминание только для того, чтобы пользователь нажал кнопку "Сохранить", то это явно не очень удобно. Я бы сообщение сделал.
     
  19. Idea

    Idea Гость

    была бы тут кнопочка благодарностей, я б вам уже мильен их поставила) Большое Спасибо за советы!!!:)
     
Загрузка...

Поделиться этой страницей