Как сделать Rebuild вида в Back-end

duchan

Well-known member
20.09.2006
110
3
#1
День добрый.

Необходимо программно сделать Rebuild для вида. Refresh не подходит поскольку только обновляет, но не пересоздает индекс вида.
в UI есть notesUIWorkspace.ViewRebuild или Shift+F9, но как это сделать без UI, например в серверном агенте...

консольные команды "Load updall databasepath -T viewtitle" - тоже делает Refresh, но не Rebuild. C ключом -R пересоздает все вьюшки, а мне нужно одну.

впринципе подошло бы просто удалить индекс у вида, типа как в админе "Choose Database - Manage Views" "Click Purge", но как это сделать программно\консольно?
 

Omh

Lotus team
04.07.2007
2 210
1
#2
На API можно.

Посмотрел по сусекам, есть кусочек, который пересоздаёт с нуля индекс view:
Код:
Dim ViewID As Long
If NIFFindDesignNoteExt(DbHandle, ViewName, NOTE_CLASS_VIEW, DFLAGPAT, ViewID, 0) = NOERROR Then
If ViewID <> 0 Then
Dim hC As Long
Dim NULLHANDLE As Long
Dim retViewUNID As UNID
If NIFOpenCollection(DbHandle, DbHandle, ViewID, OPEN_REBUILD_INDEX, NULLHANDLE, hC, NULLHANDLE, retViewUNID, NULLHANDLE, NULLHANDLE) = NOERROR Then
Call NIFCloseCollection(hC)
rv = True
End If
End If
End If
DbHandle - указатель на базу:
Код:
Call OSPathNetConstruct(Nothing, Db.Server, Db.FilePath, dbPathBuffer)
Call NSFDbOpen(dbPathBuffer, Dbhandle)
Если очень надо, могу и декларации констант скинуть.
 

Medevic

Что это ? :)
Lotus team
10.12.2004
3 346
1
#3
консольные команды "Load updall databasepath -T viewtitle" - тоже делает Refresh, но не Rebuild. C ключом -R пересоздает все вьюшки, а мне нужно одну.
Если не ошибаюсь, то совместное их использование ребьюлдит одну указанную вьюшку.

А может папку?
 

hosm

* so what *
18.05.2009
2 442
6
#4
Вроде так должно быть: Load updall databasepath -T viewtitle -R
 

duchan

Well-known member
20.09.2006
110
3
#5
Вроде так должно быть: Load updall databasepath -T viewtitle -R
О! работает... н-да не догадался -R в конец поставить ...
Спасибо!

Добавлено:
На API можно.
...
Если очень надо, могу и декларации констант скинуть.
В принципе интересно, правда с АПИ при кросплотформенности - есть нюансы...
Спасибо.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 570
263
#6
всегда делал с -R -T
как OKEN и указала
последовательности не помню, мне кажется , что <dbname> -R -T <viewName> тоже работает
 
30.05.2006
1 345
11
#7
О! Недавно таку задачку решал.

Сделал тупо (зато без C API!): добавлением/удалением фейковой колонки во вьюшку
 

duchan

Well-known member
20.09.2006
110
3
#8
О! Недавно таку задачку решал.
Сделал тупо (зато без C API!): добавлением/удалением фейковой колонки во вьюшку
это-то понятно... просто хотелось решить задачу без "дерганья дизайна" :p

Опишу "от куда выросли ноги":
потребовалось во вьюшке использовать Today - задача не блогодарная, но переодически необходимая.
способы: поиск и папки, менять формулу отбора вида, single categories, тупо @Today - все эти способы либо требуют специальной обработки или имеют ограниченную область применения или грузять индексер "безтолку"...

Пришла идея - запихать агентом в серверный notes.ini переменную и использовать ее из вида. Проверил всё замечательно работает! но ложка дегтя: @environment во вьшке домино использует как "константу", т.е. раз прочитала, "закешировала" и далее использует её и при refresh'е вида. Что бы изменения из notes.ini вступили в силу необходимо пересоздать индекс вида. Ночной серверный агент всё это прекрасно сделает (главно что б у подписанта агента были права на консоль сервера - это что бы дать команду для пересоздания индекса вида - еще раз спасибо народу за помощь), а далее весь день "будет щастье" (а если использовать @Year(@ToTime(@Environment("TODAY"))) - то раз в год пересоздать индекс в начале года)
Чем мне понравился данный способ:
- дизайн вьшки не меняется, т.е. нормально можно наследовать\обновлять из шаблона;
- не тормозит при открытии, т.к. индекс не пересоздается при каждом обращении;
- легкость в тирожировании решения, переменная в notes.ini одна, во вьшках используется "стандартно" одинаковый @environment, не надо городить огород с папками\поисками\отслеживанием.
Минус только один (мною примеченный) - надо где-то хранить список этих видов, что бы программно после прописывания переменной окружения пересоздать индексы (можно конечно сделать глобальный updall -R, но это как-то жестоко по отношению к серверу, особенно если установленная система большая с большим кол-вом док-тов\видов).
 

valmont

Well-known member
27.12.2004
64
0
#9
а агентом ночным править select у вьюшки и вписывать в него today уже не кошерно?
 

