Форум: "Начинающим";
Текущий архив: 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