Форум программистов, компьютерный форум, киберфорум
HCL Notes: Программирование
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/156: Рейтинг темы: голосов - 156, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
1

Пишу агента
25.02.2007, 14:33. Показов 28247. Ответов 20
Метки нет (Все метки)

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

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

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

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

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

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

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

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2007, 14:33
1 / 1 / 0
Регистрация: 04.08.2006
Сообщений: 2,950
25.02.2007, 14:41 2
так в чем собственно состоит вапрос?
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
25.02.2007, 14:49 3
Вопрос в написание такого агента:

Вот мой кодик, он просто всю отмеченую коллекцию "перемещает" в другую вьюху, а мне нужно:
- что бы он взял 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 Nothyng
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 Nothyng Then
If Not UIdoc.InPreviewPane Then Call UIdoc.Close
End If
End Sub
0
1 / 1 / 0
Регистрация: 04.08.2006
Сообщений: 2,950
25.02.2007, 15:04 4
<!--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 Nothyng
добавить через IF проверку поля со следующим/предидущим документом
Call doc.ReplaceItemValue("Zpole", "1")
Set DOC = dc.GetNextDocument (DOC)
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
25.02.2007, 16:49 5
<!--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 или вариантов много
0
0 / 0 / 0
Регистрация: 14.01.2007
Сообщений: 60
25.02.2007, 16:59 6
гм...
цикл в цикле...
грубо говоря :



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

Do Until doc Is Nothyng
Do Until doc1 Is Nothyng

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

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

Loop
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
25.02.2007, 17:01 7
<!--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. А дальше - дело техники.
0
1 / 1 / 0
Регистрация: 04.08.2006
Сообщений: 2,950
25.02.2007, 17:01 8
Для: vvlad
Set для Doc1 не забудте

Set doc1 = dc.GetFirstDocument и вперёд, да кстати зделать проверку что бы Doc != Doc1 а то амого с сабой будете сравнивать
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
25.02.2007, 17:05 9
<!--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]
А можно на собаке сделать. Тогда вообще будет быстро.
0
0 / 0 / 0
Регистрация: 14.01.2007
Сообщений: 60
25.02.2007, 17:06 10
<!--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а покрасивше будет
Я бы именно его реализовывал...
0
0 / 0 / 0
Регистрация: 21.02.2006
Сообщений: 267
25.02.2007, 22:47 11
<!--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: в этой вьюхе.
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
25.02.2007, 23:06 12
Для: SOFTOBZOR.ru
Не вижу затыка. Мы же будем использовать эту вьюху только для проверки документов. Она вообще будет скрытая. А какие документы мы будем проверять и как их отберем не имеет значения.

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

Я понял, что ты имеешь в виду. Извиняюсь. Ушел спать. :ph34r:
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
26.02.2007, 10:00 13
Что-то не получается.

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


Код
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 Nothyng
Do Until doc1 Is Nothyng

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 Nothyng Then
If Not UIdoc.InPreviewPane Then Call UIdoc.Close
End If

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


Код
---------------------------
Lotus Notes
---------------------------
Document is not from thys collection
---------------------------
ОК
---------------------------
0
0 / 0 / 0
Регистрация: 04.12.2004
Сообщений: 3,329
26.02.2007, 10:20 14
<!--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]
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
26.02.2007, 10:32 15
Ой точно.

Ну теперь добралиь до самого интересногоа именно центра данного кода

Код
    Do Until doc Is Nothyng
Do Until doc1 Is Nothyng

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")
0
0 / 0 / 0
Регистрация: 12.10.2006
Сообщений: 185
26.02.2007, 10:40 16
Код
dApole=doc.Apole(0)
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
26.02.2007, 12:40 17
Спасибо получилось, только не понял как сдеалать двойную проверку

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
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
26.02.2007, 13:00 18
<!--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
0
0 / 0 / 0
Регистрация: 16.02.2007
Сообщений: 403
26.02.2007, 14:40 19
В общем получилась такая картина и даже работает, но как то кривовато.


Код
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 Nothyng                         Первый документ
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 Nothyng                            Следующий документ по циклу
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 Nothyng 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 пару, а остальные не обрабатывает.

Как это победить, уже голову поломал.
Кому не сложно гляньте код, может есть где-то заткавыка?
0
0 / 0 / 0
Регистрация: 12.10.2006
Сообщений: 185
26.02.2007, 15:05 20
Не знаю в чем закавыка, но проверять на то, чтобы не работать с одним и тем же доком надо сравнивая UNID-ы документов, а не дату создания.
0
26.02.2007, 15:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2007, 15:05
Помогаю со студенческими работами здесь

И снова View ...


Можно ли использовать в формуле выбора документов или где-то в другом месте значения колонки с...

Список серверов


День добрый. Команда @Prompt(;&quot;&quot;;&quot;&quot;); диалог для открытия базы. Я хочу получить только список...

Вопрос по Dialogbox

Проблема запуска Агента из агента!
Доброго времени суток! Ситуация такова запускю агента из другого агента, при запуске в строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru