выбираем путь к нашей базе (затем путь можно удалить и оставить только имя
kladr.mdb, чтобы убрать привязку к конкретному пути). Жмем
ОК. Затем свойство
LoginPrompt устанавливаем
False, свойство
Connected ->True.
На этом подключение закончено. Переходим к настройке других компонентов. Выбираем компонент
region_source и свойство
DataSet --> kladr_region. Выбираем компонент
kladr_region и свойство
Connection устанавливаем
ADOConnection1. В свойство
SQL-> TStrings…-> пишем следующий запрос:
SELECT *
FROM KLADR
WHERE (((KLADR.CODE) Like '__000000000__'));В этом запросе я выбираю из таблицы
kladr все поля по условию
Like '__000000000__' для поля
CODE. В команде
Like '__000000000__',
_ обозначает произвольный символ. Поэтому мы ищем произвольный код субъекта федерации (первые два символа кода) и произвольный признак актуальности (последние два символа).
Свойство
Active устанавливаем
True.
Затем переходим к настройке компонента
DBLookupComboBox1. Свойство
ListSource -> region_source, свойство
ListField-> NAME;SOCR свойство
KeyField->CODE.
Для события
OnCloseUp пишем следующий код:
procedure TForm1.DBLookupComboBox1CloseUp(Sender: TObject);
begin
//формируем запрос с параметрами на выбор районаstreet.Active:=false;
//выключаем запросkladr_gorod.Active:=false;
//выключаем запросkladr_raion.Active:=false;
//выключаем запросkladr_raion.SQL.Clear;
//очищаем запросkladr_raion.Parameters.AddParameter.Name:='a';
//добавляем параметр 'a'kladr_raion.Parameters.ParamByName('a').DataType:=ftWideString;
//задаем тип параметраkladr_raion.Parameters.AddParameter.Name:='b';
// добавляем параметр 'b'kladr_raion.Parameters.ParamByName('b').DataType:=ftWideString;
//задаем тип параметраkladr_raion.Parameters.AddParameter.Name:='c';
// добавляем параметр 'c'kladr_raion.Parameters.ParamByName('c').DataType:=ftWideString;
//задаем тип параметра//формируем запросkladr_raion.SQL.Add('SELECT *');
kladr_raion.SQL.Add('FROM KLADR');
kladr_raion.SQL.Add('WHERE (((KLADR.CODE Like :a Or KLADR.CODE Like :c)) And Not ((KLADR.CODE) Like :b));');
//в параметре 'а' выбираем по коду региона все районыkladr_raion.Parameters.ParamByName('a').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,2)+'___000000__';
//параметр 'b' нужен для исключения из списка самого регионаkladr_raion.Parameters.ParamByName('b').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,2)+'000000000__';
//параметр 'c' нужен для выбора городов и населенных пунктов не входящих в районыkladr_raion.Parameters.ParamByName('c').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,2)+'000________';
//активируем запросkladr_raion.Active:=true;
//формируем запрос с параметрами на выбор названия улицыstreet.Active:=false;
street.SQL.Clear;
street.Parameters.AddParameter.Name:='a';
street.Parameters.ParamByName('a').DataType:=ftWideString;
street.SQL.Add('SELECT *');
street.SQL.Add('FROM STREET');
street.SQL.Add('WHERE (((STREET.CODE) Like :a));');
//в параметре 'а' выбираем по коду населенного пункта все улицы в немstreet.Parameters.ParamByName('a').Value:=copy(region_source.DataSet.FieldByName('CODE').Value,1,11)+'______';
//активируем запросstreet.Active:=true;
end;
Выбираем компонент
raion_source и свойство
DataSet --> kladr_raion. Выбираем компонент
kladr_raion и свойство
Connection устанавливаем
ADOConnection1.Затем переходим к настройке компонента
DBLookupComboBox2. Свойство
ListSource -> raion _source, свойство
ListField-> NAME;SOCR свойство
KeyField->CODE.Для события
OnCloseUp пишем следующий код:
procedure TForm1.DBLookupComboBox2CloseUp(Sender: TObject);
begin
street.Active:=false;
kladr_gorod.Active:=false;
//проверяем, если был выбран не город (населенный пункт),
//то формируем запрос на выбор населенного пунктаif copy(raion_source.DataSet.FieldByName('CODE').Value,3,3)<>'000' then
begin
//формируем запрос с параметрами на выбор населенного пунктаkladr_gorod.SQL.Clear;
kladr_gorod.Parameters.AddParameter.Name:='a';
kladr_gorod.Parameters.ParamByName('a').DataType:=ftWideString;
kladr_gorod.Parameters.AddParameter.Name:='b';
kladr_gorod.Parameters.ParamByName('b').DataType:=ftWideString;
kladr_gorod.SQL.Add('SELECT *');
kladr_gorod.SQL.Add('FROM KLADR');
kladr_gorod.SQL.Add('WHERE ((KLADR.CODE Like :a And Not ((KLADR.CODE) Like :b)));');
//в параметре 'а' выбираем по коду района все населенные пунктыkladr_gorod.Parameters.ParamByName('a').Value:=copy(raion_source.DataSet.FieldByName('CODE').Value,1,5)+'________';
//параметр 'b' нужен для исключения из списка самого районаkladr_gorod.Parameters.ParamByName('b').Value:=copy(raion_source.DataSet.FieldByName('CODE').Value,1,5)+'000000__';
//активируем запросkladr_gorod.Active:=true;
end;
//формируем запрос с параметрами на выбор названия улицыstreet.Active:=false;
street.SQL.Clear;
street.Parameters.AddParameter.Name:='a';
street.Parameters.ParamByName('a').DataType:=ftWideString;
street.SQL.Add('SELECT *');
street.SQL.Add('FROM STREET');
street.SQL.Add('WHERE (((STREET.CODE) Like :a));');
//в параметре 'а' выбираем по коду населенного пункта все улицы в немstreet.Parameters.ParamByName('a').Value:=copy(raion_source.DataSet.FieldByName('CODE').Value,1,11)+'______';
//активируем запросstreet.Active:=true;
end;
Выбираем компонент
gorod_source и свойство
DataSet --> kladr_gorod. Выбираем компонент
kladr_gorod и свойство
Connection устанавливаем
ADOConnection1.Затем переходим к настройке компонента
DBLookupComboBox3. Свойство
ListSource-> gorod_source, свойство
ListField-> NAME;SOCR свойство
KeyField->CODE.Для события
OnCloseUp пишем следующий код:
procedure TForm1.DBLookupComboBox3CloseUp(Sender: TObject);
begin//формируем запрос с параметрами на выбор названия улицыstreet.Active:=false;
street.SQL.Clear;
street.Parameters.AddParameter.Name:='a';
street.Parameters.ParamByName('a').DataType:=ftWideString;
street.SQL.Add('SELECT *');
street.SQL.Add('FROM STREET');
street.SQL.Add('WHERE (((STREET.CODE) Like :a));');
//в параметре 'а' выбираем по коду населенного пункта все улицы в немstreet.Parameters.ParamByName('a').Value:= copy(gorod_source.DataSet.FieldByName('CODE').Value,1,11)+ '______';
street.Active:=true;
end; Выбираем компонент street_source и свойство
DataSet --> street. Выбираем компонент
street и свойство
Connection устанавливаем
ADOConnection1.Затем переходим к настройке компонента
DBLookupComboBox4. Свойство
ListSource ->street_source, свойство
ListField-> NAME;SOCR свойство
KeyField->CODE. К сожалению, работать с номерами домов на много сложнее, поэтому их быстрее забить руками.
Для увеличения скорости обработки запросов базу
КЛАДР можно почистить, например удалить все не актуальные объекты (
признак актуальности в коде не
равен 00) и т.д.
Данный код предназначен лишь для демонстрации составления запросов для выбора адресов из базы КЛАДР. В полне возможно, что я мог что то упустить т.к. структура КЛАДР довольно сложная и учесть все нюансы в рамках небольшого примера практически невозможно.
Скачать исходники к статье можно здесь.
Автор статьи xaramamburu, сайт автора http://basicsprog.ucoz.ru .