Работа с web-службами в SQL Server Integration Services на примере сервисов ЦБ РФ

ETL, ИНТЕГРАЦИЯ ДАННЫХ  Работа Категория:  ETL, ИНТЕГРАЦИЯ ДАННЫХ MDM, НСИ, DQ
Опубликовал:         11.11.2011               print

Предположим, Вы хотите пользоваться банковскими услугами (например, открыть депозитный счет). Возникает вопрос - по какому критерию выбрать банк?   Если:

  • - по величине процентной ставки, то на рынке существует такое обилие программ, предлагаемых разными банками --> придется побегать, сравнивать, и охватить всех не удастся;
  • - повестись на рекламные материалы про рейтинги банков --> так ли уж можно им доверять (или топ-лист банков по какому показателю)?;
  • - по широте и доступности филиальной сети --> так у одного банка(ов) такие очереди (особенно в дни зачисления пенсий), у другого мало офисов и они неудобно расположены, третий вызывает изумление скандальными сделками...;
  • - по размеру Уставного капитала, по доле просроченной задолженности в кредитном портфеле, ...?


Где взять свежую информацию? Насколько она будет достоверной? Как её получать на регулярной основе? Разумно предположить, что подобные данные можно найти на сайте Центрального Банка России... так и есть: в разделе "Технические ресурсы Банка России".
Допустим, Вы решили выбрать банк по величине его Уставного капитала. Однако никакой кнопки или ссылки "Скачать файл" не наблюдается, а вместо этого предлагаются web-сервисы. Как получить описание всех кредитных организаций?




Для решения задачи воспользуемся средой Microsoft SQL Server Business Intelligence Development Studio (служба SSIS версии SQL Server 2008R2), создадим новый ETL-проект, разместив его в папке C:\TEMP\A (для упрощения задачи в данном примере не будем озадачиваться относительными путями и конфигурированием переменных окружения).
Перейдем по ссылке http://www.cbr.ru/CreditInfoWebServ/CreditOrgInfo.asmx, щелкнем по ссылке "Service Description" и сохраним WSDL-описание (Web Services Description Language — язык описания интерфейса web-служб) web-служб Банка России в файле banks.wsdl.




Из всех web-сервисов нам потребуются следующие:

  • - EnumBIC_XML - возвращает список (в виде xml-документа) БИК всех кредитных организаций;
  • - BicToIntCode - транслирует БИК кредитной организации во внутренний код Центрального Банка РФ;
  • - CreditInfoByIntCodeXML - возвращает информацию (в виде xml-документа) о кредитной организации по внутреннему коду;
  • - GetOfficesXML - возвращает информацию (в виде xml-документа) о филиальной сети кредитной организации по внутреннему коду.

С панели элементов в область Control Flow пакета перетащим задачу "Web Service Task". В этой задаче посредством вызова метода EnumBIC_XML получим список БИК всех банков, который будет сохранен в файле tmp_EnumBIC.xml. После создания в свойстве HttpConnection нового http-соединения и подстановки в свойстве WSDLFile ранее сформированного файла banks.wsdl, в свойстве Method нам доступен перечень web- методов, среди которых выберем метод EnumBIC_XML.




Создадим соединения с новыми текстовыми файлами, в которые будем записывать получаемые из web-сервисов данные: CreditOrgInfo.txt --> информация о кредитных организациях, CreditOfficeInfo.txt --> информация о филиальной сети кредитных организаций.
Для этого в диспетчере соединений в контекстном меню выбираем "Создать соединение с файлом...", указываем путь, где будут располагаться файлы, а затем описываем метаданные полей согласно XSD-схемам получаемых xml-документов (CreditInfoByIntCodeXML, GetOfficesXML), представленных на вышеуказанной странице Технических ресурсов Банка России. В текстовых файлах в качестве разделителя полей будем использовать символ вертикальной черты "|", как самый непритязательный.






