Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DbgridEh, проблема отображения и сортировки 
:(
    Опции темы
Smog
Дата 15.6.2011, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.9.2004

Репутация: нет
Всего: нет



Здравствуйте!
 Использую ehlib + ado + mysql 
 Есть lookup поле, выпадающий список , все как полагается, но не могу сделать по нему сортировку/фильтрацию. По всем остальным полям работает.  
 При попыткT сортировки на нем возникает ошибка "В коллекции не удается найти элемент соответствующий требуемому имени или порядковому числу" 


В-общем, может у меня подход неправильный? 
Есть таблица 1, допустим с такими полями


*Id
Id_org
Summa
....


И есть таблица 2 с полями

*Id_org
Name
Name_full
...


Нужно отобразить это на dbgrideh с возможностью выбора организации из списка + сортировки по этому же полю. Как поступить?

 Заранее благодарен даже за наводки
PM MAIL   Вверх
14SatanA88
Дата 15.6.2011, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 1
Всего: 5



у ехлиба есть толковые демки
открой, повтыкай, разберешься
PM MAIL ICQ   Вверх
cliv
Дата 26.9.2011, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.9.2011

Репутация: нет
Всего: нет



Хоть вопрос очень старый - дам ответ, что бы больше не возникал.


В любом из своих DBGridEh используйте событие DBGridSortMarkingChanged
В из него вызывайте следующую процедуру:

Код

//-----------------------------------------------
//Сортировка по lookup полю с подстановкой
//-----------------------------------------------
procedure SortWithLookUp(var Grid:TDBGridEh;var DS:TADOQuery; FName,FLookUp: Array of String);
var i,j    :Integer;
    si,sj  :String;
    Actived: Boolean;
begin
  si := '';
  sj := '';
  for i := 0 to Grid.SortMarkedColumns.Count-1 do                         //цикл по всем сортируемым полям
    begin
      sj := Grid.SortMarkedColumns[i].FieldName;                           //получить имя поля
      for j := 0 to Length(FName)-1 do                                            //цикл по всем имеющимся lookup полям
        if Grid.SortMarkedColumns[i].FieldName = FName[j] then       //если это имя есть в списке заменяемых полей
        sj := FLookUp[j];                                                                 //то заменить
      si:= si + sj;                                                                           //добавить получившееся значение к строке
      if Grid.SortMarkedColumns[i].Title.SortMarker = smUpEh then   //добавит предикат в зависимости от направления сортировки
      si := si + ' DESC , '
      else
      si := si + ', ';
    end;
  if si <> '' then si := ' ORDER BY ' + Copy(si,1,Length(si)-2);  //сформировать строку сортировки
  Actived := DS.Active;
  DS.SQL.Strings[DS.SQL.Count-1] := si;                                //добавить ее в качестве последней в SQL запрос
  if Actived then                                                                     //переоткрыть НД
  begin                                                                                  //что бы работало через strings[] строки изначально должны быть
    DS.Close;                                                                         //добавленны в SQL запрос процедурой ADOQuery.SQL.Add
    DS.Open;
  end;
  end;



пример вызыва:
Код


SortWithLookUp(DBGrid1, ConsumerT,['sEye','sHair','sConsumer_Typ'],['E_color','H_Color','C_Typ']);

Не забывайте включать в DataSet (например через JOIN) поля по которым реально будет идти сортировка. В примере это E_color,H_color и C_Typ
соответствующии им lookup поля - sEye, sHair и sConsumer_Typ
пример запроса:
Код

    ConsumerT.SQL.Clear;
    ConsumerT.SQL.Add('SELECT Consumer.*, Consumer_Type.*, Eye_color.*, Hair_color.* ');
    ConsumerT.SQL.Add('FROM Hair_color ');
    ConsumerT.SQL.Add('RIGHT JOIN (Eye_color ');
    ConsumerT.SQL.Add('RIGHT JOIN (Consumer_Type ');
    ConsumerT.SQL.Add('RIGHT JOIN Consumer ');
    ConsumerT.SQL.Add('ON Consumer_Type.Key = Consumer.Link_Consumer_Typ) ');
    ConsumerT.SQL.Add('ON Eye_color.Key = Consumer.Link_Eye_color) ');
    ConsumerT.SQL.Add('ON Hair_color.Key = Consumer.Link_Hair_color ');
    ConsumerT.SQL.Add('ORDER BY Consumer.Name1');
    ConsumerT.Open;
    ConsumerT.Properties['Unique Table'].Value:= 'Consumer';

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.