• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Написание агента

  • Автор темы kilcher
  • Дата начала
K

kilcher

Здравствуйте!
возникла проблема в написании агента :unsure:
Этот агент должен просматривать все документы,которые проходят согласование. И если человек не согласовал какой то(в котором он в списке согласующих),то отправить ему письмо. Проблема в том,что в документе нет поля для тех кто не согласовал и согласовал. Люди проставляют отметку о согласовании,создавая новый документ "answer"(уже вью созданное по новому документу отображается в текущем).
Т. е. получается надо просмотреть коллекцию докментов.в каждом из которых взять значение поля с id,затем по id найти уже документы "ответы" с полями содержащими имена тех кто согласовал.
Вот такой кошмар! Для новых я уже создала три поля:должны согласовть,согласовали и не согласовал. Но вот старые придется обработать агентом,который пытаюсь написать ;) Вот код

Sub Initialize

Dim sess As New NotesSession
Dim db As NotesDatabase
Dim coll As NotesDocumentCollection,col As NotesDocumentCollection
Dim doc As NotesDocument,doc1 As NotesDocument
Dim bodytext As Variant
Dim sss As String
Dim newDoc As NotesDocument
Dim rtitem As NotesRichTextItem
Dim ord As Variant, ans As Variant
Dim vDB As NotesView
Dim answers() As String

Set db = sess.CurrentDatabase
Set coll = db.Search({Form = "Order"}, Nothing, 0)
Set doc = coll.GetFirstDocument

Set vDB= db.GetView("Answer")
While Not doc Is Nothing

ord = doc.GetItemValue( "order_id ") ' берем id
Set col = vDB.GetAllDocumentsByKey(ord )'ищем по нему
Set doc1= col.GetFirstDocument

While Not doc1 Is Nothing
ans = doc1.GetItemValue( "answer_name")'берем имя согласовавшего

'Если подписал
Redim Preserve answers(Lbound(answers) To Ubound(answers) + 1)'создаем список
answers(Ubound( answers)) = doc.soglasovali'заносим его в поле согласовали



Set doc1= col.GetNextDocument(doc1)
Wend


Set doc = coll.GetNextDocument(doc)
Wend

End Sub


Пожалуйста помогите!!!!!
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Ну не такой уж и кошмар. Нормально по-моему. :unsure:
Можно на собаках написать. Гораздо проще будет.
Что-то типа:
Код:
@SetField("твое поле"; @Trim(@DbLookup("" : "NoCache"; ""; "Answer"; order_id; "answer_name"; [FailSilent])))

Но лучше не надо пихать всё в один документ. Каждому согласовывающему по копии. И пусть согласовывает.
 
K

kilcher

Спасибо!!!!!!!!! чего я сразу не догадалась :unsure: Только я да это можно сказать не согласование,а просто ознакомление с документом. Вот еще надо теперь подумать как копии им рассылать ;)
 
K

kilcher

Прошу о помощи все с тем же агентом. :lol: Пришлось писать скриптом конечно вычисления всех этих полей. Два я вычислила легко: кто должен согласовать answer1 и уже согласовал. А вот кто остался не вычисляется. В чем может быть ошибка?

Set coll = db.Search({Form = "Order"}, Nothing, 0)
Set doc = coll.GetFirstDocument
Dim num As Integer


While Not doc Is Nothing
'обнуляем поля
doc.answer1=""
doc.soglasovali=""
doc.ne_soglasovali=""

Set item = doc.GetFirstItem( "answer1" )
Set item1 = doc.GetFirstItem( "soglasovali" )
'заполняем поле именами тех,кто должен проставить отметку

Call item.AppendToTextList( doc.GetItemValue("order_dp") )
Call item.AppendToTextList( doc.GetItemValue("order_mp") )
Call item.AppendToTextList( doc.GetItemValue("member_name") )
'если кто-то уже проставил независимость ищем документ "Answer"и берем от туда имя пользователя
Set view = db.GetView("Answer" )
Set dc = view.GetAllDocumentsByKey(doc.order_id, False)
Set doc1= dc.GetFirstDocument

While Not(doc1 Is Nothing)
Call item1.AppendToTextList( doc1.GetItemValue("From") )

'сравниваем значение полей кто должен проставить отметку и кто уже проставил.
f1 = doc.GetFirstItem("answer1").Values
f2 = doc.GetFirstItem("soglasovali").Values
f3 = Fulltrim(Arrayreplace(f1, f2, ""))
Call doc.ReplaceItemValue("ne_soglasovali", f3)
doc.ComputeWithForm False, False
doc.Save True, True
Set doc1 = dc.GetNextDocument (doc1)
Wend
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Делай на собаках. Проще будет. :)
Код:
@SetField("answer1"; @Unique(@Trim(order_dp : order_mp : ember_name)));
@SetField("soglasovali"; @Trim(@Unique(@DbLookup("" : "NoCache"; ""; "Answer"; order_id; "From"; [FailSilent]))));
@SetField("ne_soglasovali"; @Trim(@Replace(answer1; soglasovali; "")))
 
K

kilcher

Делай на собаках. Проще будет. :)
Код:
@SetField("answer1"; @Unique(@Trim(order_dp : order_mp : ember_name)));
@SetField("soglasovali"; @Trim(@Unique(@DbLookup("" : "NoCache"; ""; "Answer"; order_id; "From"; [FailSilent]))));
@SetField("ne_soglasovali"; @Trim(@Replace(answer1; soglasovali; "")))


Спасибо! Я уже разобралась почему не работал агент. :)
Я никогда не видела агента по рассписанию на собаках. На них разве можно коллекцию просмотреть доков?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Что значит коллекцию просмотреть доков?
 
K

kilcher

Как взять коллекцию я представлю на собаках,а как переходить по документам? Ну что то типа GetNextDocument :)
Или на собаках не так делается?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
На собаках формула применяется ко всем отобранным документам.
 
K

kilcher

Здорово! :)
Вот к чему ведет не знание :)
Спасибо!!!!!!!
 
Мы в соцсетях:

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