Надо сказать, сервисы CreditInfoByIntCodeXML, GetOfficesXML отрабатывают не очень быстро, поэтому желательно распараллелить процессы, для чего создадим копии файлов CreditOrgInfo2.txt, CreditOfficeInfo2.txt. Перед формированием финальных текстовых файлов необходимо удалить существующие, возможно оставшиеся от предыдущих сеансов.
В качестве примера продемонстрируем, как можно выполнять файловые операции, используя специализированную задачу "Файловая система", экземпляры которых перетащим с панели элементов в область Control Flow пакета и подключим управляющие потоки (зеленые стрелочки) от первой задачи.




Поскольку сервисы CreditInfoByIntCodeXML, GetOfficesXML возвращают данные по каждой отдельной кредитной организации по ее внутреннему коду (входному параметру), нам потребуется организовать цикл по всем узлам tmp_EnumBIC.xml по всем банкам. Для этого с панели элементов возьмем задачу "Foreach Loop Container", источником данных которого будет файл tmp_EnumBIC.xml.




Используя встроенную директиву XPath, цикл cформируем по коллекции узлов EnumBIC/BIC, записывая содержимое блока (на рис. выделено зеленым цветом) в заранее созданную объектную переменную User::VariableXML.




Внутри цикла первым делом необходимо вычленить значения элементов BIC (БИК банка) и первую букву элемента NM (наименование банка). Создадим строковые переменные User::bic, User::KOfirstChar (User::bic2, User::KOfirstChar2). В сценарии задачи "Сценарий" на языке .Net из входной переменной User::VariableXML вырезаем интересуемые значения и записываем в выходные переменные User::bic, User::KOfirstChar.
Обратите внимание, каким образом осуществляется доступ к переменным пакета внутри скрипта: Dts.Variables(...).Value




Следующими двумя шагами преобразуем БИК банка во внутренний код, используя web-метода BicToIntCode. Снова задействуем задачу "Web Service Task". Входом для неё будет переменная User::bic (User::bic2), а выходом - предварительно созданная строковая переменная User::strWithInternalCode (User::strWithInternalCode2), в которую запишется результат вызова web-метода BicToIntCode.


Дважды щелкнем на управляющем потоке (зеленой стрелке от задачи "Определение переменной БИК банка" к задаче "Запрос с ЦБ внутреннего кода банка по его БИК") и зададим выражение условия исполнения задачи @KOfirstChar < "М", т.е. данная задача буде выполняться, если первая буква наименования банка меньше буквы М. Справа в аналогичном контейнере "Foreach Loop Container" установим условие @KOfirstChar > = "М".




Потребуется еще один "Сценарий" преоразования строковой переменной User::strWithInternalCode в числовую переменную User::KOinternalCode :




Определив числовой внутренний код кредитной организации, можно переходить к вызову web-методов получения данных о кредитной организации и ее филиальной сети - CreditInfoByIntCodeXML, GetOfficesXML, результаты которых записываются в заранее объявленные объектные переменные User::KOinfoXML, User::KOofficeXML (User::KOinfoXML2, User::KOofficeXML2).




Наконец, перейдем к сохранению данных о кредитной организации в текстовых файлах. Воспользуемся компонентами "Data Flow Task",




у которых входами будут источники "XML Source", а именно объектные переменные User::KOinfoXML, User::KOofficeXML (User::KOinfoXML2, User::KOofficeXML2). XSD-схемы можно подготовить на основе имеющихся схем на странице технические ресурсов ЦБ РФ.




Сформированные текстовые файлы легко импортировать в файл Excel, где можно отсортировать список банков по размеру Уставного капитала, проанализировать, сделать для себя соответствующие выводы.


Пример подготовленного Excel-файла можно найти на данном сайте в разделе Справочники


Энергия идеи   dvbi.ru                    Последнее изменение: 2017-10-15 19:30:38Z         Возрастная аудитория: 14-70         Комментариев:  0
Прикрепленные файлы:
  Архив SSIS проекта               Размер: 223.79 Кб            Скачали раз: 177

Теги:   Web-сервисы Примеры
Пожалуйста, проголосуйте и ниже поставьте лайк:   rating
1 1 0


  Comments


Следующая статья:    Построение OLAP отчета в Excel
Предыдущая статья:  Действия и полезные CLR-процедуры для SSAS