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

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

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

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

<index><STRONG><index><STRONG>Пишу агента</STRONG> <DIV class=&quot

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

Стоит такая задача, есть виюха, а на панели действия кнопачка, кнопая на которую запускается агент.
С этим вопросов нет.

Агент делает вот что, перебирает коллекцию отмеченых документов, и удаляет дубли или реплейсит одно из полей.

Признак дубля и действие может быть выражено так:

Apole = Apole & Tpole = Tpole & Dpole = Dpole - значит это дубль, удаляем дублирующий документ.
либо
Apole = Apole & Tpole = Tpole & Dpole = Dpole - значит это дубль, в дубле Zpole переименовываем.

Что бы задача была более ясной можно обрисовать все так:

Есть вьюха DocsNoZ в которой представлены документы в которых Zpole = 0
Есть вьюха DocsYesZ в которой представлены документы в которых Zpole = 1

В первой вьюшке нужно избавиться от дублей, то есть либо удалить документ либо перевести Zpole = 1

Буду очень признателен за помощь.
 
M

morpheus

так в чем собственно состоит вапрос?
 
L

LIGHT

Вопрос в написание такого агента:

Вот мой кодик, он просто всю отмеченую коллекцию "перемещает" в другую вьюху, а мне нужно:
- что бы он взял 1-вый отмеченый дог получил значения полей, пробежался по остальным отмеченым, если есть дубль поля ==, переименовал Zpole .
- взял 2-ой отмеченый док ...
- взял 3-ий отмеченый док ...
- взял N-ный отмеченый док ...

Код:
Sub Initialize
Dim s As NotesSession
Dim db As NotesDatabase, mail As NotesDatabase
Dim dc As NotesDocumentCollection
Dim uidoc As NotesUIDocument
Dim note As NotesDocument, memo As NotesDocument, NewDoc As notesdocument, doc As NotesDocument
Dim w As NotesUIWorkspace
Dim item As NotesItem
Dim temp As Variant
Dim sendto () As String
Dim duplicateCheck List As Integer
Dim count As Integer
Set s = New NotesSession
Set db = s.CurrentDatabase
Dim eval As Variant

Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
Set w = New NotesUIWorkspace

Do Until doc Is Nothing
Call doc.ReplaceItemValue("Zpole", "1")
Set DOC = dc.GetNextDocument (DOC)					

Loop
Call w.ViewRefresh
On Error Resume Next
Set UIdoc=w.CurrentDocument
On Error Goto 0
If Not UIdoc Is Nothing Then
If Not UIdoc.InPreviewPane Then Call UIdoc.Close
End If
End Sub
 
M

morpheus

<!--QuoteBegin-LIGHT+26:02:2007, 14:36 -->
<span class="vbquote">(LIGHT @ 26:02:2007, 14:36 )</span><!--QuoteEBegin-->от мой кодик, он просто всю отмеченую коллекцию "перемещает" в другую вьюху, а мне нужно
[snapback]57299" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ваш кодик как раз и проходитья по всем документам

Do Until doc Is Nothing
добавить через IF проверку поля со следующим/предидущим документом
Call doc.ReplaceItemValue("Zpole", "1")
Set DOC = dc.GetNextDocument (DOC)
 
L

LIGHT

<!--QuoteBegin-Morpheus+26:02:2007, 15:51 -->
<span class="vbquote">(Morpheus @ 26:02:2007, 15:51 )</span><!--QuoteEBegin-->добавить через IF проверку поля со следующим/предидущим документом
[snapback]57301" rel="nofollow" target="_blank[/snapback]​
[/quote]

В том то и проблема ни как не могу это понять.

Как мне в переменную считать значение полей первого документа.
Потом считать в цикле, значения полей других документов.
Сравнить их и выполнить условие, перейти к следующему документу.

Выглядит примерно так
1 док
2 док
3 док
4 док
5 док

Берем 1 док
проверям 2;3;4;5
Берем 2 док
проверяем 3;4;5
Берем 3 док
проверяем 4;5

Вот в этом и загвоздка

Хорошо бы код агента для размышления :)

т.е. дублем может быть 1;4;5 или 2;3 или вариантов много
 
V

vvlad

гм...
цикл в цикле...
грубо говоря :


Код:
  Set dc = db.UnprocessedDocuments
Set dc1 = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
Set doc1 = dc.GetFirstDocument
Set w = New NotesUIWorkspace

Do Until doc Is Nothing
Do Until doc1 Is Nothing

' Здесь проверка того, что тебе нужно....

Set DOC1 = dc1.GetNextDocument (DOC1)					
Loop
Set DOC = dc.GetNextDocument (DOC)					

