Пятница, 03.05.2024, 08:02
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

Меню сайта
Категории раздела
Delphi [12]
Материалы, связанные с программирование на Delphi
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


















Тиц
Главная » 2011 » Ноябрь » 14 » Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.
18:30
Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.
Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

           При проектировании базы  данных  довольно часто приходится предусматривать возможность ввода в базу различных адресов (например: адрес места жительства, адрес предприятия и т.д.). В сегодняшнем посту я хочу познакомить вас с классификатором адресов России (КЛАДР). Последнюю версию базы данных КЛАДР можно скачать с сайта федеральной налоговой службы России http://www.gnivc.ru/inf_provision/classifiers_reference/kladr/. База поставляется в виде архива с файлами в формате dbf.
           В этой статье мы научимся  конвертировать базу КЛАДР из формата dbf в формат файлов Microsoft Access 2003 – 2007. И с помощью Delphi подключаться к этой базе и выбирать нужный нам адрес.

И  так приступим…

Скачиваем базу КЛАДР с выше указанного адреса, распаковываем.

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.
Запускаем Microsoft Access. Выбираем открыть. Тип файлов -> все файлы,

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

выбираем файл STREET.DBF и нажимаем открыть. Затем снова выбираем открыть. Тип файлов -> все файлы и выбираем следующий файл  DBF. И так делаем со всеми файлами и закрываем MS Access. Если вы все сделали правильно то в папке с КЛАДР должны появится следующие файлы в формате MS Access:

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

        Сейчас двойным кликом мыши открываем файл STREET.accdb. Затем запускаем еще одну копию MS Access. В ней выбираем Создать:

Работаем с базой данных КЛАДР (классификатор адресов России) из Delphi.

указываем путь и задаем имя файла kladr.mdb и жмем кнопку создать. В открывшемся окне удаляем Таблицу1 и перетаскиваем в него нашу таблицу STREET.accdb  из уже запущенного MS Access.

В этой статье мы научимся конвертировать базу КЛАДР из формата dbf в формат файлов Microsoft Access 2003 – 2007.

       Затем не закрывая нашу базу kladr.mdb мы последовательно открываем все файлы с расширением accdb и перетаскиваем их в базу kladr.mdb. В итоге должно получиться следующее:

В этой статье мы научимся конвертировать базу КЛАДР из формата dbf в формат файлов Microsoft Access 2003 – 2007.

Закрываем базу кладр.

       Сейчас немного о структуре самого КЛАДР.
Классификатор оформлен в виде следующих DBF-файлов: 
файл Kladr.dbf – содержит записи с объектами первых четырех уровней классификации (регионы; районы (улусы); города, поселки городского типа, сельсоветы; сельские населенные пункты);
Структура кодового обозначения в блоке "Код":
СС РРР ГГГ ППП АА, где
СС – код субъекта Российской Федерации (региона), коды регионов представлены в Приложении 2 к Описанию классификатора адресов Российской Федерации (КЛАДР);
РРР – код района;
ГГГ – код города;     
ППП – код населенного пункта,
АА – признак актуальности адресного объекта.