duchan

Well-known member
20.09.2006
110
3
#10
а агентом ночным править select у вьюшки и вписывать в него today уже не кошерно?
нет не кошерно. как Вы ее будите с дизайна обновлять?
тут возникают множество нюансов неприятных при сопровождении большой системы распределенной по серверам, где с одного шаблона могут быть созданы несколько баз. Предложенный метод позволяет обновить дизайн базы(вьшки) в любой момент не заботясь о том что формула отбора "поплывет".

метод обновления формулы отбора извесетн мне, но как раз хотелось уйти от него. :)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#13
DuChan
способы: поиск и папки, менять формулу отбора вида, single categories, тупо @Today - все эти способы либо требуют специальной обработки или имеют ограниченную область применения или грузять индексер "безтолку"...
так что же плохого в поиске + папке?

еще как вариант сделать категоризацию по дате и внедренный вид с показом одной категории
 

duchan

Well-known member
20.09.2006
110
3
#15
вообще-то вкратце уже объяснял, но попробую более подробно....

По папкам+поиск: механизм для отображения результата выборки, но не для работы в приложении\виде, когда условия отбора в док-те для "Today" изменяются. т.е. это вариант открыл\посмотрел\закрыл... либо городить механизм добавления\удаления док-тов из папки "налету". Чувстуете сколько уже набирается, а это только "вершина айсберга"...
Как пример, существует приложение с предстовлением куда отбираются просроченные док-ты. Делопроизводитель открыл вид, и занимается "продлением" док-тов (открыл один, внес изменения, зарыл, перешел к следющему). в такой ситуации док-ты из папки не уйдут после исправления док-та, а только после переоткрытия папки(с поиском), либо в форме надо будет наварачивать механизм что при сохранении, проверять папку и удалять из нее док-т. Вариант другой (паралельный) - если есть графическое отображение док-тов с нарушеным сроком. Вариантов может быть огромное кол-во и все они требуют дополнительного программирования для обходя ситуации просто использования, в том или ином виде, Today, а когда приложение растет и таких ситуаций становится все больше и больше, всякие "навороты" для конкретных ситуаций преврашаются в костыли.... Поэтому для меня более простое решение является более правильным.

по single categories: ограниченная облость использования - только одна дата - конкретная категория, т.е. логическое =, а если мне необходимо выбрать все даты больше или меньше - уже не применимо. Плюс ко всему встроенная вьюшка накладывает ограничения на функционал представления (нет полнотекстового поиска, сортированных колонок и т.д и т.п.)...
 
30.05.2006
1 345
11
#16
по single categories: ограниченная облость использования - только одна дата - конкретная категория, т.е. логическое =
А вот и нет.
Там не = а скорее @Begins. Но много-ли на этом побочном эффекте можно замутить? :newconfus:

По существу вопроса:

IMHO лучше всего @TextToTime("Today").
Но на каждом региональном сервере нужен агент с правами консоли. Или с C API-вызовом (а это unrestricted). Или формально "дизайнящий" эту вьюшку. У меня, например, к региональным серверам ключей нет (такой политИИк).
Может, на первого (за день) юзера Rebuild взвалить?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 570
263
#17
может тогда на аплет (здесь ещё над реализацией открытия дока помудровать) переделать, с кэшируемой (раз в сутки) коллекцией по DbSearch (ну или отбор по NotesDataRange) ?!
визуализацию сделать на "виртуальном" списке
 

duchan

Well-known member
20.09.2006
110
3
#18
Там не = а скорее @Begins. Но много-ли на этом побочном эффекте можно замутить? :angry2:
@Begins - я в курсе... :) но сути это не меняет, если необходимо > или <

IMHO лучше всего @TextToTime("Today").
Но на каждом региональном сервере нужен агент с правами консоли. Или с C API-вызовом (а это unrestricted). Или формально "дизайнящий" эту вьюшку. У меня, например, к региональным серверам ключей нет (такой политИИк).
Может, на первого (за день) юзера Rebuild взвалить?
а разве с @TextToTime("Today") не возникнет проблем на локализированых серверах (для русского вроде нужно "Сегодня" писать(?))
Про дерганье индекса та жа проблема что и при @Environment - у меня реализовано прописываение в ini и пересоздание зависимых индексов в "системной базе", управляемой админом, и при необходимости подписываемой "нужным" ключом.
т.е. сделано как - в "системной базе" есть раздел 'переменные окружения сервера', где в форме есть поля название переменной, @формула, системная\пользовательская, зависимые виды (в АК есть похожий раздел, но более простой...). ночной агент проходит по записям, Evaluate "сабаки", сравнивает с уже прописанным в ini и если значение изменилось, прописывает новое, а затем "ищет" зависимые виды, и ребулдит их. т.е. если значение не менялось то и "дергать" вид не надо (например, YEAR - по идее только раз в год "дернуть" надо). Через такой механизм можно ведь не только @Today прописать, но ГОД, МЕСЯЦ, НОМЕР НЕДЕЛИ, КОД ОРГАНИЗАЦИИ\ПОДРАЗДЕЛЕНИЯ :), и т.д. и т.п....