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

Тема в разделе "Lotus - Программирование", создана пользователем LIGHT, 26 фев 2007.

  1. LIGHT

    LIGHT Гость

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

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

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

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

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

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

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

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

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    так в чем собственно состоит вапрос?
     
  3. LIGHT

    LIGHT Гость

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

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

    Код (Text):
    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
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--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)
     
  5. LIGHT

    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 или вариантов много
     
  6. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    гм...
    цикл в цикле...
    грубо говоря :


    Код (Text):
      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
     
  7. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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. А дальше - дело техники. :)
     
  8. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Для: vvlad
    Set для Doc1 не забудте

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
    А можно на собаке сделать. Тогда вообще будет быстро.
     
  10. vvlad

    vvlad Well-Known Member

    Регистрация:
    19 янв 2007
    Сообщения:
    63
    Симпатии:
    0
    <!--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а покрасивше будет :)
    Я бы именно его реализовывал...
     
  11. SOFTOBZOR.ru

    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: в этой вьюхе.
     
  12. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Для: SOFTOBZOR.ru
    Не вижу затыка. Мы же будем использовать эту вьюху только для проверки документов. Она вообще будет скрытая. А какие документы мы будем проверять и как их отберем не имеет значения.

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

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

    LIGHT Гость

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

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

    Код (Text):
    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
    Появляется ошибка:

    Код (Text):
    ---------------------------
    Lotus Notes
    ---------------------------
    Document is not from this collection
    ---------------------------
    ОК  
    ---------------------------
     
  14. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    <!--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]
     
  15. LIGHT

    LIGHT Гость

    Ой :) точно.

    Ну теперь добралиь до самого интересногоа именно центра данного кода
    Код (Text):
        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")
     
  16. Ogion7

    Ogion7 Гость

    Код (Text):
    dApole=doc.Apole(0)
     
  17. LIGHT

    LIGHT Гость

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

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

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

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

    Print "ОК"

    End if
    End if
     
  18. LIGHT

    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]

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

    Код (Text):
    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
     
  19. LIGHT

    LIGHT Гость

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

    Код (Text):
    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 пару, а остальные не обрабатывает.

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

    Ogion7 Гость

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

Поделиться этой страницей