ViewNavigator не удается вернуться назад к категории
Я получаю интересную ошибку в некотором коде, который почти идентичен (по крайней мере, по структуре) к коду, который я работал, в другом месте. Я получаю сообщение об ошибке "Примечания: запись не найдена в индексе", и это происходит в строке моего ViewNavigator.getNext(ViewEntry) в цикле while. Я чувствую, что упускаю что-то очевидное в этом, так что, надеюсь, кто-то может заметить это (я становлюсь бестолковым от того, чтобы просто смотреть на это)
[Обновление] Примечание Джесси о настройке autoUpdate в false сделало свое дело. Похоже, это связано с этой технической запиской 2002 года, поскольку мой цикл сохраняет в другой цикл документ (та же БД, другое представление). Мне удалось разместить vw.setAutoUpdate(false);
сразу после того, как я определил свою ручку в представлении.
[/Обновить]
Я иду по представлению одной категории (по значению ссылочного поля из каждого документа в представлении), чтобы обобщить некоторую информацию из сгруппированных документов. После включения отладки я обнаружил, что ошибка возникает при моем обходе из последнего документа (ViewEntry of Doc) в первой категории обратно в категорию (ViewEntry).
Вот урезанная версия моего кода (//... для ясности обозначает удаленные строки):
View vw = db.getView("<ViewName>");
ViewNavigator nav = vw.createViewNav();
ViewEntry first = nav.getFirst();
String unid = "";
while(first != null){
if(first.isCategory()){
if(!unid.isEmpty()){
//summarize the info and save it back to the category-relevant doc
Document myDoc = db.getDocumentByUNID(unid);
//doing my thing
boolean success = myDoc.save(true, false);
myDoc.recycle();
}
unid = "";
}
if(first.isDocument()){
Vector<?> colVals = first.getColumnValues();
if(unid.isEmpty()){
//reset temp aggregation vars back to initial value (e.g.- 0)
//...
unid = (String) colVals.get(5); // the value of the category-relevant UNID
}else{
//doing the aggregation of summary values with the temp vars established before and handled after
//...
//perform aggregation from colVals with temp vars
}
session.recycle(colVals);
}
ViewEntry tmp = nav.getNext(first); //this is the line that fails!! only if it's the next category, which there is one
first.recycle();
first = tmp;
}
1 ответ
Установка view.setAutoUpdate(false) должна очистить его, вероятно, из-за документа, сохраненного в нем.
Я считаю, что это хорошая политика - устанавливать это все время после получения представления (я считаю, что ODA делает это автоматически в режиме Кхана). Затем он также позволяет вам установить nav.setBufferMaxEntries(400), что улучшает длительную навигацию просмотра.