Курсор-Адаптер & индексация

Людмila
Дата: 05.01.2013 07:17:29
Столкнулась с такой проблемой. Грид отображает данные Курсора-Адаптера. задумала производить его индексацию по клику заголовка грида. Т.е клик по заголовку выстраивает (индексирует) данные колонки.
Из описания узнала, что для буферизованной таблицы не поддерживаются команды: ALTER TABLE, INDEX и т.д.
(ИМХО - в событии header1.click
gVariable="Field2"
oCursor.SelectCmd="SELE Table1.* FROM Table1 ...... ORDER BY &gVariable"
oCursor.CursorFill
вот такой огород на бумаге нагородила - не нравиться )
Не могу сообразить как свою задумку поэлегантней осуществить? Может кто подскажет?
ВладимирМ
Дата: 05.01.2013 16:46:02
Индексировать можно, если курсор находится в строковом режиме буферизации (3). Запрет касается только табличного режима буферизации (5). Как следствие, перед индексацией надо перевести курсор в строковый режим, выполнить индексацию и вернуть в табличный режим.

select MyCursor
CursorSetProp('Buffering',3,'MyCursor')
index on ... tag ...
CursorSetProp('Buffering',5,'MyCursor')

Только следует иметь в виду, что переключение режима буферизации автоматически сбрасывает буфер. Поэтому, если Ваш курсор предназначен для редактирования, то лучше проиндексировать все столбцы сразу в момент открытия формы, а при клике на заголовок только переключаться между индексами по Set Order. Если же курсор используется только на просмотр, то нет смысла устанавливать для него 5 режим буферизации.
Людмila
Дата: 06.01.2013 01:04:04
Спасибо!
Действительно относительно простого Курсора - предварительно создав нужные индексы
INDEX ON ... Tag TagName1
INDEX ON ... Tag TagName2 ADDITIVe
затем - CURSORSETPROP("Buffering",5)
в событии .Header1.Click -
SET ORDER TO TagName1
Grid.SetFocus
Всё работает!
Но пока не совсем представляю чтобы это всё заработало с Курсор-Адаптером (источник Native)?
Людмila
Дата: 06.01.2013 05:13:16
ответ ВладимираМ применим и для Курсор-Адаптера (протестила!)
в методе Init формы - пока стоит буферизация строк (3-по умолчанию)
INDEX on .... Tag Tg1
INDEX on .... Tag Tg2 ADDITIVE
.............
CURSORSETPROP("Buffering",5,"MyCursor") - переводим в буферизацию таблицы

и Всё работает!
Людмila
Дата: 09.01.2013 00:51:17
Стоит добавить, что после обновления Курсора-Адаптера (в моём случае это с периодичностью в 20сек) через .CursorFill() индексы исчезают :(
приходится буфер переводить на 3 > прописывать Индексы > затем опять буфер в 5 > ну и все настройки Грида по-новой указывать (они тоже слетают все!). Для обывателя это конечно будет незаметно (опция тестовая) всё происходит практически незаметно хотя и ресурсозатратно.
Может кто знает метод обновления КАдаптера без потери вышеперечисленных настроек?
tanglir
Дата: 09.01.2013 04:59:39
Людмila, скорее всего, не поможет, но вдруг? Попробуйте cursorrefresh()
ВладимирМ
Дата: 09.01.2013 14:05:28
Людмila
Стоит добавить, что после обновления Курсора-Адаптера (в моём случае это с периодичностью в 20сек) через .CursorFill() индексы исчезают :(
приходится буфер переводить на 3 > прописывать Индексы > затем опять буфер в 5 > ну и все настройки Грида по-новой указывать (они тоже слетают все!). Для обывателя это конечно будет незаметно (опция тестовая) всё происходит практически незаметно хотя и ресурсозатратно.
Может кто знает метод обновления КАдаптера без потери вышеперечисленных настроек?

Физически, CursorFill() удаляет ранее существовавший курсор и связанные с ними индексы и создает курсор заново. Удаление источника данных Grid автоматически "сносит" все настрйки Grid. На практике, делать подобную операцию нет необходимости. Вполне достаточно выполнить CursorRefresh().

Кроме того, "дергать" курсор по таймеру (раз в 20 секунд) вообще бессмысленно!

Представьте себе ситуацию. Пользователь вводит некие данные и тут по таймеру происходит обновление и все то, что он вводил, куда-то пропадает. Или пользователь просматривает данные прокручивая список вниз. Вдруг опять по таймеру происходит обновление и указатель записей улетает в начало. Это крайне раздражающее поведение списка с точки зрения пользователя. С таким списком работать крайне сложно.

Если очень уж хочется, то сделайте отдельную кнопку "Обновить". Вот пусть сам пользователь и обновляет данные по мере необходимости. В этой же кнопке и добавьте переиндексацию, если индексы слетели.

Чтобы настройки Grid не слетали, необходимо перед данной операцией обнулить свойство RecordSource, а после пересоздания курсора восстановить

ThisForm.Grid.RecordSource = ''
ca.CursorFill()
ThisForm.Grid.RecordSource = ca.Alias
ThisForm.Grid.Column1.ControlSource = ...
ThisForm.Grid.Column2.ControlSource = ...
ThisForm.Grid.Column3.ControlSource = ...
Людмila
Дата: 09.01.2013 20:31:59
Коллеги спасибо! действительно CursorRefresh() и только он!
ВСЕ настройки остаются целыми и всё обновляется!

Данное обновление мне критически нужно. Из-за него пришлось и знакомиться с КусорАдаптером. Интервал будет варьироваться от кол-ва подключенных к проге пользователей (только что придумала!) и/или увеличим интервал + кнопка-обновить (отдельное СП ВладимируМ).
В моём случае (пока на бумаге):
- сетка по умочанию ReadOnly=.T. - вот тогда таймер и крутится, запуская СursorRefresh();
- ну а переход в Grid1.ReadOnly=.F. - останавливает таймер.
- в режим редактирование/просмотр переходим по клику на соответстенную кнопку или кнопку Save - (сохраняя всю измененную в сетке информация и Grid1.ReadOnly=.T.) - таймер запустился!

Ну и конечно буду работать чтобы при обновлении сетки никаких побочных действий (перескакивание на другую запись и прочего) для пользователя не происходило.
Людмila
Дата: 02.02.2013 11:24:22
Сделала всё что задумала. Неделю ушло на тестирование и незначительные доработки.
Обновление грида с периодичностью 30 сек. происходит практически незаметно, настройки и идексы не слетают!
Спасибо за помощь!
Двигаюсь дальше.
VIVA_CA
Дата: 11.02.2013 10:32:19
Уважаемая Людмила! Меня очень заинтересовала Ваша тема. Может найдете время по подробнее на условном примере
расписать, что у Вас получилочь.