Нужен Агент

Тема в разделе "Lotus - Программирование", создана пользователем dimat, 11 ноя 2008.

Наш партнер Genesis Hackspace
  1. dimat

    dimat Well-Known Member
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Нужен Агент, который пробегает по всем документам в указанном представлении и считывает или устанавливает значение у поля
     
  2. allex

    allex Гость

    Код (Text):
    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim doc As NotesDocument
    Set db = session.CurrentDatabase
    Set view = db.GetView("By Category")
    Set doc = view.GetFirstDocument
    While Not(doc Is Nothing)


    a = doc.GetItemValue( "val" )
    Call doc.ReplaceItemValue( "new_val", a )
    Call doc.Save( False, True )


    Set doc = view.GetNextDocument(doc)
    Wend
    End Sub
     
  3. dimat

    dimat Well-Known Member
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Немножко изменил агента. вот код:


    Код (Text):
    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim view2 As NotesView
    Dim st As String
    Dim doc As NotesDocument
    Dim doc2 As NotesDocument

    Set db = session.CurrentDatabase
    Set view = db.GetView("Текущие клиенты")
    Set view2 = db2.GetView("Физические лица")
    Set doc = view.GetFirstDocument
    st="клиент"

    While Not(doc Is Nothing)
    Set doc2 = view2.GetFirstDocument
    While Not(doc2 Is Nothing)
    If doc2.GetItemValue("PersonalWorkPlace")   = doc1.GetItemValue("AgentShortName") Then
    Call doc2.ReplaceItemValue("klient_type",st)
    Call doc2.Save(False, True)
    End If
    Set doc2 = view2.GetNextDocument(doc2)
    Wend
    Set doc = view.GetNextDocument(doc)
    Wend
    End Sub
    При выполнении выдает вот такую оошибку "Variant does not contain an object".
    на этой строчке
    Код (Text):
    If doc2.GetItemValue("PersonalWorkPlace")   = doc1.GetItemValue("AgentShortName") Then
     
  4. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    советую так

    if InStr( doc2.GetItemValue("PersonalWorkPlace")(0), doc1.GetItemValue("AgentShortName")(0) ) > 0 then ...
     
  5. dimat

    dimat Well-Known Member
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Такая же ошибка...
     
  6. Alexander (Criz)

    Alexander (Criz) Гость

    А есть ли в документах эти поля? Проверку можно на doc.HasItem("FieldName") делать.
     
  7. morpheus

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

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    тьфу , блин заменить
    doc1 на doc просто

    откуда взялсо док1 вообще не понятно, вот что значить не польозваться декларе оптионс
     
  8. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member
    Lotus team

    Регистрация:
    30 май 2006
    Сообщения:
    1.298
    Симпатии:
    1
    SELECT @All;
    FIELD MeFld:=myValue
     
  9. dimat

    dimat Well-Known Member
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Код (Text):
    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim view As NotesView
    Dim view2 As NotesView
    Dim st As String
    Dim pn As String
    Dim sn As String
    Dim doc As NotesDocument
    Dim doc2 As NotesDocument

    Set db = session.CurrentDatabase
    Set view = db.GetView("Текущие клиенты")
    Set view2 = db.GetView("Физические лица")
    Set doc = view.GetFirstDocument
    st="клиент"

    While Not(doc Is Nothing)
    Set view2 = db.GetView("Физические лица")
    Set doc2 = view2.GetFirstDocument
    While Not(doc2 Is Nothing)
    If Instr( doc2.GetItemValue("PersonalWorkPlace")(0), doc.GetItemValue("AgentShortName")(0) ) > 0 Then
    Call doc2.ReplaceItemValue("klient_type",st)

    Call doc2.Save(False, True)
    End If
    Set doc2 = view2.GetNextDocument(doc2)
    Wend
    Set doc = view.GetNextDocument(doc)
    Wend
    End Sub
    Возможно ли его как то оптимизировать или выполнить это же задачу иным образом?
     
  10. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Оптимизировать можно взяв документы из представления "Физические лица" в коллекцию(NotesDocumentCollection или NotesViewEntryCollection) и при каждом проходе удалять из неё обработанные документы.
    Set view2 = db.GetView("Физические лица") - это вынести из цикла.
    Поставить view.AutoUpdate = False и view2.AutoUpdate = False.

    А можно сделать массив значений "AgentShortName". Обход массива будет побыстрее обхода представления.
     
  11. shoma2005

    shoma2005 Гость

    Всем привет!
    Помогите разобраться с проблемкой….
    Агент не шлет уведомление когда в значении «кому» указан не адресат, а имя поля, откуда нада его брать.

    Создал агента, который запускается каждые 5 минут и
    1. Проверяет базу на наличие новых подписанных заявок (по значению полей statusrec –подписан ли документ и checkdocstat – не проработал ли агент этот документ ранее)
    2. Если оба условия соблюдены, то агент отправляет указанному адресату уведомление и ссылку на эту заявку и меняет статус поля checkdocstat на ”1” – то есть просмотрен.

    Вот формула:

    @If(statusrec="1" & checkdocstat="0"; @MailSend("ADM Assistant/company"; ""; ""; "Подписи к данной заявке собраны"; "Запрос на создание счета к новой заявке."; "economist"; [IncludeDoclink]) & FIELD checkdocstat:="1"; "");
    SELECT @All

    В таком виде работает, но хочется чтобы агент брал адресата из поля!
    В базе есть документ настроек, в нем поле формата «Names» - вот хочу чтобы агент брал адресата из этого поля!

    Вписываю вместо адресата имя поля:

    @If(statusrec="1" & checkdocstat="0"; @MailSend(economist; ""; ""; "Подписи к данной заявке собраны"; "Запрос на создание счета к новой заявке."; "economist"; [IncludeDoclink]) & FIELD checkdocstat:="1"; "");
    SELECT @All

    Сохраняю….. сервак не ругается, типа формула верна, но ….. не работает!!!
    ЧЁ делать…. ???
     
  12. abbatik

    abbatik Well-Known Member
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Ну, во-первых, странная у тебя структура.
    Почему нельзя делать эту проверку и отсылать письмо в postsave?

    Ну, а если хочешь так, то попробуй @Text ( economist ), хотя было бы не плохо посмотреть какое значение в нем лежит.
     
  13. nshoma

    nshoma Гость

    Внес изменения по вашему совету - тишина, не срабатывает! (хотя формула верна, не ругается)
    Когда вставляю эту формулу в postsave или queryclose, то говорит "No 'SendTo' field in document. Use 'Forward' on the actions menu instead."
    По всей видимости он ищет указанное поле именно в документе заявки а не по всей базе.

    Что касается формы отображения адресата в поле, из которого его следует брать, - так и отображается "ADM Assistant/company".
    как сделать так чтоб он брал поле из нужного документа???
     
  14. Medevic

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

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    @DbLookUp, @GetDocField.
     
  15. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    618
    Симпатии:
    5
    как вариант оптимизации таких ситуаций
    после
    Код (Text):
    Set view = db.GetView("By Category")
    использовать
    Код (Text):
    If view.EntryCount > 0 Then Call view.AllEntries.StampAll("itemName",value)
    а остальное лишнее
     
  16. nshoma

    nshoma Гость


    А как правильно формулу написать с использованием этих функций?
    Я не совсем программист, просто пришлось разобраться с этой задачкой!
    Заранее спасибо.
     
  17. abbatik

    abbatik Well-Known Member
    Lotus team

    Регистрация:
    20 окт 2008
    Сообщения:
    277
    Симпатии:
    0
    Как-то так:

    @If(statusrec="1" & checkdocstat="0"; @MailSend( @GetDocField( <Сюда надо вставить UNID профайл-документа> ; economist ); ""; ""; "Подписи к данной заявке собраны"; "Запрос на создание счета к новой заявке."; "economist"; [IncludeDoclink]) & @SetField( "fcheckdocstat";"1" ); "");
    SELECT @All

    Хотя, лично я не люблю использовать собаки для таких вещей.
    Собаки хороши для небольших операций в кнопках, которые не надо отлаживать...
     
Загрузка...

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