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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.04.2011, 19:13
Justin Justin вне форума
Прохожий
 
Регистрация: 16.12.2008
Сообщения: 29
Репутация: 10
По умолчанию 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  
Старый 03.04.2011, 20:15
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

проблема решается без одной строчки кода, при условии если есть поле по которому можно связать две таблицы (один ко многим)!
Если есть то:
1. Связываешь эти таблицы
2. Добавляешь на форму DBLookupComboBox(вкладка Data controls)
3. в свойстве ListSources выбираешь соурс регионов, в listfild выбираешь поле названия региона, а в keyfild индексное поле.
И вуоля, автоматика!!!!
Ответить с цитированием
  #3  
Старый 04.04.2011, 16:25
Аватар для vs259
vs259 vs259 вне форума
Прохожий
 
Регистрация: 04.04.2011
Адрес: Москва
Сообщения: 7
Версия Delphi: BDS2006
Репутация: 10
По умолчанию

Именно - две таблицы, если на втором месте оставите запрос, то его связать не получится
Ответить с цитированием
  #4  
Старый 25.04.2011, 10:44
Justin Justin вне форума
Прохожий
 
Регистрация: 16.12.2008
Сообщения: 29
Репутация: 10
По умолчанию

Что-то я не совсем понял...
НАпрмиер у меня на форме 4 ComboBox-a. В 1 название Обалстей, во-втором их ID. В 3 - Названия городов, а в 4 - ID этих городов.
Так вот нужно, что бы при выборе Области в 1 CB, для 3 CB сформировался (отфильровался) список городов по ID (из 2 CB).
Ответить с цитированием
  #5  
Старый 25.04.2011, 10:56
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

вам же уже ответил Pilot_Red, почитайте в инете про MasterSource и MasterFields у компонентов TTable (TQuery) или какие вы там используете компоненты для доступа к таблицам.
__________________
взялся из неоткуда, ничего не прошу, помогаю просто так
ICQ: 593977748 - стучать в случае КРАЙНЕЙ необходимости, ну, или если вы со Ставрополя
Ответить с цитированием
  #6  
Старый 25.04.2011, 14:36
Justin Justin вне форума
Прохожий
 
Регистрация: 16.12.2008
Сообщения: 29
Репутация: 10
По умолчанию

Сделал все, как сказал Pilot_Red, но чего-то не получилось. Получается у меня должны быть зависимость (фильтр) в таблице Города от ID Области. Соответственно должна быть произведена выборка по ID. А получается, что у компонента DBLookupComboBox нет связи с ComboBox-ом...
Ответить с цитированием
  #7  
Старый 27.04.2011, 07:36
Vocabulary Vocabulary вне форума
Новичок
 
Регистрация: 17.09.2009
Сообщения: 85
Репутация: 9
По умолчанию

Один из вариантов решения задачки.
Нет нужды применять два комбобокса (один для текста, другой для идентификатора). 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]);
Если IDObl переменная целого типа (Integer), то ее значение в запросе необходимо конвертировать в строку (SQL запрос - это текст)
Код:
'where IDOblast='+IntToStr(IDObl)
Если запрос сформирован в редакторе, то 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  
Старый 05.05.2011, 20:36
Justin Justin вне форума
Прохожий
 
Регистрация: 16.12.2008
Сообщения: 29
Репутация: 10
По умолчанию

Вот здорово, буду пробовать!
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter