Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

SELECT   Найти похожие ветки 

 
Alex8   (2007-08-28 10:03) [0]

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

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.

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


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

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


 
Sergey13 ©   (2007-08-28 10:15) [2]

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

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


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


> Alex8

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


 
pavel_guzhanov ©   (2007-08-28 10:17) [4]

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


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

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

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

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


 
sniknik ©   (2007-08-28 10:39) [6]

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

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


 
Sergey13 ©   (2007-08-28 10:46) [7]

> Q2cAvt: TStringField;      // FieldKind = fkLookup

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


 
Desdechado ©   (2007-08-28 10:49) [8]

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

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


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


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

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


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

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

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

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


 
Sergey13 ©   (2007-08-28 12:02) [11]

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

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


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

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


 
sniknik ©   (2007-08-28 12:40) [13]

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


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

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

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

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


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

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2007-08-28 16:25) [17]

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


 
Sergey13 ©   (2007-08-28 16:35) [18]

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2007.09.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.017 c
2-1188280980
Alex8
2007-08-28 10:03
2007.09.23
SELECT


15-1188071825
Turbouser
2007-08-25 23:57
2007.09.23
DM клиент


2-1188476570
MZ
2007-08-30 16:22
2007.09.23
SQL-запрос


15-1187882160
Joan
2007-08-23 19:16
2007.09.23
SQL


2-1188318256
ElectriC
2007-08-28 20:24
2007.09.23
Блокировка компьютера