 |
 |
 |
расположение страницы : bookresearch.ru / Разработчику / Использование средств MS SQL Server DTS для организации связи между приложениями /
|
 |
 |
 |
Использование средств MS SQL Server DTS для организации связи между приложениями
[ Владислав Сафонов ]
Побудительные мотивы
Крупный издательский холдинг АВС в течение ряда лет развивал свою розничную сеть. Способ построения собственной розничной сети холдинга не отличался оригинальностью. По примеру организаций, шедших первыми, таких как "Топ-Книга" и "Мастер-Книга", была разработана программа автоматизации розничного магазина. Она и устанавливалась в покупаемые в собственность или привлекаемые как партнеры АВС торговые точки. Логистика была скопирована с продвигаемого организацией "Мастер-книга" PUSH метода, и заключается в заливке на торговую точку продукции АВС по самые "не балуйся". Для того чтобы как-то рационально управлять проталкиванием товара на торговую точку, администратора магазина обязали формировать и отправлять отчеты о продажах и остатках за отчетный период с использованием системы АВСМаг. Формат отчетов DBF. Внутри отчета содержится отчетный период, кот (артикул) товара, проданное количество, количество на остатках и продажи за предыдущие два месяца.
В центральном офисе отчеты принимаются оператором информационной системы и раскладываются по файловым папкам на сервере. Затем, разносторонне одаренный пакет MS Excel проводит предварительную обработку отчетов, разрезая их по типу товара и объединяя различные тиражи одной и той же позиции.
Построенная таким образом система имеет ряд существенных недостатков, которые порождают негативные события, связанные с неточностью исходных данных. Частота появления проблемных ситуаций 3-7 раз в неделю. И как водится, проблема всплывает задним числом.
Целью данной статьи не является проведение полного анализа проблем. Поэтому сразу перейду к описанию проблемы, на решение которой направлена настоящая разработка.
Описание проблемы
Во-первых, как было сказано выше, магазин имеет возможность задавать любой период формирования отчетов. При этом, персоналу магазина, предоставлено право изменять имя файла отчета (вероятно, это было сделано для того, чтобы программисту было удобно писать код, и для того, чтобы доставить радость оператору информационной системы в офисе). Могу сделать предположение, что отчетный период был введен внутрь DBF файла, чтобы как-то побороть поток ошибок связанный с интерпретацией имени отчетного файла с наименованием магазина и отчетным периодом. Пример, магазин сначала формирует отчет за день, и называет его отчетом за день. Затем ему не досуг формировать отчеты, или почта не работала, или еще что-нибудь, и следующий отчет магазин присылает за неделю, назвав его дневным отчетом. Оператор офиса честно клеит отчеты один к одному, и начальство радуется возросшей реализации, пока под видом ежедневного отчета не приходит месячный или годовой.
Основная причина данной проблемы - ручная обработка файлов.
Во-вторых, в связи со спецификой начального этапа формирования розничной сети, которая заключается во всеобщей неорганизованности и потаканию прихотям магазина партнера, эти самые отчеты приходят крайне нерегулярно. Пока партнеров было мало, как-то справлялись. Но с увеличением числа партнеров проблема вышла из под контроля.
Цель
Целью настоящей разработки является автоматизация процесса приема и первичной обработки информации с целью:
- Уменьшения на 100% проблем с руководством из-за не соответствия и наложения отчетных периодов в поступающих отчетах.
- Снижение издержек на отслеживание выполнения графика поступления отчетов.
- Обеспечить поддержку переходного периода с существующей системы на новую интегрированную систему.
Ограничения
Решение должно быть простым и не очень трудоемким. По возможности обойтись без объемного кодирования.
Решение
Предлагаемое решение основано на использовании службы DTS MS SQL Server-а. Это было сделано по двум причинам:
Во-первых, автор давно, и, наверное, достаточно хорошо (хотя и без оформления официальных отношений) знаком с этим средством.
Во-вторых, данное средство имеет развитые возможности по автоматической обработке заданий с различным графиком.
В-третьих, это все-таки достаточно мощная БД, а не какие-нибудь электронные таблицы.
Описание
Администратор данных офиса (далее просто Администратор) взаимодействует с системой, в целях обеспечения поступления и обработки оперативных отчетов от клиентов в интересах менеджера отдела реализации.
Выше приведена схема процесса приема отчетов. Действующие лица Администратор и Система. Первый просматривает поступившую почту и раскладывает принятые отчеты в файловые папки, закрепленные за клиентами. Система, по расписанию, например, в 12-00, обрабатывает новые файлы из этих папок, импортируя данные из форматов DBF в таблицы SQL Server, реализующие сущность "Отчет клиента за период". Поступившие отчеты сверяются с графиком поступления отчетов, и формируется список задолжников по отчетам, который направляется Администратору. Администратор, получив такой список, а в нем уже все, что ему нужно есть, а именно, наименование организации, телефон, контактное лицо, звонит и выбивает отчет. Затем, до 14-00, Администратор коротает время, принимая опоздавшие отчеты, которые при повторном запуске, будут отмечены как опоздавшие. В 14-00, система еще раз импортирует отчеты и формирует список как опоздавших, так и не поступивших отчетов, которые ложатся на электронный стол начальственного почтового ящика для принятия оргвыводов.
Далее приведу еще пару, тройку диаграмм, но уже без комментариев, думаю и так все понятно.
Реализация
Для реализации такого процесса обработки разработана следующая схема данных.
рис. Структура БД
Функционал полностью реализован средствами MS SQL Server DTS и VBScript. Оригинальное руководство DTS хуже не куда. Пока не сориентируешься, где что лежит работать невозможно. Создается общее впечатление какой-то недоделанности. Редактор кодов ужасный, настройки шрифтов не сохраняет, в общем, каменный век.
Однако работает здорово. В итоге получился вот такой пакет.
Планирется на каждого клиента формировать отдельный пакет. Думаю, что пока количество клиентов не перевалит за сто справиться. А там что то придумаем. Тем более возможности такие здесь есть. Как видно в пакете активно используются средства VBScript. Для того, чтобы удобно было перенастраивать пакет под конкретного клиента параметры настройки вынесены в блок глобальных переменных.
Из всех приведенных здесь шагов стоит остановиться на трех "Start", "Process File Collection" и "Continue Loop".
Первый - Start. Здесь следует обратить внимание на настройку источника данных Report.Dbf и вызов хранимой процедуры. В руководстве приведен пример с использованием констант, как подключить константы, я не нашел, зато нашел их значения, распечатал и повесил на стену. Пользуюсь.
Untitled
Function Main()
' Определение глобальных переменных
' Формирование connection string
DTSGlobalVariables("cConnectStr").Value = DTSGlobalVariables("cProvider").Value& _
DTSGlobalVariables("cDataSource").Value& _
DTSGlobalVariables("cDatabase").Value& _
DTSGlobalVariables("cUser").Value
' Определение учетного кода клиента по рабочему каталогу
DTSGlobalVariables("FolderName").Value = _
DTSGlobalVariables("cBaseFolder").Value& _ DTSGlobalVariables("cClientFolder").Value
' Настройка источника данных dBase на рабочий каталог
set oPkg = DTSGlobalVariables.Parent
set ReportConn = oPkg.Connections.Item(2)
ReportConn.DataSource = DTSGlobalVariables("FolderName").Value
'
dim Cnxn, cmdGetDepID, prmClientFolderNm, prmDepartID
set Cnxn = CreateObject("ADODB.Connection")
set cmdGetDepID = CreateObject("ADODB.Command")
'open connection
Cnxn.Open DTSGlobalVariables("cConnectStr").Value
cmdGetDepID.CommandText = "rpGetDepartIDByFolderName"
cmdGetDepID.CommandType = 4
cmdGetDepID.CommandTimeOut = 15
'
set prmClientFolderNm = CreateObject("ADODB.Parameter")
prmClientFolderNm.Type = 8
prmClientFolderNm.Size = 255
prmClientFolderNm.Direction = 1
prmClientFolderNm.Value = DTSGlobalVariables("FolderName").Value
cmdGetDepID.Parameters.Append(prmClientFolderNm)
'
set prmDepartID = CreateObject("ADODB.Parameter")
prmDepartID.Type = 3
prmDepartID.Size = 3
prmDepartID.Direction = 2
prmDepartID.Value = 1
cmdGetDepID.Parameters.Append(prmDepartID)
cmdGetDepID.ActiveConnection = Cnxn
' recordset by Command - Execute
Rdst = cmdGetDepID.Execute()
Cnxn.Close
DTSGlobalVariables("DepartID").Value = prmDepartID.Value
if prmDepartID.Value = -1 then
Main = DTSTaskExecResult_Failure
else
Main = DTSTaskExecResult_Success
end if
End Function
Второй - Process File Collection. Здесь следует обратить внимание на работу со списком файлов и ветвление исполнения пакета. Правда, это достаточно общее место. Получилось сразу.
Untitled
Function Main()
' Определение глобальных переменных
' Формирование connection string
DTSGlobalVariables("cConnectStr").Value = DTSGlobalVariables("cProvider").Value& _
DTSGlobalVariables("cDataSource").Value& _
DTSGlobalVariables("cDatabase").Value& _
DTSGlobalVariables("cUser").Value
' Определение учетного кода клиента по рабочему каталогу
DTSGlobalVariables("FolderName").Value = _
DTSGlobalVariables("cBaseFolder").Value& _ DTSGlobalVariables("cClientFolder").Value
' Настройка источника данных dBase на рабочий каталог
set oPkg = DTSGlobalVariables.Parent
set ReportConn = oPkg.Connections.Item(2)
ReportConn.DataSource = DTSGlobalVariables("FolderName").Value
'
dim Cnxn, cmdGetDepID, prmClientFolderNm, prmDepartID
set Cnxn = CreateObject("ADODB.Connection")
set cmdGetDepID = CreateObject("ADODB.Command")
'open connection
Cnxn.Open DTSGlobalVariables("cConnectStr").Value
cmdGetDepID.CommandText = "rpGetDepartIDByFolderName"
cmdGetDepID.CommandType = 4
cmdGetDepID.CommandTimeOut = 15
'
set prmClientFolderNm = CreateObject("ADODB.Parameter")
prmClientFolderNm.Type = 8
prmClientFolderNm.Size = 255
prmClientFolderNm.Direction = 1
prmClientFolderNm.Value = DTSGlobalVariables("FolderName").Value
cmdGetDepID.Parameters.Append(prmClientFolderNm)
'
set prmDepartID = CreateObject("ADODB.Parameter")
prmDepartID.Type = 3
prmDepartID.Size = 3
prmDepartID.Direction = 2
prmDepartID.Value = 1
cmdGetDepID.Parameters.Append(prmDepartID)
cmdGetDepID.ActiveConnection = Cnxn
' recordset by Command - Execute
Rdst = cmdGetDepID.Execute()
Cnxn.Close
DTSGlobalVariables("DepartID").Value = prmDepartID.Value
if prmDepartID.Value = -1 then
Main = DTSTaskExecResult_Failure
else
Main = DTSTaskExecResult_Success
end if
End Function
Ветвление делается для последующего шага в закладке Work Flow Properties, Options кнопка Properties.
Код приведен ниже
Untitled
Function Main()
if DTSGlobalVariables("ReportIsLoaded").Value = "Yes" then
Main = DTSStepScriptResult_ExecuteTask
else Main = DTSStepScriptResult_DontExecuteTask
end if
End Function
И последнее, на чем хотел остановиться это циклическая обработка. Делается так же просто, как и ветвление. Собственно сам шаг Continue Loop пустой. Он ничего не делает. А в Work flow properties помещен следующий код.
Untitled
Function Main()
if DTSGlobalVariables("ReportIsLoaded").Value = "Stop" then
Main = DTSStepScriptResult_ExecuteTask
else
set oPkg = DTSGlobalVariables.Parent
oPkg.Steps("DTSStep_DTSActiveScriptTask_1").ExecutionStatus = _
DTSStepExecStat_Waiting
Main = DTSStepScriptResult_DontExecuteTask
end if
End Function
Выводы
Средствами службы DTS может быть реализован достаточно изощренный обмен данными между приложениями через обмен файлами. Крови как вы видите немного. Вся работа заняла около недели. При том, что в это же время меня терзали партнеры и руководство. И главное, давненько я не брал в руки шашек. В качестве недостатков отмечу откровенно недоделанный интерфейс и запутанная документация. Для трассировки при отладке может быть использована функция MsgBox. Только не забывайте нажимать на кнопку в появляющемся окне и сохранять результаты. Забывчивость в этом вопросе приводит в выгрузке Enterprise Manager-а по ошибке с потерей всего того, что напрограммировали.
А, в общем, впечатление хорошее. Дерзайте!
Весь материал, размещенный на сайте www.bookresearch.ru, является собственностью авторов соответствующих материалов.
Любая перепечатка и перенос материалов на другие сайты возможны только с разрешения авторов и администратора сайта.
Любой может предложить свой материал для публикации у нас. Пишите администратору сайта.
|