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

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

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

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

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

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

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

Guest

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

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

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

Medevic

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

Guest

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

Medevic

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

Fan13tom

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

Guest

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

nila

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

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

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

Fan13tom

привет Всем!
Не могу понять агент работает отлично когда я запускаю в ручную
когда я его поставила по рассписанию ругается на строчке
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

nila

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


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

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

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

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