Конференция "Базы" » Сортировка датасета по Lookup-полю [D7, MSSQL]
 
  • yurikon (05.01.12 09:02) [0]
    Приветствую!

    Написал универсальный обработчик для сортировки датасета в гриде по клику на заголовок.


     ds := TDBGridEh(Sender).DataSource.DataSet;
     if TDBGridEh(Sender).Columns[ACol].Title.SortMarker = smUpEh then
     begin
       TADODataSet(ds).Sort := '['+Column.FieldName +'] DESC';
       TDBGridEh(Sender).Columns[ACol].Title.SortMarker := smDownEh;
     end else
     begin
       TADODataSet(ds).Sort := '['+Column.FieldName +'] ASC';
       TDBGridEh(Sender).Columns[ACol].Title.SortMarker := smUpEh;
     end;



    Все работает нормально, пока дело не доходит до сортировки Lookup-поля. Сортировка требуется только локально.

    Подскажите, плиз, как лучше реализовать это?

    С уважением.
  • sniknik © (05.01.12 11:38) [1]
    поле должно существовать в объекте, раз используется его метод. создай его (в запросе добавь со значением например), можешь не показывать, просто перенаправляй сортировку на него, а при выборе в основном меняй и это "сортировочное".
  • yurikon (05.01.12 11:46) [2]
    Я рассматривал вариант с запросом, где можно сразу выбрать поле со значением, но датасет мне нужен для редактирования, а ADO, насколько я знаю, не поддерживает живые запросы.
  • sniknik © (05.01.12 16:52) [3]
    ADO поддерживает все, что способен представить и реализовать программист...
  • stas © (05.01.12 18:28) [4]
    yurikon   (05.01.12 11:46) [2]

    Select Pole1, Pole2,...Polen, (select Pole1 from moyspravochnik where id = moyatablica.idmoyspravochnik) as PoleIzSpravochnika from moyatablica

    вот так можно будет и редактировать.
  • stas © (05.01.12 18:31) [5]
    И на сколько я знаю dbgrideh можно настроить сортировку без обработчика, такую конечно как Вам надо придется с обработчиком.
    А вообще раз уж используете сторонние компоненты, то можно quantum grid использовать, там решен вопрос с сортировкой по лукап полям на сколько мне известно.
  • Velz (14.01.13 11:59) [6]
    Через событие OnTitleClick грида:

    procedure dbgrdh1_TitleClick(Column: TColumnEh);
    begin
     if Column.Title.SortMarker<>smDownEh then
     begin
       if Column.Field.FieldKind in [fkLookup] then
         TADODataSet(Column.Field.DataSet).Sort := '['+Column.Field.KeyFields +'] ASC'
       else
         TADODataSet(Column.Field.DataSet).Sort := '['+Column.Field.FieldName +'] ASC';
       Column.Title.SortMarker:=smDownEh;
     end
     else
     begin
       if Column.Field.FieldKind in [fkLookup] then
         TADODataSet(Column.Field.DataSet).Sort := '['+Column.Field.KeyFields +'] DESC'
       else
         TADODataSet(Column.Field.DataSet).Sort := '['+Column.Field.FieldName +'] DESC';
       Column.Title.SortMarker:=smUpEh;
     end;
    end;

    К сожалению, данный вариант не проканает в том плане, что сортировка будет происходить по полю-ключу, а не по полю значений.
    Решением данной проблемы может стать Только дублирование в запросе значений в соответствии с ключом (выводить их не обязательно), и вместо Column.Field.KeyFields указывать Column.Field.LookupResultFields.
  • Дмитрий (10.04.13 05:57) [7]
    Требуется сортировка лукапов (ГридЕх+АДОДатасет), при этом данные для лукапов берутся из другой базы.
    Т.е. Лукапы использованы для вывода в одной сетке данных из двух разных СУБД.
    Поэтому, сортировка в запросе не подходит.
    Попробовал добавить калькулируемые поля, куда подставлять значения из лукапов.
    Однако сортировать не хочет - при клике на столбец грида, та же ошибка, что и с лукапом- "Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру".

    Куда копать?
    АДО умеет сортировать калькулируемые поля?
  • sniknik © (10.04.13 08:02) [8]
    > Куда копать?
    перекапывай прямо вот эту тему, с начала.
  • Плохиш © (10.04.13 11:11) [9]

    > АДО умеет сортировать калькулируемые поля?

    Адо ничего не знает о ваших "калькулируемых полях".
  • Дмитрий (16.04.13 04:36) [10]
    sniknik
    >перекапывай прямо вот эту тему, с начала.
    вы ткните пальцем
    сортировка в запросе не катит никак
    что вы имеете в виду "про перенаправляй" я не врубаюсь совсем

    Плохиш
    калькулируемое поле в адо имеется
    как адо может про него не знать
    что вы имеете в виду под "не знает"?
  • sniknik © (16.04.13 07:34) [11]
    > вы ткните пальцем
    ответ первый, что непонятно в словах "поле должно существовать в объекте"?

    > что вы имеете в виду "про перенаправляй"
    2 поля, одно визуальное, другое для сортировки, при визуальной работе с одним сортируешь другое.
    не?

    > я не врубаюсь совсем
    ну так и спрашивай про то во что "не врубаешься", не игнорируй не понятое.

    > калькулируемое поле в адо имеется
    кто тебе это сказал? как ты его сделал? средствами ADO или средствами Delpi в обертке?
    оно тебе в ошибке пишет, "нет поля", и уж поверь "оно" знает.
  • Дмитрий (16.04.13 20:05) [12]
    >2 поля, одно визуальное, другое для сортировки, при визуальной работе с одним сортируешь другое.
    так как же сделать поле, которое будет сортироваться???!!!

    >кто тебе это сказал? как ты его сделал? средствами ADO или средствами Delpi в обертке?
    калькулируемое поле добавлено стандартными средствами среды разработки

    >оно тебе в ошибке пишет, "нет поля", и уж поверь "оно" знает.
    только мне не понять, чего он от меня хочет
    куда и что надо добавить?
 
Конференция "Базы" » Сортировка датасета по Lookup-полю [D7, MSSQL]
Есть новые Нет новых   [119465   +67][b:0][p:0.001]