Различные способы импорта КЛАДРа в систему "Парус-8"
Способ №1: предложен здесь . ИСПОЛЬЗУЕТСЯ ПОЛЕ ОКАТО не поназначению. туда вкачиваются коды по ГНИ и по нему ведется структурирование. DBF-ки street kladr из инсталяшки "Налогоплательщик" www.nalogy.ru опробовано на М и МО. Правда несовсем корректно делаются некоторые подтипы гео.понятий предварительно надо создать новую страну "Россия2" чтобы не портить имеющиеся структуры потом можно просто переместить требуемые регионы в имеющуюся структуру РОССИИ два варианта 1) VBscript+процедура 2) экспорт dbf на сервер Oracle (я делаю через MS ACCESS экспорт на источник ODBC)+ процедура
VBSCRIPT вначале вкачать kladr.dbf потом street.dbf Sub import_Kladr() Set objDlg = CreateObject("MSComDlg.CommonDialog") objDlg.Filter = "kladr.xls|*.xls" objDlg.DialogTitle = "Выберите файл с курсами валют" objDlg.FilterIndex = 1 objDlg.MaxFileSize = 260 objDlg.CancelError = True objDlg.FileName = "kladr.xls" objDlg.ShowOpen strFile = objDlg.FileName sTitle = " - "&objDlg.Filetitle Set objDlg = Nothing Set WshShell = CreateObject("WScript.Shell") If WshShell.AppActivate("Microsoft Excel" & titl) Then Set wBook = GetObject(strFile) xl_q = False Else Set XL = CreateObject("Excel.Application") Set wBook = XL.Workbooks.Open(strFile, 0, true) If wBook Is Nothing Then ' неверно был задан файл MsgBox "Файл не выбран или не является книгой Excel" XL.Quit Set XL = Nothing End If xl_q = True End If set wSheet = wBook.WorkSheets("KLADR") SheetsCount = wBook.WorkSheets.Count msgbox ("Файл: "&sTitle) rowsCount = wSheet.UsedRange.Rows.Count msgbox ("Кол-во строк для импорта: "&RowsCount) nCount = 0 nCount2 = 0 for z=2 to rowsCount strA = wSheet.Cells(z,1).Value strB = wSheet.Cells(z,2).Value strC = wSheet.Cells(z,3).Value strD = wSheet.Cells(z,4).Value strE = wSheet.Cells(z,5).Value strF = wSheet.Cells(z,6).Value if strA empty then StoredProc.StoredProcName = "P_KLADR_IMPORT_NEW" StoredProc.ParamByName("SNAME").Value = strA StoredProc.ParamByName("SSOCR").Value = strB StoredProc.ParamByName("SCODE").Value = strC StoredProc.ParamByName("SINDEX").Value = strE 'strD 'для street StoredProc.ExecProc nCount = nCount + 1 else nCount2 = nCount2 + 1 end if 'if nCount>=200 then ' z = rowsCount 'end if next msgbox ("Из файла: "&sTitle&chr(13)&"Импортировано "&nCount&" строк !"&chr(13)&"Не пересено "&nCount2&" строк !" ) xl.ActiveWorkbook.Close end sub
create or replace procedure find_geografy_by_OKATO ( nCompany number, -- регистрационный номер организации nFlag_smart number default 0, sOKATO varchar2, nRn out number -- регистрационный номер записи ) as nVersion number( 15 ); begin nRn := null; /* определение версии */ find_version_by_company( nCompany,'GEOGRAFY',nVersion ); /* поиск записи */ begin select rn into nRn from geografy g where g.version = nVersion and g.okato = sOKATO and rownum = 1; exception when no_data_found then p_exception(nflag_smart,'географическое понятие по ОКАТО "'||sOKATO||'" не определено.' ); end; end;
create or replace procedure p_Kladr_import_new ( sName varchar2, sSocr varchar2, sCode varchar2, sIndex varchar2 ) is nCompany pkg_std.tRef := 1002; nRnLT pkg_std.tRef; sGeoType localitytype.geographytype%type; nRnGeo pkg_std.tRef; -- вышестоящий уровень для гео.понятия nRnGeo1 pkg_std.tRef; -- Страна nRnGeo2 pkg_std.tRef; begin /* ищем РН для Страна */ parus.find_geografy_by_name ( ncompany => nCompany, sgeogrname => 'Россия2', sgeogrtype => '1', nrn => nRnGeo1 ); if nRnGeo1 is null then p_exception(0,'Не найдена RN для страны "Россия"!!!'); end if; /* вышестоящий уровень для гео.понятия */ nRnGeo := nRnGeo1; if Length(sCode)=13 then /* расщифруем код для определения ТИПа гео.понятия */ if substr(sCode,3,11)='00000000000' then /* Регион */ find_geographytype_name ( nflag_smart => 1, sname => 'Регион', sgeogrtype => sGeoType ); /* вышестоящий уровень для гео.понятия */ nRnGeo := nRnGeo1; else if substr(sCode,6,8)='00000000' then /* Район */ find_geographytype_name ( nflag_smart => 1, sname => 'Район', sgeogrtype => sGeoType ); /* вышестоящий уровень для гео.понятия */ find_geografy_by_OKATO ( nCompany => nCompany, sOkato => substr(sCode,1,2)||'00000000000', nrn => nRnGeo ); else if substr(sCode,9,5)='00000' then /* Город */ find_geographytype_name ( nflag_smart => 1, sname => 'Город', sgeogrtype => sGeoType ); /* вышестоящий уровень для гео.понятия */ find_geografy_by_OKATO ( nCompany => nCompany, sOkato => substr(sCode,1,5)||'00000000', nrn => nRnGeo ); else /* Населенный пункт */ find_geographytype_name ( nflag_smart => 1, sname => 'Населенный пункт', sgeogrtype => sGeoType ); /* вышестоящий уровень для гео.понятия */ find_geografy_by_OKATO ( nCompany => nCompany, sOkato => substr(sCode,1,8)||'00000', nrn => nRnGeo ); end if; end if; end if; else /* Улица */ find_geographytype_name ( nflag_smart => 1, sname => 'Улица', sgeogrtype => sGeoType ); /* вышестоящий уровень для гео.понятия */ find_geografy_by_OKATO ( nCompany => nCompany, nFlag_Smart => 1, sOkato => substr(sCode,1,11)||'00',-- Населенный пункт nrn => nRnGeo ); sGeoType := '5';--Улица end if; if nRnGeo is not null then /* найдем ПОДТИП гео.понятия */ find_localitytype_name ( nflag_smart => 1, ncompany => nCompany, sname => sSocr, sgeographytype => sGeoType, nrn => nRnLT ); if nRnLT is null then /* введем новый ПОДТИП гео.понятия */ p_localitytype_base_insert ( ncompany => nCompany, sname => sSocr, sgeographytype => sGeoType, nrn => nRnLT ); end if; /* ищем РН гео.понятия */ find_geografy_by_name_ex ( nflag_smart => 1, ncompany => nCompany, nprn => nRnGeo, sm_name => null, sgeogrname => sName, sgeogrtype => sGeoType, nrn => nRnGeo2 ); if nRnGeo2 is null then p_geografy_base_insert ( ncompany => nCompany, nprn => nRnGeo, sgeogrname => sName, sgeogrtype => sGeoType, nlocalitykind => nRnLT, scode => null, sokato => sCode, nrn => nRnGeo2 ); end if; end if; end;
Процедура для серверного варианта create or replace procedure p_KLADR_import_new2 ( sRegion varchar2 -- код региона ) is begin for a_ in ( select a.name sName, a.socr sSocr, a.code sCode --, a.index sIndex from kladr a where substr(a.code,1,2)=trim(sRegion) or sRegion is null order by a.code ) loop p_kladr_import_new ( sname => a_.sName, ssocr => a_.sSocr, scode => a_.sCode, sindex => null--a_.sIndex ); end loop; for a_ in ( select a.name sName, a.socr sSocr, a.code sCode --,a.index sIndex from street a where substr(a.code,1,2)=trim(sRegion) or sRegion is null order by a.code ) loop p_kladr_import_new ( sname => a_.sName, ssocr => a_.sSocr, scode => a_.sCode, sindex => null--a_.sIndex ); end loop; end;
Способ №2: Использовать процедуру Импорт КЛАДРа из нашего файлового архива
|