Loop
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-LIGHT+26:02:2007, 17:36 -->
<span class="vbquote">(LIGHT @ 26:02:2007, 17:36 )</span><!--QuoteEBegin-->Как мне в переменную считать значение полей первого документа.
Потом считать в цикле, значения полей других документов.
Сравнить их и выполнить условие, перейти к следующему документу.
[snapback]57323" rel="nofollow" target="_blank[/snapback]​
[/quote]
Зачем это?
Всё делается очень просто. Создается вьюха с первой отсортированной колонкой. Её значение : Apole + "~" + Tpole + "~" + Dpole.
Потом метод notesView.GetAllDocumentsByKey. А дальше - дело техники. :)
 
M

morpheus

Для: vvlad
Set для Doc1 не забудте

Set doc1 = dc.GetFirstDocument и вперёд, да кстати зделать проверку что бы Doc != Doc1 а то амого с сабой будете сравнивать
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-Medevic+26:02:2007, 17:48 -->
<span class="vbquote">(Medevic @ 26:02:2007, 17:48 )</span><!--QuoteEBegin-->Потом метод notesView.GetAllDocumentsByKey. А дальше - дело техники.
[snapback]57326" rel="nofollow" target="_blank[/snapback]​
[/quote]
А можно на собаке сделать. Тогда вообще будет быстро.
 
V

vvlad

<!--QuoteBegin-Morpheus+26:02:2007, 17:48 -->
<span class="vbquote">(Morpheus @ 26:02:2007, 17:48 )</span><!--QuoteEBegin-->Set для Doc1 не забудте
[snapback]57327" rel="nofollow" target="_blank[/snapback]​
[/quote]



но вариант Medevicа покрасивше будет :)
Я бы именно его реализовывал...
 
S

SOFTOBZOR.ru

<!--QuoteBegin-Medevic+26:02:2007, 17:48 -->
<span class="vbquote">(Medevic @ 26:02:2007, 17:48 )</span><!--QuoteEBegin-->Зачем это?
Всё делается очень просто. Создается вьюха с первой отсортированной колонкой. Её значение : Apole + "~" + Tpole + "~" + Dpole.
Потом метод notesView.GetAllDocumentsByKey. А дальше - дело техники. biggrin.gif
[snapback]57326" rel="nofollow" target="_blank[/snapback]​
[/quote]
А тут затык, если юзерам надо что бы кнопка была именно в той вьюхе которая есть уже сейчас, хотя ваш вариант тоже можно применить, например сделать скрытую колонку :ph34r: в этой вьюхе.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Для: SOFTOBZOR.ru
Не вижу затыка. Мы же будем использовать эту вьюху только для проверки документов. Она вообще будет скрытая. А какие документы мы будем проверять и как их отберем не имеет значения.

И скрытая колонка явно будет лишней.

Я понял, что ты имеешь в виду. Извиняюсь. Ушел спать. :ph34r:
 
L

LIGHT

Что-то не получается.

Повесил агента на кнопку

Код:
Sub Click(Source As Button)

Dim s As NotesSession
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim dc As NotesDocumentCollection
Dim dc1 As NotesDocumentCollection
Dim doc As NotesDocument
Dim doc1 As NotesDocument
Dim w As NotesUIWorkspace

Set s = New NotesSession
Set db = s.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set dc1 = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
Set doc1 = dc.GetFirstDocument
Set w = New NotesUIWorkspace

Do Until doc Is Nothing
Do Until doc1 Is Nothing

'Call doc1.ReplaceItemValue("Zpole", "1")
'Call doc1.save(True,True,True)

Set doc1 = dc1.GetNextDocument (doc1)					
Loop
Set doc = dc.GetNextDocument (doc) 
Loop

Call w.ViewRefresh
On Error Resume Next

Set UIdoc=w.CurrentDocument
On Error Goto 0

If Not UIdoc Is Nothing Then
If Not UIdoc.InPreviewPane Then Call UIdoc.Close
End If

End Sub

Появляется ошибка:

Код:
---------------------------
Lotus Notes
---------------------------
Document is not from this collection
---------------------------
ОК  
---------------------------
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
<!--QuoteBegin-LIGHT+27:02:2007, 10:47 -->
<span class="vbquote">(LIGHT @ 27:02:2007, 10:47 )</span><!--QuoteEBegin-->Set doc1 = dc.GetFirstDocument
[snapback]57398" rel="nofollow" target="_blank[/snapback]​
[/quote]
 
L

LIGHT

Ой :) точно.

Ну теперь добралиь до самого интересногоа именно центра данного кода
Код:
	Do Until doc Is Nothing
Do Until doc1 Is Nothing

IF ?????????????? THEN


