Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.10.2013, 01:45
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию Динамический запрос

Всем привет!

Нужна помощь в создании динамического запроса.

Имеется БД (Access) c двумя таблицами.
Имеется Form1 c ADOConnection, DataSource, ADOQuery2, DBLookupComboBox1и DBLookupComboBox2
Требуется чтобы по выбору какого-то значения из DBLookupComboBox1 формировался динамический запрос для последующего вывода данных в DBLookupComboBox2.
Как я это пытался сделать:
Код:
procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin

ADOQuery2.Close;
ADOQuery2.SQL.Clear;

sql:= 'SELECT * FROM power WHERE [Модель] = Form.DBLookupComboBox1.Text';

ADOQuery2.SQL.Add(sql);
ADOQuery2.Open;
DBLookupComboBox2.KeyValue := DBLookupComboBox2.ListSource.DataSet.FieldByName(DBLookupComboBox2.KeyField).Value; 
DBLookupComboBox2.Refresh;
end;


end.

При запуске компилятора и выборе в DBLookupComboBox1 любого значения появляется ошибка: "... Параметр DBLookupComboBox1 не имеет значения по умолчанию..."

Где я накосячил ?

Последний раз редактировалось lmikle, 13.10.2013 в 03:13.
  #2  
Старый 13.10.2013, 01:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Homo-Fantasmus
...
sql:= 'SELECT * FROM power WHERE [Модель] = Form.DBLookupComboBox1.Text';
...
Вот это что значит? Наверное имелось ввиду так
Код:
sql:= '"SELECT * FROM power WHERE [Модель] =' + Form.DBLookupComboBox1.Text + '"';
  #3  
Старый 13.10.2013, 20:04
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Провал.

DB-компоненты созданы для связывания вашего DataSet'а c вашими глазами.
Связь происходит (чтоб было понятнее) с ячейкой, пренадлежащией активной строке.

А вы пытаетесь использовать DBLockUpComboBox для "фильтрации". При изменении значения в этом боксе изменится значение и в DataSet'e.

Нужен обычный ComboBox. Его Lines заполняются запросом вида
Код:
Select Distinct(колонка) From ваша_база.ваша таблица

После чего используется запрос, который вам привели выше.
  #4  
Старый 13.10.2013, 21:09
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Я правельно понял? Нужно в свойствах ComboBox в Items прописать этот запрос - Select Distinct (Мощностной режим) speakers.power
Далее запрос SQL как было сказано выше

Попробовал теперь выдаёт ошибку - "Ошибочная инструкция SQL"
  #5  
Старый 13.10.2013, 21:17
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Нет, в Items вы должны записать результат запроса.
У вас какая БД и через какие компоненты реализуется подключение к БД?
  #6  
Старый 13.10.2013, 21:25
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

БД сделана в Access, подключается через ADOConnection и DataSource
  #7  
Старый 13.10.2013, 21:41
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

ну вот ADOQuery вытаскиваем на форму, привязываем к ADOConnection
В SQL свойство ADOQuery прописываем мой вопрос.

пробегаем циклом заполняя ComboBox
Код:
ADOQuery1.Open;
while not ADOQuery1.EOF do
 begin
  ComboBox1.Items.Add(ADOQyery1.FieldByName('').AsString);
  ADOQuery1.Next;
 end;
  #8  
Старый 13.10.2013, 21:54
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Не выходит
Короче иду учить мат. часть ...
Всем спасибо за участие ...
  #9  
Старый 13.10.2013, 22:25
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Я налажал (болею):
Код:
Select Distinct(Колнка_по_которой_идёт_выбрка) AD DistVar From ваша_база.вааш_таблица

Далее в коде на кнопку:
ADOQuery1.Open;
while not ADOQuery1.EOF do
begin
ComboBox1.Items.Add(ADOQyery1.FieldByName('DistVar ').AsString);
ADOQuery1.Next;
end;

Далее выбираем параметр и шлём запрос:

Код:
procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin
 
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
 
sql:= 'SELECT * FROM power WHERE [Модель] = ' + QutedStr(ComboBox1.Text);
 
ADOQuery2.SQL.Add(sql);
ADOQuery2.Open;
end;

Вроде всё. Я бы реализовывал не так. Но с учётом недостатка знаний, не стал менять ваш код.
  #10  
Старый 16.10.2013, 01:02
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Ещё раз обрисую задачу.

Мне нужно что бы при выборе определенного значения из всплывающего списка DBLookupComboBox1 в DBLookupComboBox2 выводился результат выборки динамического запроса.



Вот что имеется на форме:



БД сделана в Access, имеются 2 таблицы: Speaker и Power:



Как я думаю решать эту задачу:
1) при выборе определенного значения из всплывающего списка DBLookupComboBox1 должен автоматически создаваться динамический запрос SQL по которому происходила бы выборка из связанных таблиц.

2) Далее результат выборки нужно визуально представить с помощью какого ни будь визуального компонента например DBLookupComboBox2

Вот кусок кода:

Код:
procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin

Edit5.Text := DBLookupComboBox1.ListSource.DataSet.FieldByName(DBLookupComboBox1.KeyField).Value;
//Присваевает Edit5 значение чувствительности выбранной модели оповещателя

