![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Добрый день!
Существует база, в которой есть множество таблиц. 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) или какие вы там используете компоненты для доступа к таблицам.
|
|
#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
|
|||
|
|||
|
Вот здорово, буду пробовать!
|