'Call doc1.ReplaceItemValue("Zpole", "1")
'Call doc1.save(True,True,True)


END IF

Set doc1 = dc1.GetNextDocument (doc1)					
Loop
Set doc = dc.GetNextDocument (doc) 
Loop

Пожалуйста, не обессудте но ни как не врублюсь в этот LS, как вычислить переменную и сравнить?


Наверно так?

Let dApole = doc.GetItemValue ("Apole")
 
L

LIGHT

Спасибо получилось, только не понял как сдеалать двойную проверку

IF pole1=pole2 and doc!=doc1 Then
IF pole1=pole2 & doc!=doc1 Then

Как правильно?

Или на лотусях нужно делать вложеную проверку
Код:
IF pole1=pole2 Then
IF pole3=pole3 Then

Print "ОК"

End if
End if
 
L

LIGHT

<!--QuoteBegin-Morpheus+26:02:2007, 17:48 -->
<span class="vbquote">(Morpheus @ 26:02:2007, 17:48 )</span><!--QuoteEBegin-->Set doc1 = dc.GetFirstDocument и вперёд, да кстати зделать проверку что бы Doc != Doc1 а то амого с сабой будете сравнивать
[snapback]57327" rel="nofollow" target="_blank[/snapback]​
[/quote]

Что то не получается такое

Код:
If pole1=pole2 Then

If doc=doc1 Then
print "NO"
Else
'Call doc1.ReplaceItemValue("From", "Дубли")
'Call doc1.save(True,True,True)
Print "ОК"

End If	
End If

Ругается на неверный тип doc или doc1
 
L

LIGHT

В общем получилась такая картина и даже работает, но как то кривовато.

Код:
Sub Click(Source As Button)

Dim s As NotesSession
Dim db As NotesDatabase
Dim uidoc As NotesUIDocument
Dim dc As NotesDocumentCollection
Dim dc1 As NotesDocumentCollection
Dim doc As NotesDocument
Dim doc1 As NotesDocument
Dim w As NotesUIWorkspace
Dim createDate As Variant
Dim i As Variant

'***********************************************

Set s = New NotesSession
Set db = s.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set dc1 = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
Set doc1 = dc1.GetFirstDocument
Set w = New NotesUIWorkspace

'**********************************************

Let counts=dc.Count+dc1.Count

If counts = 0 Then
Messagebox "Необходимо отметить минимум 1 документ",, "Нет документов"
Exit Sub
End If

Do Until doc Is Nothing							'Первый документ
Let pole1=doc.From(0)						'Поле FORM 
Let pole3=doc.SendTo(0)					'Поле SendTo
Let createDate1 = doc.Created			'Время создания документа		
Let pole5 = doc.Subject(0)					'Тема	
Let pole7 = doc.EnterSendFrom(0)		'От кого 

Do Until doc1 Is Nothing							'Следующий документ по циклу
Let pole2=doc1.From(0)						'Поле FORM
Let pole4=doc1.SendTo(0)					'Поле SendTo
Let createDate2 = doc1.Created			'Время создания документа		
Let pole6 = doc1.Subject(0)				'Тема	
Let pole8 = doc1.EnterSendFrom(0)	'От кого 

' Проверка является ли документ дублем но не тем же документом признак разная дата

If pole1=pole2 And createDate1 <> createDate2 And pole3=pole4 And pole5=pole6 Then
'And pole7=pole8 

Call doc1.ReplaceItemValue("IconOk", "82")
Call doc1.ReplaceItemValue("Ex_Status", "X")
Call doc1.save(True,True,True)

'Messagebox("Документ от "+ pole7 +" "+ pole6+" перемещено")
i=i+1
Else
i=i
End If


Set doc1 = dc1.GetNextDocument (doc1)					
Loop
Set doc = dc.GetNextDocument (doc) 
Loop

Call w.ViewRefresh
On Error Resume Next

Set UIdoc=w.CurrentDocument
On Error Goto 0

If Not UIdoc Is Nothing Then
If Not UIdoc.InPreviewPane Then Call UIdoc.Close
End If

If i = 0 Then
Print "Документов обработано 0"	
Else
Print "Документов обработано " i+""
End If

End Sub

Затык в том что если выделить 20 документов из которых 5 являются дублями то есть
1-3 - дубль
4-8-9 - дуль
и всего пять таких пар,
то скрипт обрабатывает только 1 пару, а остальные не обрабатывает.

Как это победить, уже голову поломал.
Кому не сложно гляньте код, может есть где-то заткавыка?
 
O

Ogion7

Не знаю в чем закавыка, но проверять на то, чтобы не работать с одним и тем же доком надо сравнивая UNID-ы документов, а не дату создания.
 
Мы в соцсетях:

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