Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > DbgridEh, проблема отображения и сортировки


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


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


*Id
Id_org
Summa
....


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

*Id_org
Name
Name_full
...


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

 Заранее благодарен даже за наводки

Автор: 14SatanA88 15.6.2011, 08:12
у ехлиба есть толковые демки
открой, повтыкай, разберешься

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


В любом из своих 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';

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)