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

  • Автор темы Guest
  • Дата начала
G

Guest

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

Код:
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
 
G

Guest

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#3
Используй NotesLog, чтобы отследить действия агента.
Агент может свалится на какой-нибудь ошибке. Например, поле не найдет. Или при использовании метода notesDocument.Send на несуществующем адресате. Т.е. в поле может быть имя, а реально этого человека уже нет.
 
G

Guest

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

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#5
Все таки глянь, что с правами. От имени кого запускается агент (свойство Run on behalf of) ?
Может не меняются только richtext поля ?
 
F

Fan13tom

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

nila

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

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

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

Fan13tom

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

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

Помогите разобратся плз.
попробуйте выделить значение строковой переменной query символами {},
query={(Form="Profile" & Status="1")}
 
N
#10
Разобралась!
Взяла в профайл установила настроики пути на сервер где база находится.
А вот можете подскзать.
Это всегда надо полный путь прописывать... и что только выход--- в профайле задавать путь?
Или какие то еще другие обходы с этим есть...?


попробуйте выделить значение строковой переменной query символами {},
query={(Form="Profile" & Status="1")}
Да за это спасибо!!! буду знать... а то часто так пишу и оно на кавычки ругается!)
сенкс
 
F

Fan13tom

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

Да за это спасибо!!! буду знать... а то часто так пишу и оно на кавычки ругается!)
сенкс
На самом деле строка:
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 приложений считается создание документа настроек, как вариант в виде профайла. можно и просто не профайл документ создавать и там указывать настройки. Либо в Нотес.ини (не самый лучший вариант). Все зависит от конкретной задачи.
Успехов в программировании