ADOQuery2.Close;
ADOQuery2.SQL.Clear;
sql:= '"SELECT * FROM power WHERE [Модель] =' + Form1.DBLookupComboBox1.Text + '"';
ADOQuery2.SQL.Add(sql);

ADOQuery2.Open;
DBLookupComboBox2.KeyValue := DBLookupComboBox2.ListSource.DataSet.FieldByName(DBLookupComboBox2.KeyField).Value;
DBLookupComboBox2.Refresh;

end;

 end.

При компиляции появляется сообщение об ошибке:



В общем нужна помощь уважаемые форумчане ...
  #11  
Старый 16.10.2013, 07:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Для начала:
Код:
sql:= '"SELECT * FROM power WHERE [Модель] =' + Form1.DBLookupComboBox1.Text + '"';
Это действительно неверная конструкция. Правильно, синтаксически, будет как-то так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =''' + Form1.DBLookupComboBox1.Text + '''';
Все кавычки одинарные.

Теперь надо выверять логику.
Скорее всего, из справочника выбирается 2 поля: Код и Модель. Модель показывается как текст, а внутри сидит еще и Код. Вот с кодом, скорее всего, и надо будет связывать вторую таблицу.

Кстати, если данные в этом списке не влияют ни на что, кроме фильтрации другого списка, то можно обойтись обычным ComboBox. Т.е. при открытии формы (или программы, если справочник в процессе ее работы не меняется, да и если меняется, то всегда можно работать через тот же запрос или просто его обновить) делаем так:
Код:
..
ADOQuery1 : TADOQuery; // Наш запрос на выборку справочника. Там внутри SELECT * FROM...
..
procedure TForm1.FormCreate(Sender : TObject);
begin
  ComboBox1.Items.Clear;
  ADOQuery1.First;
  While Not ADOQuery1.Eof Do
    Begin
       ComboBox1.Items.AddObject(ADOQuery1.FieldByName('Модель').AsString,TObject(ADOQuery1.FieldByName('Код').AsInteger));
       ADOQuery1.Next;
    End;
end;

Кстати, ComboBox1 надо сделать DropDownList (вроде так).
Теперь запрос на обновление другого списка будет собираться так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =' + IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex]));
ЗЫ. Вроде нигде со скобками не ошибся.
  #12  
Старый 16.10.2013, 07:07
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от lmikle
Для начала:
Код:
sql:= '"SELECT * FROM power WHERE [Модель] =' + Form1.DBLookupComboBox1.Text + '"';
Это действительно неверная конструкция. Правильно, синтаксически, будет как-то так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =''' + Form1.DBLookupComboBox1.Text + '''';
Все кавычки одинарные.

Теперь надо выверять логику.
Скорее всего, из справочника выбирается 2 поля: Код и Модель. Модель показывается как текст, а внутри сидит еще и Код. Вот с кодом, скорее всего, и надо будет связывать вторую таблицу.

Кстати, если данные в этом списке не влияют ни на что, кроме фильтрации другого списка, то можно обойтись обычным ComboBox. Т.е. при открытии формы (или программы, если справочник в процессе ее работы не меняется, да и если меняется, то всегда можно работать через тот же запрос или просто его обновить) делаем так:
Код:
..
ADOQuery1 : TADOQuery; // Наш запрос на выборку справочника. Там внутри SELECT * FROM...
..
procedure TForm1.FormCreate(Sender : TObject);
begin
  ComboBox1.Items.Clear;
  ADOQuery1.First;
  While Not ADOQuery1.Eof Do
    Begin
       ComboBox1.Items.AddObject(ADOQuery1.FieldByName('Модель').AsString,TObject(ADOQuery1.FieldByName('Код').AsInteger));
       ADOQuery1.Next;
    End;
end;

Кстати, ComboBox1 надо сделать DropDownList (вроде так).
Теперь запрос на обновление другого списка будет собираться так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =' + IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex]));
ЗЫ. Вроде нигде со скобками не ошибся.
ЗЗЫ. Да, и в таблице Speaker надо вместо Модель сделать целочисленное поле КодМодели с связывать таблицы по нему. Читаем про нормальные формы в реляционных СУБД.
  #13  
Старый 16.10.2013, 21:43
Аватар для Homo-Fantasmus
Homo-Fantasmus Homo-Fantasmus вне форума
Прохожий
 
Регистрация: 23.08.2011
Адрес: МО
Сообщения: 46
Версия Delphi: Delphi, Lazarus
Репутация: 10
По умолчанию

Теперь запрос на обновление другого списка будет собираться так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =' + IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex]));
Здесь ошибка подчёркивает Object, что-то с конструкцией ... IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex]));
  #14  
Старый 16.10.2013, 22:45
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Убери его с глаз моих. Он там не нужен этот Obj
  #15  
Старый 17.10.2013, 04:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Homo-Fantasmus
Теперь запрос на обновление другого списка будет собираться так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =' + IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex]));
Здесь ошибка подчёркивает Object, что-то с конструкцией ... IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex]));

А самому посмотреть. Просто одна буква не пропечаталась. Д.б. Objects.
Я понимаю, это так тяжело встать курсором на проблеммное слово и нажать Ctrl+Enter...
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Homo-Fantasmus (18.10.2013)
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter