unit kladr;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, DBCtrls, Grids, DBGrids, StdCtrls, Mask, ExtCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    region_source: TDataSource;
    DBLookupComboBox1: TDBLookupComboBox;
    kladr_region: TADOQuery;
    Label1: TLabel;
    DBLookupComboBox2: TDBLookupComboBox;
    kladr_raion: TADOQuery;
    raion_source: TDataSource;
    Label2: TLabel;
    DBLookupComboBox3: TDBLookupComboBox;
    Label3: TLabel;
    kladr_gorod: TADOQuery;
    gorod_source: TDataSource;
    street: TADOQuery;
    street_source: TDataSource;
    DBLookupComboBox4: TDBLookupComboBox;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure DBLookupComboBox1CloseUp(Sender: TObject);
    procedure DBLookupComboBox2CloseUp(Sender: TObject);
    procedure DBLookupComboBox3CloseUp(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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'; // добавляем параметр 'b'
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;

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;

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;

end.
