Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с SQL-запросом в связанных таблицах

32K
21 августа 2008 года
kopernik21187
31 / / 13.07.2008
Есть две связанные ADOTable1('Главная') и ADOTable2('Объекты'),а также ADOQuery1
ключевые поля и у той и у другой key1,связь через key1 у ADOTable1 и LinkKey у ADOTable2
при работе возникли кое-какие проблемы:
1.Когда я делаю запрос по всем полям
 
Код:
select *
   from Главная

в одной таблице проблем не возникает.Когда обращаюсь к конкретным полям:
 
Код:
select Наименование
     from Главная

он выдает "ADOQuery1: Field 'key1' not found ".Хотя все поля из ADOTable1 в ADOQuery1 добавлены....
2.когда добавляю в ADOQuery1 поля из второй таблицы и делаю запрос
по двум таблицам все повторяется также:
 
Код:
select *
   from Главная,Объекты

то все нормально
 
Код:
select Наименование,Дата5
    from Главная,Объекты

выдает "ADOQuery1: Field 'Адрес' not found"
где Наименование из ADOTable1('Главная')
Дата5 из ADOTable2('Объекты').
Подскажите пожалуйста как правильно построить запрос,
чтобы выборка была по конкретным полям таблиц.
3.Когда в ADOQuery1 внесены поля из обоих таблиц он перестает корректно выполнять запрос по одной таблице.то есть на запрос
 
Код:
select *
   from Главная

выдает ADOQuery1: Field 'Главная.key1' not found
и как же в таком случае делать запрос только по одной таблице?

Заранее спасибо
14
21 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Поля удали из ADOQuery1 все которые добавил
32K
21 августа 2008 года
kopernik21187
31 / / 13.07.2008
Цитата: Phodopus
Поля удали из ADOQuery1 все которые добавил


Ну это я пробовал!!!и каждый раз их добавлять и удалять?

14
21 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Зачем? Не использовать их вообще! Динамически гуляй, динамически. Есть такое замечательное свойство .Fields у каждого DataSet-а
32K
22 августа 2008 года
kopernik21187
31 / / 13.07.2008
вот код:
Код:
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;

этот код рабочий,но есть некоторые но:
1.Динамически обращаться к свойствам полей можно только если они добавлены в ADOQuery1,а если нету то при обращении к строкам DataModule2.ADOQuery1.FieldByName('Наименование').DisplayWidth:=20 и т.д.
выдается выдается Field 'Наименование' not found. Если же все поля добавлены в ADOQuery то код работает.
Но в этом случае порядок расположения полей будеи оставаться статичным как это задано в ADOQuery...А мне для каждого значения
radiogroup1.ItemIndex в запросах нужно делать разный порядок для
Дата5,Дата6,Дата7,Дата8,Дата9. В принципе так и делаю, но только когда в ADOQUery не добавлены поля,но в этом случае нельзя обращаться к FieldByName('')....
Как же сделать чтобы и порядок расположения полей можно было менять и динамически обращаться к свойствам полей через FieldByName?:(:confused:
14
22 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Ну во-первых ты не запустил запрос ПЕРЕД обращением к методу .FieldByName, во-вторых сказали же, гуляй по свойству .Fields у DataSet-а если набор полей меняется (хотя у тебя в приведенном куске вроде набор один и тот же)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог