Агент по расписанию (изменение в другой базе)

Тема в разделе "Lotus - Программирование", создана пользователем -, 2 мар 2006.

  1. Гость

    Есть агент, который запускается по расписанию.
    Он ищет просроченные доки и возвращает их авторам.
    При этом должны меняться значения в связанных доках в другой базе, но почему-то ничего не меняется.
    Базы лежат в одной папке. Агент подписан сервером и права на вторую базу имеет.

    Код (Text):
    Sub Initialize
    On Error Resume Next
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim sdb As NotesDatabase
    Dim collection As NotesDocumentCollection
    Dim doc, bdoc As NotesDocument
    Dim ndoc As NotesDocument
    Dim memo As NotesDocument
    Dim view As NotesView
    Dim sview As NotesView
    Dim mail(1 To 3) As String

    Set db = session.CurrentDatabase
    Dim dateTime As New NotesDateTime("12/01/94")  
    SearchString$ = {Form = "Request" & Status="5" & Priznak_FS!="Признак наличия документов в ФС" & Visible!="0"}  
    Set collection = db.Search(SearchString$,dateTime,0)
    Set db2=session.GetDatabase("","New EPS.NSF",False)
    sums=Split(doc.GetFirstItem("RBudgetSum").text,";")

    'Msgbox collection.Count
    If collection.Count>0 Then
     Dim dateTimeNow As New NotesDateTime( Now )
     tnow=dateTimeNow.DateOnly
     tnow=Cdat(tnow)
     
     Call dateTimeNow.AdjustDay( -6 )
     tnext=dateTimeNow.DateOnly
     tnext=Cdat(tnext)
     'Msgbox Str(tnow)+" "+Str(tnext)
     
     For i=1 To collection.Count
       Set doc = collection.GetNthDocument(i) 
       Dim dateTimeNow1 As New NotesDateTime( doc.BOKDate(0) )
       cdate=dateTimeNow1.DateOnly
       cdate=Cdat(cdate)
       'Msgbox Str(tnow)+" "+Str(tnext)+" "+Str(cdate)+" "+doc.BossName_Ok(0)+" "+Str(tnext-cdate)
      
       If tnext>=cdate Then
       'Msgbox "Пошло"
       'Уведомление
       Set mdoc = db.CreateDocument  
       mdoc.Form = "Memo"
       mdoc.SendTo = doc.OwnerNotesName(0)
       mdoc.BlindCopyTo = "Yulia Neverova/BWD@CORP"
       Set rtitem = New NotesRichTextItem( mdoc, "Body" )
       Call rtitem.AddNewLine(2)    
       Call rtitem.AppendText("Ссылка на документ -> ")
       Call rtitem.AppendDocLink( doc, "документ " ) 
       Call rtitem.AddNewLine(1) 
       If tnext-cdate=0 Then
          mdoc.Subject = "Уведомление о скором истечении срока заявки"
          Call rtitem.AppendText("Заявка находится в статусе <К оплате> 7 дней, документы в ФЭС отсуствуют.")
          Call rtitem.AddNewLine(1)  
          Call rtitem.AppendText("При отсуствии документов, завтра заявка будет возвращена автору автоматически.")
          Call rtitem.AddNewLine(1)  
          mail(1) = doc.ManagerNotesName(0)
       Elseif  tnext-cdate>1 Then
          mdoc.Subject = "Уведомление об истечении срока заявки"
          Call rtitem.AppendText("Заявка находилась в статусе <К оплате> больше 7 дней, а документов в ФЭС на нее не поступало.")
          Call rtitem.AddNewLine(1)  
          Call rtitem.AppendText("По этой причине она возвращена Вам на доработку.")
          Call rtitem.AddNewLine(1)  
          value = Evaluate({FIELD Returned:="Возвращено";FIELD HistoryWhen:=@Now;FIELD HistoryWho:="автоматически";FIELD HistoryAction:="Возвращен";FIELD History:=History:(@Text(HistoryWhen) + " " + HistoryWho + ": "+HistoryAction+": истек срок ожидания документов в ФЭС");@SetField("Status";"0");@SetField("Priznak_FS";"Нет документов");},doc)
          Call doc.Save(True, True)
         
    -----------------------------------------------------------------------------------------------
          sums=Split(doc.GetFirstItem("RBudgetSum").text,";")
          j=0
          ids=Arrayunique(Split(doc.GetFirstItem("RIDBudget").text," "))
          Forall id In ids
         Set bdoc=db2.GetDocumentByUNID(id)
         If bdoc.GetFirstItem("RACHistory") Is Nothing Then Call bdoc.AppendItemValue("RACHistory","")
         Set item=bdoc.GetFirstItem("RACHistory")
         Call item.AppendToTextList(Cstr(Now) +" возвращено "+Cstr(sums(j)+" "+session.UserName+" -> "+doc.GetFirstItem("RequestDescription").text))
         Call bdoc.ReplaceItemValue("RARemainder",Cstr(Cdbl(bdoc.GetFirstItem("RARemainder").text)+Cdbl(sums(j))))
         j=j+1
         Call bdoc.Save(True, True)
          End Forall
    -----------------------------------------------------------------------------------------------

          mail(1) = doc.ManagerNotesName(0)
       End If
       mdoc.CopyTo =  mail
       Call mdoc.Send(False) 
       End If
     Next
    End If
    End Sub
     
  2. Гость

    Так никто не знает из-за чего может быть невыполнение таких команд как измениние значений в поле документа другой базы в агенте по расписанию? :)
     
  3. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Используй NotesLog, чтобы отследить действия агента.
    Агент может свалится на какой-нибудь ошибке. Например, поле не найдет. Или при использовании метода notesDocument.Send на несуществующем адресате. Т.е. в поле может быть имя, а реально этого человека уже нет.
     
  4. Гость

    Для: Medevic
    Сообщения-то как раз отлично высылаются.
    Единственное, что не работает (причем все прекрасно работает если запускаешь агент вручную) - это изменение во второй базе данных.
    Ок. Попробую.
     
  5. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Все таки глянь, что с правами. От имени кого запускается агент (свойство Run on behalf of) ?
    Может не меняются только richtext поля ?
     
  6. Fan13tom

    Fan13tom Гость

    Нужна помощь! Есть сервер на нем установлен Domino. клиент в котором есть локальная база с агентом этот агент не запускается по шедулу на локале от имени того кто запускает. Также не запускается по шедулу от имени админа на самом сервере. При запуске руками и тесте - все нормально!!!!
     
  7. Гость

    Может в агенте использоуются UI-классы?
     
  8. nila

    nila Гость

    привет Всем!
    Не могу понять агент работает отлично когда я запускаю в ручную
    когда я его поставила по рассписанию ругается на строчке
    Set db=ses.GetDatabase("","Dep")
    Dim query As String
    query=(Form="Profile" & Status="1")
    Set coll=db.Search(query, Nothing, 0)

    не понимаю почему, когда вручную запускаю все отлично срабатывает.
    и как подписать агент что бы он от сервера работал?

    Помогите разобратся плз.
     
  9. Fan13tom

    Fan13tom Гость

    попробуйте выделить значение строковой переменной query символами {},
    query={(Form="Profile" & Status="1")}
     
  10. nila

    nila Гость

    Разобралась!
    Взяла в профайл установила настроики пути на сервер где база находится.
    А вот можете подскзать.
    Это всегда надо полный путь прописывать... и что только выход--- в профайле задавать путь?
    Или какие то еще другие обходы с этим есть...?


    Да за это спасибо!!! буду знать... а то часто так пишу и оно на кавычки ругается!)
    сенкс
     
  11. Fan13tom

    Fan13tom Гость

    На самом деле строка:
    Set db=ses.GetDatabase("","Dep")
    должна выглядеть так:
    Set db=ses.GetDatabase(Name_of_server,DB_name,[Create_on_fail]),
    где Name_of_server - имя сервера где лежит БД (может указываться "" если сервер, где выполняется данная сессия и где лежит файл БД, текущий), Domino/RU
    DB_name - полный путь к базе (она должна лежать в папке или подпапке папки Data, каталога установки Notes (если код запущен на клиенте) или Domino (если код запущен на сервере)) (например Names.nsf)
    [Create_on_fail]) создавать базу если ее нет в указанном месте. boolean true или false.
    Советую также поставить Option Declare и явно объявлять все переменные.
    Также нужно поставить в код on error.
    И дополнительные проверки на непустоту переменных, например if (db is nothing) then Goto End.
    Что касается профайла, то это совсем не обязательно если код нужен для однократного выполнения, то можно все переменные захардкодить, хорошим же тоном useability приложений считается создание документа настроек, как вариант в виде профайла. можно и просто не профайл документ создавать и там указывать настройки. Либо в Нотес.ини (не самый лучший вариант). Все зависит от конкретной задачи.
    Успехов в программировании
     
Загрузка...

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