Форум » Для флейма » Вопрос на засыпку по ADS » Ответить

Вопрос на засыпку по ADS

Haz: Как в курсоре ADS поймать логический номер записи если используется ORDER BY К примеру есть запрос вида : SELECT * FROM Table_1 ODRER BY Field_1 Полученный курсор выдаст отсортированную таблицу по полю Field_1 , физические номера записей ( RecNo() ) будут вперемешку, RowNum тоже не помогает т.к. Field_1 есть в полях вывода - SELECT * Это я пытаюсь вертикальный скроллер в TsBrowse вылечить , он понимает или Recno() или KeyNo() , т.к. индекс не всегда совпадает с выражением сортировки , а Recno() вперемешку - скроллер скачет вверх-вниз беспорядочно при навигации. В исходниках RDDADS не нашел к чему прицепиться. Если нужен самодостаточный - могу написать )

Ответов - 6

SergKis: В MySql можно задать SELECT a,b,c,count(*) from tabl1 order by c можкт в ADS похожее есть

Haz: SergKis пишет: SELECT a,b,c,count(*) Тогда курсор в ADS получается НЕ РЕДАКТИРУЕМЫЙ , не совсем удобно получается и Count() агрегатная функция , ADS ругается типа на остальные поля GROUP BY или HAVING сделай ( но главное это НЕ РЕДАКТИРУЕМЫЙ курсор ) Пока тупо отключаю скроллер чтоб не нервировал В идеале еслиб была функция в RDD возвращающая логический номер записи в курсоре.

SergKis: А через др. таблицу: INSERT INTO tbl_temp SELECT * FROM tab1 ORDER BY ...


Haz: SergKis пишет: А через др. таблицу так пойдет. т.к. Recno() совпадет с номером логической записи. Не красиво как то при каждой сортировке копировать в базу или массив , а потом кормить это бровсу , да еще думать как в оригинале отражать изменения клона . ADS ведь должен где то у себя держать логическую нумерацию записей курсора. Ведь курсор это обыкновенная рабочая область и показывается она в нужной сортировке

SergKis: Haz пишет:ADS ведь должен где то у себя держать ... С ADS не работал. Если в отборе ~10000 записей можно в Memio и нужные индексы строить на нем, при модификации записи повторный запрос на эту запись к ads. Если в ads есть сообщение (извещение) о изменении таблицы, ее можно перечитать (только изменения). Похожее у меня было (отбор даже не в memio) ~ 2-4 сек. уходило на запрос с индексацией.

Haz: Можно сразу запрос выводить во временную таблицу , а потом дропать ее , или в массив. Можно пробежаться по курсору и хеш массив создать из физического и логического номеров (это быстрее чем базу копировать ) Работать будет но как то на костыль похоже ) Хотелось бы без плясок с бубнами получить порядковый ( логический ) номер записи. непосредственно из курсора который возвращает запрос. ADS при выполнении запроса вида SELECT * FROM ... ODRER BY A,B,C выполняет его в две итерации 1 Сначала сама выборка SELECT и создание рабочей области ( курсора ) 2 Сортировка курсора по критерию A,B,C По сути это или временный индекс строится , или нечто подобное, где каждой записи курсора соответствует логический номер сортировки. Пытался поймать этот номер и через AdsGetRecordNum() и через AdsGetKeyNum() используя в качестве usFilterOption значения ADS_RESPECTFILTERS и ADS_IGNOREFILTERS выдает разные значения ..... но не порядковый номер. В общем пока в очередной раз бросил это занятие )



полная версия страницы