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

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

  1. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    День добрый.

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

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    На API можно.

    Посмотрел по сусекам, есть кусочек, который пересоздаёт с нуля индекс view:
    Код (LotusScript):
    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 - указатель на базу:
    Код (LotusScript):
    Call OSPathNetConstruct(Nothing, Db.Server, Db.FilePath, dbPathBuffer)
    Call NSFDbOpen(dbPathBuffer, Dbhandle)
    Если очень надо, могу и декларации констант скинуть.
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Если не ошибаюсь, то совместное их использование ребьюлдит одну указанную вьюшку.

    А может папку?
     
  4. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Вроде так должно быть: Load updall databasepath -T viewtitle -R
     
  5. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    О! работает... н-да не догадался -R в конец поставить ...
    Спасибо!

    Добавлено:
    В принципе интересно, правда с АПИ при кросплотформенности - есть нюансы...
    Спасибо.
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    всегда делал с -R -T
    как OKEN и указала
    последовательности не помню, мне кажется , что <dbname> -R -T <viewName> тоже работает
     
  7. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    О! Недавно таку задачку решал.

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

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    это-то понятно... просто хотелось решить задачу без "дерганья дизайна" :p

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

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

    valmont Well-Known Member

    Регистрация:
    27 дек 2004
    Сообщения:
    63
    Симпатии:
    0
    а агентом ночным править select у вьюшки и вписывать в него today уже не кошерно?
     
  10. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    нет не кошерно. как Вы ее будите с дизайна обновлять?
    тут возникают множество нюансов неприятных при сопровождении большой системы распределенной по серверам, где с одного шаблона могут быть созданы несколько баз. Предложенный метод позволяет обновить дизайн базы(вьшки) в любой момент не заботясь о том что формула отбора "поплывет".

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

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    а чо не папка? :)
     
  12. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    А че этот вопрос задал не Medevic? o_O
     
  13. ToxaRat

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

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    DuChan
    так что же плохого в поиске + папке?

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

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Как не задал? Вон в самом начале спросил. :)
     
  15. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    вообще-то вкратце уже объяснял, но попробую более подробно....

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

    по single categories: ограниченная облость использования - только одна дата - конкретная категория, т.е. логическое =, а если мне необходимо выбрать все даты больше или меньше - уже не применимо. Плюс ко всему встроенная вьюшка накладывает ограничения на функционал представления (нет полнотекстового поиска, сортированных колонок и т.д и т.п.)...
     
  16. Constantin A Chervonenko

    Constantin A Chervonenko Well-Known Member

    Регистрация:
    30 май 2006
    Сообщения:
    1.288
    Симпатии:
    0
    А вот и нет.
    Там не = а скорее @Begins. Но много-ли на этом побочном эффекте можно замутить? :newconfus:

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

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.081
    Симпатии:
    300
    может тогда на аплет (здесь ещё над реализацией открытия дока помудровать) переделать, с кэшируемой (раз в сутки) коллекцией по DbSearch (ну или отбор по NotesDataRange) ?!
    визуализацию сделать на "виртуальном" списке
     
  18. duchan

    duchan Well-Known Member

    Регистрация:
    20 сен 2006
    Сообщения:
    106
    Симпатии:
    3
    @Begins - я в курсе... :) но сути это не меняет, если необходимо > или <

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

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