Обновление поля

Тема в разделе "Lotus - Программирование", создана пользователем oleg7, 19 июл 2011.

Статус темы:
Закрыта.
  1. oleg7

    oleg7 Гость

    Помогите, пожалуйста
    Есть база в нее берутся данные из Словаря
    Можно ли агентом вручную (только выделенные документы) обновить данные из Словаря.
    Например в словаре была запись "тест1", а ее в словаре переименовали в "тест_1" , так вот можно как-то автоматически подтянуть изменения?
     
  2. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Можно, если имеется однозначный способ определить соответствие словаря "тест_1" и документа, использующего "тест1"
     
  3. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.046
    Симпатии:
    18
    для этого нужно использовать не сами значения а их синонимы
     
  4. oleg7

    oleg7 Гость

    ToxaRat
    если правильно понимаю, то имеется в виду поле Alias, но оно не заполнялось :)
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    oleg7 ,
    неправильно понял, либо углубляешься в технические детали, которые нам неизвестны, и врядли мы сможем оценить верность твоего предположения, исходя из имеющихся у нас данных.

    Если тебе надо обновить значение в документах, которое тянется из справочника, то необходимо как-то найти документы, которые использовали старое значение.
    Для этого надо либо знать старое значение, либо использовать и сохранять в документах некое другое значение - ключ, которое поможет найти документы, которые используют старое справочное значение. Этот ключ и будет синонимом.
    Если синонимы не использовались, необходимо знать старое значение, найти все документы с таким значением в нужном поле, и заменить актуальным значением из справочника.

    Это что, какой-то БР? :)
     
  6. oleg7

    oleg7 Гость

    решил, раз так не знаю как правильно делать... пойти другим путем и тоже ступор
    Есть база, в которой заполняются данные (Словарь) , есть база в которой эти поля выбираются. Хочу написать агент, который в виде будет редактировать документы и сразу (например выделено 10 документов) будет менять определенное поле (Например Pole_Test) , т.е. мне не надо будет открывать каждый документ, а можно будет менять поле, если данные одинаковые (например по ним осортированы по этим данным)

    Код (Text):
    myServer:=@Subset(@DbName;1);
    myDb:= "DB.nsf";
    myView := "TESTVIEW";
    @Set("myField";"Pole_Test");
    mySelection:=@PickList( [Custom] : [Single];myServer :myDb;myView;"";"";1);
    @SetField(myField;mySelection);
    SELECT @All
    Данные добавляются, но вот PickList появляется ровно столько раз, сколько документов выделено в представлении. Как можно обновить нужное мне поле в нескольких документов, но только 1 раз выбрать данные в PickList?
     
  7. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Напиши LotusScript-агент.
     
  8. ABarmin

    ABarmin Гость

    Если есть поле, которое поддерживает уникальность взятого из словаря значения или хотябы предыдущая версия, чтобы знать что на что менялось, тогда можно сравнивать и менять.
     
  9. oleg7

    oleg7 Гость

    делаю так
    Код (Text):
        Dim ws As New NotesUIWorkspace, DB As NotesDatabase, ODB As NotesDatabase
    Dim session As New NotesSession
    Set DB = session.CurrentDatabase   
    Set ODB = session.GetDatabase ( DB.Server, "baza.nsf" )
    Dim DocCol As NotesDocumentCollection
    Dim RezCol As NotesDocumentCollection
    Dim Doc As NotesDocument

    Set DocCol = DB.UnprocessedDocuments
    Set Doc = DocCol.GetFirstDocument
    Set RezCol= ws.PickListCollection( 1 ,False, ODB.Server, ODB.FilePath,"TESTView", "1","1","")
    If RezCol.Count = 0 Then Exit Sub
    While Not(Doc Is Nothing)
    Set Doc=DocCol.GetFirstDocument
    Doc.PoleTest= RezCol                             ' выдает ошибку Type mismatch
    Doc.Save True, False
    Set Doc= DocCol.GetNextDocument(Doc)
    Wend
    Как мне в PoleTest подставить то, что я получаю в RezCol?
     
  10. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    oleg7

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

    if rezcol.count > 0 then
    set doccol = rezcol.getfirstdocument
    while not doccol is nothing
    doc.poletest = doccol.НАЗВАНИЕ_ПОЛЯ_ИЗ_КОТОРОГО_НУЖНО_ВЗЯТЬ_ЗНАЧ.
    или
    call doc.replaceitemvalue("poletest", doccol.getitemvalue("xxx")(0))

    set doccol = rezcol.getnextdocument(doccol)
    whend

    end if
     
  11. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Cleric-Lviv ,
    де теги кода?

    oleg7 ,
    почему ошибка, описано в посте Клерика.
    Я же покритиковать код хочу ))

    Код (LotusScript):
    ' описание переменных
    ' описывать переменные очень желательно по одной в каждой строке
    ' размещать переменные тоже желательно как-то логично сгрупировав, например, объекты классом NotesUIWorkspace и NotesSession обычно описывают в самом начале
    ' позже объекты БД, колекций, документов, т.е. по некоторой иерархии

    Dim ws As New NotesUIWorkspace
    Dim session As New NotesSession
    Dim DB As NotesDatabase
    Dim ODB As NotesDatabase
    Dim RezCol As NotesDocumentCollection
    Dim DocCol As NotesDocumentCollection
    Dim RezDoc As NotesDocument
    Dim Doc As NotesDocument

    Set DB = session.CurrentDatabase   
    Set ODB = session.GetDatabase ( DB.Server, "baza.nsf" )

    ' код тоже должен быть отдельными логическими блоками, а не смешан между собой

    Set DocCol = DB.UnprocessedDocuments

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

    If DocCol.Count > 0 Then

    ' сначала необходимо получить документ справочника

    Set RezCol= ws.PickListCollection(3, False, ODB.Server, ODB.FilePath, "TESTView", "1", "1") ' согласно справке, первый параметр должен быть 3 (цифра три)
    If RezCol.Count > 0 Then
    Set RezDoc = RezCol.GetFirstDocument

    ' потом уже беремся за обработку

    Set Doc = DocCol.GetFirstDocument
    While Not(Doc Is Nothing)
    ' Set Doc=DocCol.GetFirstDocument ---- ЭТО что вообще такое было? вечный цикл? :)
    Call Doc.ReplaceItemValue("PoleTest", RezDoc.GetItemValue("имя поля, которое копируем"))
    Call Doc.Save(True, False)
    Set Doc = DocCol.GetNextDocument(Doc)
    Wend
    End If
    End If
     
  12. oleg7

    oleg7 Гость

    Все работает просто отлично
    Akupaka
    спасибо за объяснения!
    Cleric-Lviv
    спасибо за помощь!
     
  13. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Akupaka

    забил, писал на скорую руку :)


    oleg7

    всегда пожалуста)
     
  14. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Та оно и видно, что забил, а не забыл :)
     
  15. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    Akupaka

    ну не придирайся, а..... не вчив я російську і відповідно граматики не знаю!
     
  16. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Я знаю :) Жартую ;)
     
Загрузка...
Статус темы:
Закрыта.

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