Форум: "Базы";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизDbGridEh+FibPlus сортировка Найти похожие ветки
← →
Alexandr © (2005-05-05 18:03) [0]Есть связка
DBGridEh++Tdatasource+ TpFIBdataset
начальные условия
1) TpFIBdataset закрыт
2) на columns у DbGridEh стоит порядок сортировки.
теперь выполняем TpFIBdataset
видим что датасет открылся, однако порядок сортировки из DbGridEh сам не взялся,
и получается что визуально сотрировка указана в гриде, а сам датасет не отсортирован.
Вызываем DoSort с параметрами сортировки взятыми из dbgrideh и все нормально.
Вопросы:
1) Как узнать после открытия TpFIbdataset, к какому DbgridEh он привязан, чтоб сзять оттуда порядок сортировки?
или для другого способа решения
2) Как можно заполнить FSortFields у закрытого датасета, чтоб при открытии он автоматически брался и выполнялась сортировка? Сейчас прослеживается только один способ: выполнить DoSort для заполнения FsortField, однако DoSort выполнить нельзя пока датасет закрыт.
← →
AlexO © (2005-05-05 19:08) [1]А если установить обработчик на
DBGrid.DataSource.DataSet.AfterOpen ?
← →
Alexandr © (2005-05-06 05:53) [2]ну так это будет обработчик у Tdataset
и он ничего не знает от нужном DbGrid.
Вот и вопрос, как узнать в этом обработчике, с какого грида брать сортировку
← →
Max Zyuzin © (2005-05-06 09:41) [3]>Alexandr © (05.05.05 18:03)
1. А Grid-ы могут сидеть на разных формах или на какой то одной? Можно гипотетически в цикле пробежаться по Grid-ам и посмотреть кто у них DataSet-ом является?
2. Не вижу собсно проблеммы? Проблемаа в том что датасет 2-а раза придется открывать? (первый раз что бы заполнить сортировку - 2-ой непосредственно сортируя?)
PS Алекс ты ли это? Смотрю и не узнаю :) Года 2-3 назад ты тут зависал?
← →
Alexandr © (2005-05-06 10:51) [4]я. я..
Я в VCL неочень.
На разных они формах могут быть.
Конечно, если каждый тяжелый запрос по 2 раза открывать, то кто жим пользоваться будет.
А бугать по 20 формам в поисках грида тоже не фонтан.
Я что надумал, так это свою глобальную структуру написать, в которой хранить связки гридов и датасетов.
И в ней уже искать.
Все просто казалось бы.
Но я не могу понять, как с этим больше никто не сталкивался.
ну явно же криво как-то.
← →
Max Zyuzin © (2005-05-06 11:24) [5]>Alexandr © (06.05.05 10:51) [4]
Может немного пересмотреть подход к задаче, а то такое ощущение что у тебя датасеты открываются и закрываются исключительно самопроизвольно, рандомом по таймеру :) Что ты даже не в курсе что же там реально открылось. Я как то обычно знаю какой датасет у меня где будет отображаться. К тому же из твоей задачи я так понял у тебя есть однозначная зависимость. Один Grid - один Датасет.
Конечно, если каждый тяжелый запрос по 2 раза открывать, то кто жим пользоваться будет
Можно конечно нагло при закрытии датасета прикидываться шлакоблоком и удалять все галочки о сортировке :) А вообще я так делако пока не закапывался в свойства EhLib хотя сам им регулярно пользуюсь.
← →
Alexandr © (2005-05-06 13:06) [6]тут все проще.
у dbgrideh есть сохранение\загрузка свойств колонок в файл.
При запуске программы я настройки читаю и там порядок сортировки тоже читается.
Очень удобно - как закрыли, так потом с той же сортировкой и открыли.
Но при запуске программы все датасеты не открываются.
Они открываются по мере надобности, т.е. уже после того, как ВИПкшв прочитал свои настроики и треугольнички показал.
И вот теперь в процессе работы программы датасет должен открыться, я ему Open пишу. А какой данные примет мне всеравно. Мне бы чтоб не было расхождения между треугольничками в шапке грида и реальной сортировкой.
Уфф... Вроед прям на пальцах рассказал проблему.
← →
TohaNik © (2005-05-06 13:57) [7]В фибах можно в макросе указать поле сортировки = треугольничкам
и открывать уже отсортированный датасет, если поля сопоставляются треугольничкам.
← →
Alexandr © (2005-05-06 14:07) [8]локальная сортировка интересует в первую очередь. С серверной и так все понятно.
DoSort метод у FIBdataset
← →
AlexO © (2005-05-06 14:09) [9]Я мел ввиду при создании формы назначить обработчик в RunTime:
TMyForm.DataSetAfterOpen(DataSet: TDataSet);
begin
DBGridEhDataService.ApplySorting(DBGrid);
end;
TMyForm.OnCreate(Sender: TObject);
begin
DBGrid.DataSource.DataSet.AfterOpen := DataSetAfterOpen;
end;
← →
Alexandr © (2005-05-06 14:16) [10]вот здесь
TMyForm.DataSetAfterOpen(DataSet: TDataSet);
begin
DBGridEhDataService.ApplySorting(DBGrid);
end;
смотрим первую строку. Видим - на вход передается dataset
а в 3 строке в качестве параметра передается Dbgrid.
Откуда я должен взять этот Dbgrid?
В этом весь вопрос.
← →
TohaNik © (2005-05-06 14:20) [11]Alexandr © (06.05.05 14:07) [8]
Понятно.
Просто ты первый раз открываешь с серверной по параметру , а потом по необходимости сортируешь как угодно локально.
← →
AlexO © (2005-05-06 14:22) [12]Alexandr
Хватит тормозить. При создании формы на которой лежит твой DBGrid, ты знаешь DBGrid и можешь выяснить с каким DataSet он связан и назначить обработчик.
← →
Alexandr © (2005-05-06 14:22) [13]2TohaNik::
хм...
тоже какой-то выход.
мне начинает немножко нравиться.
Но вот локальная сортировка, наложенная после серверной будет чуть-чуть криво работать, если сортируем по нескольким полям.
Может этого никто не заметит, конечно.
Можно это и обойти, снова переоткрытием...
надо подумать.
← →
Max Zyuzin © (2005-05-06 14:25) [14]>Alexandr © (06.05.05 13:06) [6]
Ааа...ясно Гм.. дык нет ничего проще :) Раз ты априоре знаешь какие колонки у тебя выбраны сортировкой. Что мешает один раз пройтись по DBGridEh.Columns и динамически сформировать в запросе твоем в хвосте order by ... со списком полей полученных из DBGridEh.Columns[i].FieldName у которых DBGridEh.Columns[i].Title.SortMarker <> smNoneEh и усе...
← →
Alexandr © (2005-05-06 14:34) [15]да, к этому и прихожу, но это для серверой сортировки, а я хоту точно также сделать для локальной.
Тоже чтоб вот накидал список датасету, а он его когда надо сам прочитает.
Для серверой проблемы нет, а для локольной там этот список глубоко внутрях и я к нему снаружи доступа не нашел.
← →
Max Zyuzin © (2005-05-06 14:58) [16]>Alexandr © (06.05.05 14:34) [15]
Возможно я чего то не догоняю :) Но объясни мне приемущества использования локальной сортировки и фильтрации перед серверной с. и ф. для клиент - севрерноц СУБД. Варианты типа меньше таскать по сети... хз... зато данные достовернее.. :) В общем в этом месте я проблем не вижу совсем. Ты сомтрел такой файлик как EhLibFIB.pas который идет вместе с EhLib? Там процедура реализована сортировкой которая и занимается.
← →
Alexandr © (2005-05-06 15:14) [17]да, все я смотрел.
И отличия серверной сортировки от локальной понимаю в полной мере.
И четко представляю что и когда.
1) имеем долгоиграющий запрос, возвращающий десяток записей.
Сортировка должна быть однозначно локальная.
2) имеем большой набор данных, очень объемный. И для сортировки нет индекса, а набор всеравно сесь на клиента грузить. И тачка у клиента хорошая. Нафига сервер грузить левой работой, да еще и по сети данные гонять. Тоже локальная сортировка выглядит неплохо.
можно и еще, ну да хватит.
← →
Max Zyuzin © (2005-05-06 15:47) [18]>Alexandr © (06.05.05 15:14) [17]
Возвращаясь к твоей проблеме - у тебя датасет закрыт. т.е. при его открытии все равно лезем на сервер за данными. Т.е. для твоих "треугольничков" смело используем сортировку в запросе по описаному выше алгоритму, ну а далее если тебя не устраивает серверная сортировка используешь локальную... как тебе такой вариянт?
← →
Alexandr © (2005-05-06 15:49) [19]я так уже и сделал.
Я ж сказал сразу, что мне такой вариант понравился.
← →
Alexandr © (2005-05-06 15:51) [20]а ну и вообщем, спасибо за идею.
Реализация ее, кстати, потребовала еще и небольшого патча в ApplySortSQL... или как он там, с таким длинным названием.
Но это уже мелочи.
← →
Max Zyuzin © (2005-05-06 16:05) [21]>Alexandr © (06.05.05 15:49) [19]
Ух.. изобрел я вилосипед :( невнимательно прочитал пост ...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.038 c