Несоответствие Значений Полей Документа При Просмотре В Debug С Реальн

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

  1. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Привет всем. Похожую тему найти не получилось. Ни у кого не возникала такая ситуация?
    У меня в приложении документ проходит несколько этапов. Этап первый - "Согласование", здесь у документа статус "1", потом еще какие-то. Через 2 этапа начинается этап "Прием оборудования", у документа ставится статус "4", в документе ставится один признак SystemMarks = True. По этому признаку эти документы отбираются в представление. Затем их должен обрабатывать агент и сохранять.
    Так вот, я ручками прогоняю документ от статуса "1", до статуса "4", затем ручками запускаю этот агент, смотрю обработку этого документа в дебаггере. И в дебаггере поле "Статус" у этого документа показывает значение "1". Смотрю свойства документа в представлении - там поле статус имеет значение "4". Смотрю обработку этого документа в дебаггере - там опять статус "1". Причем этот неверный статус документ имеет в самом начале работы агента, до этого он нигде поменяться не мог! Может где-то в свойствах какого-то элемента дизайна есть хитрый флажок, который к этому приводит?

    Привожу код.
    Агент

    Option Public
    Option Declare


    Sub Initialize

    Dim session As New NotesSession
    Dim dfs As New DFSession
    If dfs.DisableServerAgents Then Exit Sub

    LOMakeRequests
    End Sub

    Метод LOMakeRequests

    Sub LOMakeRequests
    'Создает Запросы
    Print "Начало обработки"
    On Error Resume Next

    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.CurrentDatabase
    If db Is Nothing Then Exit Sub
    Dim view As NotesView

    ' Обращение к представлению, в которое документ отбирается по признаку SystemMarks = True

    Set view = db.GetView("RequestsForEquipmentMakeRequests")
    If view Is Nothing Then Exit Sub


    '1. Берет все документ во вью "RequestsForEquipmentMakeRequests"
    '2. По каждому документу (Заявка на оборудование) - создает Запросы

    Dim collEntriesRE As NotesViewEntryCollection
    Set collEntriesRE = view.AllEntries
    If collEntriesRE Is Nothing Then Print "Нет документов для обработки... " : GoTo ExitSub
    If collEntriesRE.Count = 0 Then Print "Нет документов для обработки... " : GoTo ExitSub

    Dim docEntryRE As NotesViewEntry
    Set docEntryRE = collEntriesRE.GetFirstEntry
    Dim docRE As NotesDocument

    Dim nProcessedDocs As Integer
    nProcessedDocs = 0
    While Not docEntryRE Is Nothing

    ' Обращение к этому документу, у которого статус "4" при просмотре его свойств в представлении, а в дебаггере значение поля Статус показано "1".

    Set docRE = docEntryRE.Document
    ' Здесь смотрю значение поля "Статус" у docRE. И оно не соответствует его реальному значению в представлениях. И все кувырком с этого места.

    ' ------------------------Дальнейшая обработка документа

    ' Переходим к следующему entry
    nProcessedDocs = nProcessedDocs + 1
    NextDocEntry:
    Set docEntryRE = collEntriesRE.GetNextEntry(docEntryRE)
    Wend

    ExitSub:
    Print "Обработано документов: " & nProcessedDocs
    Print "Конец обработки"
    End Sub

    Заранее спасибо
     
  2. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Например вычисление при открытии документа (формула поля или другой код).
     
  3. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    1 А это точно один и тот-же док? Хорошо бы юниды сравнить.
    2 Не забываем view.Refresh и view.AutoUpdate = False
    3 А зачем работать с энтрисами, если инфа берется из дока, а не из вида? Как я понял, в виде доки уже отобраны по статусу и отсортированы (раз берутся все энтрисы, а не по ключу).
    Мне кажется лучше тогда сразу Set doc = view.GetFirstDocument и тд.
     
  4. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Например вычисление при открытии документа (формула поля или другой код).

    Нет, документ не открываю. Просто левой кнопкой мыши смотрю значения полей.

    1 А это точно один и тот-же док? Хорошо бы юниды сравнить.

    Сравнил - один и тот же ((

    2 Не забываем view.Refresh и view.AutoUpdate = False

    Попробую

    3 А зачем работать с энтрисами, если инфа берется из дока, а не из вида?

    Так повелось, у нас считают, что так быстрее
     
  5. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    view.Refresh и view.AutoUpdate = False - не получилось ((
     
  6. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Быстрее, если брать инфу из колонки вида по энтрису, а через notesViewEntry.Document - не быстрее.
    view.GetFirstDocument - код короче.
     
  7. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Anonimous
    Дай побольше информации: сделай пустую базу, положи туда вид "RequestsForEquipmentMakeRequests", один геморройный документ, агента на кнопку и выложи здесь.
    Кста, стремная длина названия вида - 32 символа (вроде как предел для нотусов).
    Чудес не бывает, так ведь.
     
  8. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Я подписал библиотеку, в которой метод LOMakeRequests, учеткой админа (до этого был только агент подписан), сделал кнопку, которая выполняет этот агент на сервере, и ошибок с состоянием документа не возникает, только вот в Debug-ре не отладить.
    Я попытаюсь выбрать из базы главное, чтоб выложить, там просто элементы дизайна очень громоздкие
     
  9. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    Хуки могут влиять (на клиенте или на сервере)....
     
  10. Anonimous

    Anonimous Well-Known Member

    Регистрация:
    15 июн 2012
    Сообщения:
    120
    Симпатии:
    0
    Я переношу глючные документы и агент в пустую базу, но в ней ошибка не воспроизводится...
    И на рабочей она то возникает, но исчезает...
    Хуки могут влиять (на клиенте или на сервере)....
    А можно поподробнее, пожалуйста :(
     
  11. alexas

    alexas Well-Known Member

    Регистрация:
    10 июн 2009
    Сообщения:
    215
    Симпатии:
    0
    Тут мысли разные пролетели...
    В пустой базе (только глючные? доки) и в боевой - существенно разное кол-во доков, соответсвенно разная нагрузка на сервер. Предположение: сервер что-то не успевает сделать до получения коллекции (хотя индексы в нужном виде он успевает перестроить, ведь в вид попадают нужные доки).
    Отсюда, попробовать изменить способ получения инфы, опираясь только на вид:
    вы берете док по docEntryRE.Document - хрен знает, как это нотус делает, поробуйте получить инфу по энтри (в виде - "правильные доки", отобранные по статусу до получения коллекции):
    сделайте в "RequestsForEquipmentMakeRequests" колонку, положите в нее "статус" и возьмите по Entry (Статус = docEntryRE.ColumnValues(n), n-номер колонки).
    Опять-же код короче и способ быстрее, а изменения в коде минимальны.
     
Загрузка...

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