Признак актуальности может принимать следующие значения:
            "00” – актуальный объект (его наименование, подчиненность соответствуют состоянию на данный момент адресного пространства).
            "01”-"50” – объект был переименован, в данной записи приведено одно из прежних его наименований (актуальный адресный объект присутствует в базе данных с тем же кодом, но с признаком актуальности "00”;
            "51” –  объект был переподчинен или влился в состав другого объекта (актуальный адресный объект определяется по базе Altnames.dbf);
            "52”-"98” – резервные значения признака актуальности;
            ”99” – адресный объект не существует, т.е. нет соответствующего ему актуального адресного объекта.
файл Street.dbf – содержит записи с объектами пятого уровня классификации (улицы городов и населенных пунктов);
Структура кодового обозначения в блоке "Код":
СС РРР ГГГ ППП УУУУ АА, где
СС – код субъекта Российской Федерации (региона), коды регионов представлены в Приложении 2 к Описанию классификатора адресов Российской Федерации (КЛАДР);
РРР – код района;
ГГГ – код города;     
ППП – код населенного пункта;   
УУУУ – код улицы;
АА – признак актуальности наименования адресного объекта.

файл Doma.dbf – содержит записи с объектами шестого уровня классификации (номера домов улиц городов и населенных пунктов);
файл Flat.dbf – содержит записи с объектами седьмого уровня классификации (номера квартир домов);
файл Socrbase.dbf – содержит записи с краткими наименованиями типов адресных объектов;
файл Altnames.dbf –содержит сведения о соответствии кодов записей со старыми и новыми наименованиями адресных объектов, а также сведения о соответствии кодов адресных объектов до и после их переподчинения.
Более подробно у структуре классификатора можно узнать из справки, которая поставляется вместе с ним.

      А сейчас приступим к написанию простейшего приложения, которое позволит сформировать интересующий нас адрес.
Запустим Delphi и создадим новое приложение. Создадим папку и сохраним в нее наше приложение. Скопируем в эту папку наш созданный в MS Access файл kladr.mdb.

 Далее приступим к созданию формы:





Разместим на форме следующие компоненты:
- Четыре компонента TDBLookupComboBox;
- Три компонента TEdit;
- Четыре компонента TADOQuery;
- Четыре компонента TDataSource;
- Компонент TADOConnection;
и шесть компонентов TLabel.
Все компоненты разместим и переименуем, как показано на рисунке.

Далее сделаем подключение через компонент ADOConnectio1 к нашей базе kladr.mdb. Для этого выберем свойство ConnectionString в открывшемся окне выберем Build…--> затем Microsoft Jet 4.0 OLE DB Provider --> затем далее и в открывшемся окне:

Далее сделаем подключение через компонент ADOConnectio1 к нашей базе.

выбираем путь к нашей базе (затем путь можно удалить и оставить только имя 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 .



Категория: Delphi | Просмотров: 39688 | Добавил: xaramamburu | Теги: MS Access, ADOConnection, КЛАДР | Рейтинг: 4.5/2
Всего комментариев: 9
8 alex2008  
0
Интересен не синтаксис "Дельфи", синтаксис "Дельфи" можно посмотреть в самом "Дельфи", кому интересно. Интересна связь между СС РРР ГГГ ППП АА.  Повидимому афтору недают покоя лавры Льва Толстого. Набрать 3 строчки не его стиль. Проще  разбираться самому.

9 xaramamburu  
0
Вы это к чему? Синтаксис  здесь на уровне 8 класса школьного курса информатики. Все остальное это работа со свойствами конкретных компонент + SQL запросы. Переписывать большие толстые книги по работе с компонентами ADO я не собирался их и без меня хватает, а как писать SQL запросы к Delphi отношение не имеет. Вот именно  СС РРР ГГГ ППП АА и как с ней можно работать, с моей точки зрения интереснее всего.))))

6 Юра  
0
а лучше сделать свой перекодировщик.... надо разделить регионы и города по разным таблицам. трехуровневое дерево получится... больше возможностей

5 Юра  
0
Сильно тормозит... нужно проиндексировать поля или добавить ключевое поле

7 xaramamburu  
0
Согласен с вами. Но цель этой статьи, дать общее представление о структуре базы КЛАДР и о том как с ней можно работать. Далее каждый может поступить по своему. Кто то удаляет все не актуальные объекты, кто то удаляет не нужные регионы, а кто то пытается преобразовать ее структуру под свои нужды.)))

4 Ramzes  
0
Кстати здесь лежит всегда свежая версия КЛАДР.

http://kladr.ws/download

2 Илья  
0
Поработал с этой базой, и скажу, что в этом примере не учтено, что город и населенный пункт могут не входить в район =)
Запустив программу не смог найти по ней свой город.

3 xaramamburu  
0
Спасибо, попробую исправить.)))

1 Илья  
0
Огромное спасибо! очень полезная статья.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Календарь
«  Ноябрь 2011  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
282930
Архив записей
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 586
Уголок общения



Copyright MyCorp © 2024Конструктор сайтов - uCoz