Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
10-1094377969
Ragazor
2004-09-05 13:52
2005.06.14
Excel var iable convert. trouble


4-1114183071
Хинт
2005-04-22 19:17
2005.06.14
Вывод графики на экран


14-1116783564
Zacho
2005-05-22 21:39
2005.06.14
Задача про самолёт на транспортёре :)


14-1117028106
Korvet
2005-05-25 17:35
2005.06.14
Помогите с кодом я заплачу


6-1111769393
Radgar
2005-03-25 19:49
2005.06.14
Активность у массива TServerSocket





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский