select *
from Главная
проблема с SQL-запросом в связанных таблицах
ключевые поля и у той и у другой key1,связь через key1 у ADOTable1 и LinkKey у ADOTable2
при работе возникли кое-какие проблемы:
1.Когда я делаю запрос по всем полям
Код:
в одной таблице проблем не возникает.Когда обращаюсь к конкретным полям:
Код:
select Наименование
from Главная
from Главная
он выдает "ADOQuery1: Field 'key1' not found ".Хотя все поля из ADOTable1 в ADOQuery1 добавлены....
2.когда добавляю в ADOQuery1 поля из второй таблицы и делаю запрос
по двум таблицам все повторяется также:
Код:
select *
from Главная,Объекты
from Главная,Объекты
то все нормально
Код:
select Наименование,Дата5
from Главная,Объекты
from Главная,Объекты
выдает "ADOQuery1: Field 'Адрес' not found"
где Наименование из ADOTable1('Главная')
Дата5 из ADOTable2('Объекты').
Подскажите пожалуйста как правильно построить запрос,
чтобы выборка была по конкретным полям таблиц.
3.Когда в ADOQuery1 внесены поля из обоих таблиц он перестает корректно выполнять запрос по одной таблице.то есть на запрос
Код:
select *
from Главная
from Главная
выдает ADOQuery1: Field 'Главная.key1' not found
и как же в таком случае делать запрос только по одной таблице?
Заранее спасибо
Поля удали из ADOQuery1 все которые добавил
Цитата: Phodopus
Поля удали из ADOQuery1 все которые добавил
Ну это я пробовал!!!и каждый раз их добавлять и удалять?
Зачем? Не использовать их вообще! Динамически гуляй, динамически. Есть такое замечательное свойство .Fields у каждого DataSet-а
Код:
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
DataModule2.ADOQuery1.Active:=false;
DataModule2.ADOQuery1.SQL.Clear;
case radiogroup1.ItemIndex of
0:
begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата5>=:Dann and Дата5<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата5' );
end;
1:
begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата6>=:Dann and Дата6<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата6' );
end;
2:
begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата7>=:Dann and Дата7<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата7' );
end;
3: begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата8>=:Dann and Дата8<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата8' );
end;
4: begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата9>=:Dann and Дата9<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата9' );
end;
end;
DataModule2.ADOQuery1.FieldByName('Наименование').DisplayWidth:=20;
DataModule2.ADOQuery1.FieldByName('НазваниеОбъекта').DisplayWidth:=20;
DataModule2.ADOQuery1.FieldByName('Дата5').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата6').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата7').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата8').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата9').DisplayWidth:=10;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann').DataType:=ftDate;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann').Value:=
DateTimePicker1.Date;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann1').DataType:=ftDate;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann1').Value:=
DateTimePicker2.Date;
DataModule2.ADOQuery1.Active:=true;
ResultZapros.ShowModal;
end;
var s:string;
begin
DataModule2.ADOQuery1.Active:=false;
DataModule2.ADOQuery1.SQL.Clear;
case radiogroup1.ItemIndex of
0:
begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата5>=:Dann and Дата5<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата5' );
end;
1:
begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата6>=:Dann and Дата6<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата6' );
end;
2:
begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата7>=:Dann and Дата7<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата7' );
end;
3: begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата8>=:Dann and Дата8<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата8' );
end;
4: begin
DataModule2.ADOQuery1.SQL.Add('select Наименование,НазваниеОбъекта,Дата5,Дата6,Дата7,Дата8,Дата9 from Главная,Объекты where Дата9>=:Dann and Дата9<=:Dann1 and Главная.key1=Объекты.LinkKey2 ORDER BY Дата9' );
end;
end;
DataModule2.ADOQuery1.FieldByName('Наименование').DisplayWidth:=20;
DataModule2.ADOQuery1.FieldByName('НазваниеОбъекта').DisplayWidth:=20;
DataModule2.ADOQuery1.FieldByName('Дата5').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата6').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата7').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата8').DisplayWidth:=10;
DataModule2.ADOQuery1.FieldByName('Дата9').DisplayWidth:=10;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann').DataType:=ftDate;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann').Value:=
DateTimePicker1.Date;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann1').DataType:=ftDate;
DataModule2.ADOQuery1.Parameters.ParamByName('Dann1').Value:=
DateTimePicker2.Date;
DataModule2.ADOQuery1.Active:=true;
ResultZapros.ShowModal;
end;
этот код рабочий,но есть некоторые но:
1.Динамически обращаться к свойствам полей можно только если они добавлены в ADOQuery1,а если нету то при обращении к строкам DataModule2.ADOQuery1.FieldByName('Наименование').DisplayWidth:=20 и т.д.
выдается выдается Field 'Наименование' not found. Если же все поля добавлены в ADOQuery то код работает.
Но в этом случае порядок расположения полей будеи оставаться статичным как это задано в ADOQuery...А мне для каждого значения
radiogroup1.ItemIndex в запросах нужно делать разный порядок для
Дата5,Дата6,Дата7,Дата8,Дата9. В принципе так и делаю, но только когда в ADOQUery не добавлены поля,но в этом случае нельзя обращаться к FieldByName('')....
Как же сделать чтобы и порядок расположения полей можно было менять и динамически обращаться к свойствам полей через FieldByName?:(:confused:
Ну во-первых ты не запустил запрос ПЕРЕД обращением к методу .FieldByName, во-вторых сказали же, гуляй по свойству .Fields у DataSet-а если набор полей меняется (хотя у тебя в приведенном куске вроде набор один и тот же)