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

Anonimous

Well-Known Member
15.06.2012
117
0
#1
Привет всем. Похожую тему найти не получилось. Ни у кого не возникала такая ситуация?
У меня в приложении документ проходит несколько этапов. Этап первый - "Согласование", здесь у документа статус "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

Заранее спасибо
 

Kizarek86

Well-Known Member
Lotus team
20.07.2007
861
6
#2
Например вычисление при открытии документа (формула поля или другой код).
 

alexas

Well-Known Member
10.06.2009
214
0
#3
...Так вот, я ручками прогоняю документ от статуса "1", до статуса "4", затем ручками запускаю этот агент, смотрю обработку этого документа в дебаггере. И в дебаггере поле "Статус" у этого документа показывает значение "1"....
1 А это точно один и тот-же док? Хорошо бы юниды сравнить.
2 Не забываем view.Refresh и view.AutoUpdate = False
3 А зачем работать с энтрисами, если инфа берется из дока, а не из вида? Как я понял, в виде доки уже отобраны по статусу и отсортированы (раз берутся все энтрисы, а не по ключу).
Мне кажется лучше тогда сразу Set doc = view.GetFirstDocument и тд.
 

Anonimous

Well-Known Member
15.06.2012
117
0
#4
Например вычисление при открытии документа (формула поля или другой код).

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

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

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

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

Попробую

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

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

alexas

Well-Known Member
10.06.2009
214
0
#7
Anonimous
Дай побольше информации: сделай пустую базу, положи туда вид "RequestsForEquipmentMakeRequests", один геморройный документ, агента на кнопку и выложи здесь.
Кста, стремная длина названия вида - 32 символа (вроде как предел для нотусов).
Чудес не бывает, так ведь.
 

Anonimous

Well-Known Member
15.06.2012
117
0
#8
Я подписал библиотеку, в которой метод LOMakeRequests, учеткой админа (до этого был только агент подписан), сделал кнопку, которая выполняет этот агент на сервере, и ошибок с состоянием документа не возникает, только вот в Debug-ре не отладить.
Я попытаюсь выбрать из базы главное, чтоб выложить, там просто элементы дизайна очень громоздкие
 

Мыш

Well-Known Member
Lotus team
12.02.2008
1 085
13
#9
Хуки могут влиять (на клиенте или на сервере)....
 

Anonimous

Well-Known Member
15.06.2012
117
0
#10
Я переношу глючные документы и агент в пустую базу, но в ней ошибка не воспроизводится...
И на рабочей она то возникает, но исчезает...
Хуки могут влиять (на клиенте или на сервере)....
А можно поподробнее, пожалуйста :(
 

alexas

Well-Known Member
10.06.2009
214
0
#11
Я переношу глючные документы и агент в пустую базу, но в ней ошибка не воспроизводится...
Тут мысли разные пролетели...
В пустой базе (только глючные? доки) и в боевой - существенно разное кол-во доков, соответсвенно разная нагрузка на сервер. Предположение: сервер что-то не успевает сделать до получения коллекции (хотя индексы в нужном виде он успевает перестроить, ведь в вид попадают нужные доки).
Отсюда, попробовать изменить способ получения инфы, опираясь только на вид:
вы берете док по docEntryRE.Document - хрен знает, как это нотус делает, поробуйте получить инфу по энтри (в виде - "правильные доки", отобранные по статусу до получения коллекции):
сделайте в "RequestsForEquipmentMakeRequests" колонку, положите в нее "статус" и возьмите по Entry (Статус = docEntryRE.ColumnValues(n), n-номер колонки).
Опять-же код короче и способ быстрее, а изменения в коде минимальны.