Автор | Сообщение |
|
| |
Пост N: 757
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.01.16 17:02. Заголовок: Вопрос на засыпку по ADS
Как в курсоре ADS поймать логический номер записи если используется ORDER BY К примеру есть запрос вида : SELECT * FROM Table_1 ODRER BY Field_1 Полученный курсор выдаст отсортированную таблицу по полю Field_1 , физические номера записей ( RecNo() ) будут вперемешку, RowNum тоже не помогает т.к. Field_1 есть в полях вывода - SELECT * Это я пытаюсь вертикальный скроллер в TsBrowse вылечить , он понимает или Recno() или KeyNo() , т.к. индекс не всегда совпадает с выражением сортировки , а Recno() вперемешку - скроллер скачет вверх-вниз беспорядочно при навигации. В исходниках RDDADS не нашел к чему прицепиться. Если нужен самодостаточный - могу написать )
|
|
|
Ответов - 6
[только новые]
|
|
|
| постоянный участник
|
Пост N: 843
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.01.16 17:17. Заголовок: В MySql можно задать..
В MySql можно задать SELECT a,b,c,count(*) from tabl1 order by c можкт в ADS похожее есть
|
|
|
|
| |
Пост N: 758
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.01.16 17:23. Заголовок: SergKis пишет: SEL..
SergKis пишет: Тогда курсор в ADS получается НЕ РЕДАКТИРУЕМЫЙ , не совсем удобно получается и Count() агрегатная функция , ADS ругается типа на остальные поля GROUP BY или HAVING сделай ( но главное это НЕ РЕДАКТИРУЕМЫЙ курсор ) Пока тупо отключаю скроллер чтоб не нервировал В идеале еслиб была функция в RDD возвращающая логический номер записи в курсоре.
|
|
|
|
| постоянный участник
|
Пост N: 844
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.01.16 17:37. Заголовок: А через др. таблицу:..
А через др. таблицу: INSERT INTO tbl_temp SELECT * FROM tab1 ORDER BY ...
|
|
|
|
| |
Пост N: 759
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.01.16 17:58. Заголовок: SergKis пишет: А че..
SergKis пишет: так пойдет. т.к. Recno() совпадет с номером логической записи. Не красиво как то при каждой сортировке копировать в базу или массив , а потом кормить это бровсу , да еще думать как в оригинале отражать изменения клона . ADS ведь должен где то у себя держать логическую нумерацию записей курсора. Ведь курсор это обыкновенная рабочая область и показывается она в нужной сортировке
|
|
|
|
| постоянный участник
|
Пост N: 845
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.01.16 18:23. Заголовок: Haz пишет:ADS ведь д..
Haz пишет: цитата: | ADS ведь должен где то у себя держать ... |
| С ADS не работал. Если в отборе ~10000 записей можно в Memio и нужные индексы строить на нем, при модификации записи повторный запрос на эту запись к ads. Если в ads есть сообщение (извещение) о изменении таблицы, ее можно перечитать (только изменения). Похожее у меня было (отбор даже не в memio) ~ 2-4 сек. уходило на запрос с индексацией.
|
|
|
|
| |
Пост N: 760
Зарегистрирован: 20.02.11
|
|
Отправлено: 27.01.16 11:36. Заголовок: Можно сразу запрос в..
Можно сразу запрос выводить во временную таблицу , а потом дропать ее , или в массив. Можно пробежаться по курсору и хеш массив создать из физического и логического номеров (это быстрее чем базу копировать ) Работать будет но как то на костыль похоже ) Хотелось бы без плясок с бубнами получить порядковый ( логический ) номер записи. непосредственно из курсора который возвращает запрос. ADS при выполнении запроса вида SELECT * FROM ... ODRER BY A,B,C выполняет его в две итерации 1 Сначала сама выборка SELECT и создание рабочей области ( курсора ) 2 Сортировка курсора по критерию A,B,C По сути это или временный индекс строится , или нечто подобное, где каждой записи курсора соответствует логический номер сортировки. Пытался поймать этот номер и через AdsGetRecordNum() и через AdsGetKeyNum() используя в качестве usFilterOption значения ADS_RESPECTFILTERS и ADS_IGNOREFILTERS выдает разные значения ..... но не порядковый номер. В общем пока в очередной раз бросил это занятие )
|
|
|
|