Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SELECT [D7, XP]


Alex8 ©   (2007-08-28 10:03:00) 

Уважаемые мастера !
Помогите разобраться в следующем небольшом коде :

unit UAbr;
interface

type
 TfrmAbr = class(TForm)
   DBGrid1: TDBGrid;
   DS2: TDataSource;
   Q2: TQuery;
   Q2cAvt: TStringField;      // FieldKind = fkLookup
   Q2Iavt: TSmallintField;     // FieldKind = fkData
   bt2: TButton;  
procedure bt2Click(Sender: TObject);
end;

implementation

{$R *.dfm}

procedure TfrmAbr.bt2Click(Sender: TObject);
Var zpr:String;
begin
Q2.Active := False;
// zpr := 'Select * FROM Tiz';    //  В этом вар-те выдается
                                                   нормальный результат
//zpr := 'Select  iavt FROM Tiz';     //  В этом вар-те выдается тот же
                                                         результат
zpr := 'Select  iavt, cavt FROM Tiz'; // А в этом вар-те выдается
                                         "Invalid Field name cAvt"  
Q2.SQL.Clear;
Q2.SQL.Add(zpr);
Q2.Active := True;
end;
end.

А мне нужен именно тот вариант, что выдает ошибку,
т.к. в SELECT нужно добавить ORDER BY cAvt.

Где я Ошибаюсь ?   Спасибо.


Alex8   (2007-08-28 16:44:00) [1]

Все понял. Еще раз большое спасибо.


Sergey13   (2007-08-28 16:35:00) [2]

> [16] Alex8   (28.08.07 16:13)
> Но возникли сомнения в целесообразности использования LOOKUP.

Целесообразно понимать как это работает и пользоваться этими знаниями.
Если справочник не велик, но тербуется постоянно (типа единиц измерения) я например часто открываю его и держу открытым постоянно, ссылаясь на него  лукапами. И запросы облегчает хотя бы на 1 таблицу (и то мясо). Если справочник здоровый (а тем более структурированный и многоуровневый), то работать с ним через лукап поля крайне неудобно (на мой взгляд) хоть в гриде хоть где.


Anatoly Podgoretsky   (2007-08-28 16:25:00) [3]

LOOKUP нужен только, если запись менять в гриде с выбором из справочника.


Alex8   (2007-08-28 16:13:00) [4]

>обязательно должна присутствовать секция WHERE и/или операторы связывания JOIN.

Все получилось (через LEFT OUTER JOIN). Спасибо.
Но возникли сомнения в целесообразности использования LOOKUP.
Если только проще ссылаться в DBGRID ?


Sergey13   (2007-08-28 15:39:00) [5]

> [14] Alex8   (28.08.07 15:35)
> Выборка произведена

Долго ждал результата? 8-)
Таблицы в запросе должны быть связаны, т.е. обязательно должна присутствовать секция WHERE и/или операторы связывания JOIN.


Alex8   (2007-08-28 15:35:00) [6]

>Никак. Но можно отсортировать по полю другой таблицы, на которое ссылается твое лукапное. Для этого нужно написать соответствующий запрос

Попробовал (см. 1)
 zpr := 'Select * FROM Tiz, Avt Order By Avt.CName ';  

Здесь Avt - лукапная таблица, а Avt.CName - поле.
соответствующее iAvt из таблицы Tiz.
  Выборка произведена, но не отсортирована.


sniknik   (2007-08-28 12:40:00) [7]

> которое не показывать в гриде.
которое можно даже не включать в выборку, кто бы там что не советовал, и сомневался в логичности... (->[8])
(конечно пока вопрос касается только первоначальной сортировки, а не поддержки ее в клиентском рекордсете)


Desdechado   (2007-08-28 12:02:00) [8]

> А вот как этот результат отсортироватьпо лукапному полю?
Никак. Можно в запросе соединить таблицу с твоим лукапным справочником, отсортировав по подстановочному полю, которое не показывать в гриде.


Sergey13   (2007-08-28 12:02:00) [9]

> [10] Alex8   (28.08.07 11:55)
> А вот как этот результат отсортировать
> по лукапному полю ?

Никак. Но можно отсортировать по полю другой таблицы, на которое ссылается твое лкуапное. Для этого нужно написать соответствующий запрос.


Alex8   (2007-08-28 11:55:00) [10]

Ход обсуждения меняет постановку вопроса.
Если лукапные поля не сортируются, то
задача выборки решается просто.

 В Query заносятся все поля таблицы,
добавляются все лукапные поля,
всем лишним полям visible:=False,
 используется SELECT * и
в DBGrid выдается результат.

А вот как этот результат отсортировать
по лукапному полю ?


Anatoly Podgoretsky   (2007-08-28 11:08:00) [11]


> В литературе указано, что в ORDER BY могут перечисляться
> только
> поле, указанные в Select.

Выбрось эту литературу и пользуйся фирменной документацией.


Desdechado   (2007-08-28 10:49:00) [12]

> > в ORDER BY могут перечисляться только поле, указанные в Select
> ну это наверное для частного случая говорилось, в общем это не так.
Вообще-то не рекомендуется сортировать по полю, не участвующему в выборке. И это логично. Хотя многие СУБД позволяют так делать.

> Не было (это поле типа fkLookup). Но после этого вопроса я  его тут же добавил.
> К сожалению, результат не изменился
А вот сортировать по лукапу (это клиентское псевдо-поле) на стороне сервера не получится, т.к. он не знает, что клиент так интерпретирует выданные ему данные.
Результат не изменился, т.к. на клиенте осталось это лукап-поле, а не поле данных. В датасете переопредели поля заново.


Sergey13   (2007-08-28 10:46:00) [13]

> Q2cAvt: TStringField;      // FieldKind = fkLookup

Это, как я понимаю лукапное поле, которое ты добавил в датасет вручную. Оно должно указывать на другую таблицу. Т.е. его нет (и не должно быть) физически в таблице БД. А ты хочешь по нему сортировать. Сортировка по лукап полям невозможна.
Публикуй структуру таблиц.


sniknik   (2007-08-28 10:39:00) [14]

> К сожалению, результат не изменился
значит не туда/не то добавил. а поля cavt как не было так и нет.

> в ORDER BY могут перечисляться только поле, указанные в Select.
ну это наверное для частного случая говорилось, в общем это не так.


Alex8   (2007-08-28 10:33:00) [15]

>Поле с именем cavt в таблице Tiz есть?

Не было (это поле типа fkLookup). Но после этого вопроса я  его тут же добавил.
К сожалению, результат не изменился

>ORDER BY cAvt можно дописать к ЛЮБОМУ варианту запроса
В литературе указано, что в ORDER BY могут перечисляться только
поле, указанные в Select.


pavel_guzhanov   (2007-08-28 10:17:00) [16]

Сообщение об ошибке говорит о том, что такого поля в таблице нет. Проверь, может быть имя поля указано неправильно, например буква "с" русская, или еще что-нибудь


dimaL   (2007-08-28 10:17:00) [17]


> Alex8

Укажи структуры таблицы Tiz.


Sergey13   (2007-08-28 10:15:00) [18]

> [0] Alex8   (28.08.07 10:03)
> А мне нужен именно тот вариант, что выдает ошибку,
> т.к. в SELECT нужно добавить ORDER BY cAvt.

ORDER BY cAvt можно дописать к ЛЮБОМУ варианту запроса.


Юрий Зотов   (2007-08-28 10:14:00) [19]

Поле с именем cavt в таблице Tiz есть?


Наверх

Титульная страница Поиск, карта сайта Написать письмо