Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.042 c
15-1187855606
pavel_guzhanov
2007-08-23 11:53
2007.09.23
формат jpg


2-1188244933
malyar
2007-08-28 00:02
2007.09.23
обработка исключений


10-1136900689
Alexey V.
2006-01-10 16:44
2007.09.23
Обновление данных в Excel


15-1188286117
Галинка
2007-08-28 11:28
2007.09.23
Файловый менеджер для SUSE Linux 10.1


2-1188280980
Alex8
2007-08-28 10:03
2007.09.23
SELECT





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский