|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
SQL запрос - выборка значений
Добрый день!
Существует база, в которой есть множество таблиц. 2-е из них - таблицы Областей и Городов. Нужно что бы при выборе Области в 1-м ComboBox-е, в другом появлялись Города, соответствующие только этой области. В событии OnChange 1-го ComboBox-а пишу: Код:
procedure TFormPacient.OblastChange(Sender: TObject); var IDObl:Integer; begin IDOblast.itemIndex:=Oblast.ItemIndex; IDObl:=StrToInt(IDOblast.Text); PacientCity.active:=true; IDCity.clear; City.clear; if not PacientCity.isEmpty then begin PacientCity.First; repeat IDCity.items.add(PacientCity.fieldbyname('IdCity').asString); City.items.add(PacientCity.fieldbyname('NCity').asString); PacientCity.next; until PacientCity.eof; IDCity.itemindex:=0; City.itemindex:=0; PacientCity.active:=false; end; end; SQLQuery для выборки городов содержит: Код:
Select IDCity,IDOblast, NCity from City where IDOblast=IDObl order by NCity вот строчка Код:
where IDOblast=IDObl |
#2
|
||||
|
||||
проблема решается без одной строчки кода, при условии если есть поле по которому можно связать две таблицы (один ко многим)!
Если есть то: 1. Связываешь эти таблицы 2. Добавляешь на форму DBLookupComboBox(вкладка Data controls) 3. в свойстве ListSources выбираешь соурс регионов, в listfild выбираешь поле названия региона, а в keyfild индексное поле. И вуоля, автоматика!!!! |
#3
|
||||
|
||||
Именно - две таблицы, если на втором месте оставите запрос, то его связать не получится
|
#4
|
|||
|
|||
Что-то я не совсем понял...
НАпрмиер у меня на форме 4 ComboBox-a. В 1 название Обалстей, во-втором их ID. В 3 - Названия городов, а в 4 - ID этих городов. Так вот нужно, что бы при выборе Области в 1 CB, для 3 CB сформировался (отфильровался) список городов по ID (из 2 CB). |
#5
|
|||
|
|||
вам же уже ответил Pilot_Red, почитайте в инете про MasterSource и MasterFields у компонентов TTable (TQuery) или какие вы там используете компоненты для доступа к таблицам.
взялся из неоткуда, ничего не прошу, помогаю просто так ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя |
#6
|
|||
|
|||
Сделал все, как сказал Pilot_Red, но чего-то не получилось. Получается у меня должны быть зависимость (фильтр) в таблице Города от ID Области. Соответственно должна быть произведена выборка по ID. А получается, что у компонента DBLookupComboBox нет связи с ComboBox-ом...
|
#7
|
|||
|
|||
Один из вариантов решения задачки.
Нет нужды применять два комбобокса (один для текста, другой для идентификатора). ID может храниться в том же комбобоксе что и текст. Код:
procedure TFormPacient.OblastChange(Sender: TObject); var IDObl:Integer; begin IDOblast.itemIndex:=Oblast.ItemIndex; IDObl:=StrToInt(IDOblast.Text); PacientCity.Open; City.clear; PacientCity.First; while not PacientCity.Eof do begin City.AddItem(PacientCity.FieldValues['NCity'], TObject(PacientCity.FieldValues['IDCity'])); PacientCity.next; end; City.itemindex:=0; PacientCity.Close; end; //получения сохраненного значения ID: // if City.ItemIndex > -1 then // IDCity := Integer(City.Items.Objects[City.ItemIndex]); Код:
'where IDOblast='+IntToStr(IDObl) Код:
select IDCity,IDOblast, NCity from City where IDOblast = :IDObl order by NCity Код:
DS.ParamByName('IDObl').Value := IDObl; //имена параметров и переменных не обязательно должны совпадать Последний раз редактировалось Vocabulary, 27.04.2011 в 07:47. |
#8
|
|||
|
|||
Вот здорово, буду пробовать!
|