![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отсортировать данные в OracleDataSet? [D7]
tytus © (2006-11-30 12:04:00)Доброго дня мастера. В запросе есть Order by ..., делается выборка из ВРЕМЕННОЙ таблицы. Затем по тексту
Session.Commit - следовательно, таблица уже пуста, но набор данных не пустой. Нужно теперь сортировать данные по любому полю (по возр/убыв). Выполнить еще раз запрос, изменив Order by не подходит - долго. Подскажите как можно сортитровать данные в полях НД.
ANB (2006-12-01 18:53:00) [1]
> Наверное буду делать коммит где-то в другом месте.
Дык он тебе вообще не нужен в таком случае - тыж тока времянку набил. Но может быть грабля - где то коммит явно/неявно проскочит и времянка потрется.
Или вариант - сдерни на клиентский набор данных и сортируй его как хочешь.
tytus (2006-12-01 17:58:00) [2]>Курдль [18]
ни то ни другое.
Короче. Пользователь делает отчет за период (по продаже товара, сколько продано, по какой цене, были ли переоценки /уценки-дооценки/, перемещения с одного склада товара на другой, или ввобще в магазин, кто поставщик товара, номера приходных накладных, остатки ... ну все поняли о чем я).
В форме выбирается дата, склад, учитывать что-то не учитывать, группировать что-то не группировать, цена - учетная/розничная... и т.д. и т.п. Потом вся эта хрень, передается в БД в пакет на выполнение процедур анд функций, по обработке всей этой ... информации (очень мягко выражаясь). Результаты оракл записывает во временную таблицу, с которой потом НД через запрос (может быть и с подвыподвертом) наполняет вышеупомянутую сетку.
Временка одна, а вот таких формочек - до.. много, и все они потом через свои запросики хотят эту временку. Пользователей соответственно тоже много, и прежде чем делать на одной базе отдельную временку, нужно подумать - пригодится ли она в дальнейшем и целесообразно ли ее применение в будущем. А так - одна временка есть - вот ее и танцуйте (анектод такой (с) -).
Далее.
Пользователь видит, что - что-то нарисовалось в сетке. Хорошо. Но ему нужно напечатать красивый отчет (QReport - не очень, FastReport - круче, но мороки больше), да еще и отсортировать результатпо возрастанию количества проданного товара, или его суммы, или вообще по фамилии поставщика или кассира, который имел неосторожность целый день забивать в базу эти никому ненужные пиво и водку -))).
Заключение.
Во всех формочках сортировка происходит при повторном выполнении пакета, и соотв-но - наполнению временки. Я пытался аналогично делать - но тормоза страшные.
Вот в двух словах о моем горе.
Наверное буду делать коммит где-то в другом месте.
Курдль (2006-12-01 17:20:00) [3]
> tytus (01.12.06 17:16) [17]
Ты внятно бизнес процесс описать можешь?
С какой целью сортировка?
Сортировать набор, а потом построчно обрабатывать для получения какого-то результата - это одно.
А сортировать визуально отображаемые записи для улучшения восприятия юзером - это другое.
tytus (2006-12-01 17:16:00) [4]>Курдль [16]
Есть свойство SortLocal, но что оно и с чем его едять - не знаю.
В компоненты OracleDataSet есть метод
OracleDataSet.FieldList.CustomSort. Но это наверное для списка полей НД, а не для записей... Или я ошибаюсь...
Курдль (2006-12-01 16:55:00) [5]
> ANB © (01.12.06 16:19) [15]
> Оная опция не всеми гридами поддерживается
Указанной аутором DBGridEh разве не поддерживается?..
ANB (2006-12-01 16:19:00) [6]
> Взвести опцию типа "сортировка разрешена" и клацать по заголовку
> поля.
Оная опция не всеми гридами поддерживается
Курдль (2006-12-01 16:17:00) [7]
> tytus (01.12.06 11:29) [4]
> А средсвто отображения - сие есть DBGridEh - токо как ним сортировать не затрагивая НД
> - пока затрудняюсь.
Взвести опцию типа "сортировка разрешена" и клацать по заголовку поля.
Или сортировка должна управляться как-то с подвыподвертом?
tytus (2006-12-01 14:47:00) [8]>Sergey13 [11]
идея хорошая, немножко напряжная для моего случая [4], но протолкнуть можно.
Насчет [12] - да не лимон там, а гораздо менее (ну макссссимуммм 1000), просто ранее нужно было двигать такие объемы (без БД), и вполне список устраивал (кол-во записей в списке доходило до 2 лимонов). Я уже на эту тему поднимал вопрос в конференции (Общие) но когда это было - не помню, но рэчь шла о сортировке больших списков. Советовали и хеши и др... но это уже отклонение от текущей темы.
Sergey13 (2006-12-01 14:37:00) [9]> [10] tytus (01.12.06 14:29)
> сортируется 1 000 000 за 1 сек
За морем телушка - полушка, да рубль перевоз. (с) народная мудрость.
Ты этот лимон записей запаришся закачивать на клиента. Нафиг вообще столько на клиента тянуть?
Sergey13 (2006-12-01 14:33:00) [10]> [4] tytus (01.12.06 11:29)
> Временка не моя
Сделай свою времянку2, какую надо. То-же вариант.
tytus (2006-12-01 14:29:00) [11]>ALL
Спасибо всем, скорее всего [9] можно и придержать.
А есть есче бредовая идея - создать TList, в него перегнать данные с таблицы (есть вроде в DBGridEh такое SetColumn GetColumn, счас не помню ), и его сортировать (проверял - на селероне-2G, 256 RAM сортируется 1 000 000 за 1 сек). Но это уже изврат, нутром чую....
ANB (2006-12-01 14:22:00) [12]
> А за "придержание коммита" вообще кучонки поотрывать надо!
Ну, если, кроме закачки времянки в этой транзакции ничего не делалось - почему бы и не придержать ?
roottim (2006-12-01 14:20:00) [13]
> Что, временная таблица умирает с коммитом
on commit delete rows
как уж они создали так и пользуются!
Курдль (2006-12-01 13:11:00) [14]
> tytus (30.11.06 12:04)
> Доброго дня мастера. В запросе есть Order by ..., делается
> выборка из ВРЕМЕННОЙ таблицы. Затем по тексту
> Session.Commit - следовательно, таблица уже пуста, но набор
> данных не пустой.
> roottim © (01.12.06 12:10) [6]
> не делай session.commit - зачем тебе, ибо ты с данными не
> закончил работу!
Либо вы все бредите, либо я что-то в этом мире не понимаю :(
Что, временная таблица умирает с коммитом?
А за "придержание коммита" вообще кучонки поотрывать надо!
roottim (2006-12-01 12:10:00) [15]не делай session.commit - зачем тебе, ибо ты с данными не закончил работу!
ANB (2006-12-01 11:44:00) [16]
> tytus (01.12.06 11:29) [4]
девэкспрессовский грид может сортировать сам.
Значится 3 решения :
а) перекачать данные в свою времянку до коммита и извращаться с ней
б) перекачать данные в CDS (ClientDataSet) - и с ним уже мучится (я по CDS не спец)
в) использовать девэкспрессовский грид (на больших выборках (более 10 000 может тормозить при пересортировке))
tytus (2006-12-01 11:29:00) [17]Ну наконец-то! Услышали.!-)
Спасибо всем, а теперь подробнее...
>[1]ANB
Временка не моя, к тому-жо часто используется другими программами, каждая из которых по-своему ее заполняет. И во всех кодах SQL (их много 100..200 х.е.з. сколько) искать и писать DELETE FROM VREMENKA... не представляется осуществимым.
>[2]Sergey13
тоже что и выше, и кто такой CDS???
>[3]Курдль
Да, для отображения. Повторные выборки из [1],[2] проходили, так как были не напряжные. А средсвто отображения - сие есть DBGridEh - токо как ним сортировать не затрагивая НД - пока затрудняюсь.
Курдль (2006-11-30 15:11:00) [18]А с какой целью сортировать? Если для отображения - с этим и средства отображения справляются.
ANB (2006-11-30 12:54:00) [19]
> Выполнить еще раз запрос, изменив Order by не подходит -
> долго. Подскажите как можно сортитровать данные в полях
> НД.
Скорее всего сортировка на клиенте будет идти еще дольше - ты же не озаботился создать собственные индексы :)
Совет - таки дергать все повторно из времянки, прикрутив к ней нужные индексы и переключив ее на режим сохранения строк после коммита. Не забудь очищать ее перед заполнением.
Sergey13 (2006-11-30 12:54:00) [20]> Затем по тексту Session.Commit - следовательно, таблица уже пуста
Это необязательно. Можно сконфигурировать временную таблицу в контексте сессии. Т.е. данные для сессии будут держаться до прямого указания на удаление или до конца сессии.
А в НД можно отсортировать скопировав данные например в CDS.