|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Динамический запрос
Всем привет!
Нужна помощь в создании динамического запроса. Имеется БД (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
|
||||
|
||||
Цитата:
Код:
sql:= '"SELECT * FROM power WHERE [Модель] =' + Form.DBLookupComboBox1.Text + '"'; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Провал.
DB-компоненты созданы для связывания вашего DataSet'а c вашими глазами. Связь происходит (чтоб было понятнее) с ячейкой, пренадлежащией активной строке. А вы пытаетесь использовать DBLockUpComboBox для "фильтрации". При изменении значения в этом боксе изменится значение и в DataSet'e. Нужен обычный ComboBox. Его Lines заполняются запросом вида Код:
Select Distinct(колонка) From ваша_база.ваша таблица После чего используется запрос, который вам привели выше. |
#4
|
||||
|
||||
Я правельно понял? Нужно в свойствах ComboBox в Items прописать этот запрос - Select Distinct (Мощностной режим) speakers.power
Далее запрос SQL как было сказано выше Попробовал теперь выдаёт ошибку - "Ошибочная инструкция SQL" |
#5
|
||||
|
||||
Нет, в Items вы должны записать результат запроса.
У вас какая БД и через какие компоненты реализуется подключение к БД? |
#6
|
||||
|
||||
БД сделана в Access, подключается через ADOConnection и DataSource
|
#7
|
||||
|
||||
ну вот ADOQuery вытаскиваем на форму, привязываем к ADOConnection
В SQL свойство ADOQuery прописываем мой вопрос. пробегаем циклом заполняя ComboBox Код:
ADOQuery1.Open; while not ADOQuery1.EOF do begin ComboBox1.Items.Add(ADOQyery1.FieldByName('').AsString); ADOQuery1.Next; end; |
#8
|
||||
|
||||
Не выходит
Короче иду учить мат. часть ... Всем спасибо за участие ... |
#9
|
||||
|
||||
Я налажал (болею):
Код:
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
|
||||
|
||||
Ещё раз обрисую задачу.
Мне нужно что бы при выборе определенного значения из всплывающего списка 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
|
|||
|
|||
Для начала:
Код:
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
|
|||
|
|||
Цитата:
|
#13
|
||||
|
||||
Теперь запрос на обновление другого списка будет собираться так:
Код:
sql:= 'SELECT * FROM power WHERE [Модель] =' + IntToStr(Integer(Form1.ComboBox1.Items.Object[ComboBox1.ItemIndex])); |
#14
|
||||
|
||||
Убери его с глаз моих. Он там не нужен этот Obj
|
#15
|
|||
|
|||
Цитата:
А самому посмотреть. Просто одна буква не пропечаталась. Д.б. Objects. Я понимаю, это так тяжело встать курсором на проблеммное слово и нажать Ctrl+Enter... |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Homo-Fantasmus (18.10.2013)
|