Взаимодействие системы «Галактика» с другими программными системами

Любая программная система, претендующая на комплексное решение задачи управления предприятием, независимо от полноты реализованной в ней функциональности, нуждается в связи с «внешним миром» – другими программами и программными системами. Функции, специфичные для отдельных предприятий, взаимодействие с унаследованными программами, специфические способы представления информации – вот области, где может потребоваться взаимодействие различных программ.

Руководство предприятия нуждается в своевременном (быстро и в нужное время) получении информации о текущем состоянии предприятия для целей выработки решений по управлению. Бизнес–информация о хозяйственной деятельности предприятия (корпорации), регистрируемая в базе данных системы «Галактика», в прин­ципе, вполне достаточна для использования ее в качестве исходного «сырья» в алгоритмах выработки управляющих решений. Однако, существующие в «Галактике» типовые формы представления информации, а также интерфейс взаимодействия пользователя с системой, слабо ориентированы на поддержку интерактивного процесса принятия управляющих решений. Кроме этого, само создание некой универсальной программной компоненты, способной удовлетворить руководителей любого предприятия при принятии ими управляющих решений, представляется нам полной утопией.

Отсюда следует вывод о необходимости использования внешних по отношению к «Галактики» программ, реализующих специализированные интерфейсы доступа к данным для конкретных руководителей предприятия. Общая схема организации взаимодействия «Галактики» с другими программными системами может быть представлена следующим образом:

Для организации взаимодействия, таким образом, необходимы некоторые программные компоненты, которые извлекали бы данные из базы системы «Галактика» и передавали их на обработку во внешнюю программу.

Рассмотрим, каким образом можно организовать взаимодействие с такими популярными программными средами, как MS Office и Internet/Intranet. В примерах будут использованы дополнительные программные компоненты, распространяемые бесплатно (freeware) либо входящие в состав операционных систем и простые в использовании[1] .

Часть 1. Система «Галактика» и MS Office

Взаимодействие системы «Галактика» с программными компонентами MS Office может потребоваться пользователям системы для решения самых разных задач – от форматирования выходных документов до обмена данными собственных программ с базой данных «Галактики». Форматирование сформированных системой «Галактика» выходных  документов может выполняться, например, средствами MS Word. Собственные программы, такие, как программы планирования корпоративных ресурсов, могут быть разработаны в среде MS Excel и использовать накопленные «Галактикой» данные для анализа выполнения планов.

Данные извлекаются из базы системы «Галактика» и в форме промежуточного документа передаются компоненту MS Office («внешняя программа» на схеме), который производит их дальнейшую обработку (может быть, с привлечением дополнительных данных других программ) и формирует выходные документы.

В качестве компонента извлечения данных может выступать сама система «Галактика». В этом случае можно воспользоваться имеющимися в системе отчётами. Такие отчёты, как правило, используют сложные запросы к базе данных и выполняют большинство необходимых преобразований данных. Дополнительные преобразования могут быть выполнены с использованием механизма присоединённых форм «Галактики». Получающийся в результате промежуточный документ (текстовый файл) может быть использован в качестве данных для компонента MS Office.

Компонент передачи данных должен загрузить нужный компонент MS Office и сообщить ему, какие данные следует использовать. В качестве такого компонента, в простейшем случае, может выступать человек – оператор системы, который после формирования промежуточного документа загружает программу MS Office и запускает модуль на VBA[2] , который и выполняет дальнейшую обработку данных. Однако такой способ годится лишь для периодического использования и только тогда, когда все компоненты (система «Галактика» и MS Office) могут одновременно работать на одном компьютере.

Для автоматизации процесса обработки можно воспользоваться программами–мониторами,[3] способными по заданному событию (формирование промежуточного отчёта системой «Галактика») запускать программу или сценарий[4] (диспетчер), которые, в свою очередь, загружают компонент MS Office и запускают программу обработки на VBA.

Такая схема позволяет разнести операции обработки по двум компьютерам – на одном (не обязательно под управлением Windows) работает клиентская часть системы «Галактика», промежуточный отчёт сохраняется на сетевом каталоге. На другом компьютере программа–монитор по факту формирования отчёта запускает через диспетчера необходимый компонент MS Office, который проводит необходимую обработку и печать документов.

В качестве примера такой системы рассмотрим способ печати с помощью MS Word такого популярного документа, как платёжное поручение. Форму документа подготовим средствами MS Word 97/2000 в виде таблицы и сохраним полученный файл в формате шаблона (PlatPor.dot). Каждой ячейке таблицы, которая будет заполнена данными из «Галактики», присвоим имя (закладка, bookmark): выделить ячейку, выбрать пункт меню «Вставить–закладку»(Insertbookmarks), задать имя ячейки. Вот фрагмент получившегося бланка поручения с именами ячеек:

ПЛАТЁЖНОЕ ПОРУЧЕНИЕ №

Num_plat

data_plat

 

почтой

(Дата)

 

(Вид платежа)

Сумма прописью

summa_prop

 

ИНН

inn_plat

Сумма

summa_plat

Plat

Сч.№

schet_plat

Плательщик

bank_plat

БИК

bik_bank_plat

Сч.№

schet_bank_plat

               

Другой файл–шаблон (_DKMP_Gal.dot) будет содержать VBA–программы для считывания информации из промежуточного отчёта и заполнения ячеек формы из PlatPor.dot. Основная программа считывает строки из файла промежуточного отчёта и разыскивает комбинации «имя_ячейки ::= значение», после чего в соответствующую ячейку помещается указанное значение:

Sub mainFill(doc As Document)

Dim path As Variant, s As String, name, value

doc.Activate

mainFillDocDefault  ' Заполнить значениями по умолчанию

path = mainGetProperty(doc, "SrcDataFile")

Open CStr(path) For Input Access Read Shared As #1 ' Открыть входной файл

Do Until EOF(1)

   s = readln(1)

   If setNameAndValue(s, name, value) Then ' в строке есть “имя::=значение”

         SetBookmarkText doc, name, value ' заполнить поле значением

   End If

Loop

Close #1

Exit Sub

Для выборки данных из базы и формирования промежуточного файла воспользуемся присоединённой формой следующего вида (файл pp_wrd.frm, который необходимо компилятором Fcom поместить в загружаемый ресурс системы «Галактика»):

.linkform PlatDocs4word prototype is 'PlatDocs'

.group 'ПЛАТЕЖНОЕ ПОРУЧЕНИЕ'

.NameInList 'ПЛАТЕЖНОЕ ПОРУЧЕНИЕ для печати из MS Word'

.fields

  NoDok DatVipP TelePost sumplatdocstr PlatUNN trim(PlatName) SumPlatDoc

  PlatBankSchet1 PlatBankName PlatBankMFO1 PlatBankSchet2

  PolUNN trim(PolName) PolBankMFO1 PolBankSchet2 trim(PolBankName) PolBankSchet1

  NameAll Glava Srokplat KodTec KodNew

.endfields

.{

num_plat ::=^

data_plat ::=^

vid_plat ::=^

summa_prop ::=^

inn_plat ::=^

plat ::=^     //наим. плательщика

summa_plat ::=^

schet_plat ::=^

bank_plat ::=^

bik_bank_plat ::=^

schet_bank_plat ::=^

………

.}

………

.endform

Формирование промежуточного файла производится с использованием стандартной техники системы «Галактика»: откроем интерфейс платёжного поручения, запустим печать документа, из списка форм выберем «ПЛАТЕЖНОЕ ПОРУЧЕНИЕ для печати из MS Word». После формирования файла pp_wrd.out монитор запустит диспетчера, тот загрузит MS Word, сформирует новый документ по шаблону PlatPor.dot и запустит процедуру mainFill[5] .

В результате от оператора «Галактики» не требуется никаких дополнительных действий, а документы в формате MSWord могут быть напечатаны какиз Windows-, так и из DOS-клиента системы «Галактика».

Очевидные направления развития этого метода – обработка группы документов, обработка документов со спецификацией (счета, накладные), использование графического логотипа фирмы, отправка сформированных документов по электронной почте и т.д. – достаточно легко могут быть реализованы с использованием возможностей присоединённых форм «Галактики» и языка VBA.

 

Другим способом извлечения данных из базы системы «Галактика» является использование компонентов доступа к данным. Такие компоненты обращаются непосредственно к базе данных, извлекают необходимую информацию и передают её для обработки другим программам.

Одним из наиболее удобных таких компонентов является ADO – бесплатно распространяемая Microsoft[6] система доступа к данным, состоящая их ActiveX–компонентов, обращающихся к базам данных с использованием языка SQL через интерфейс OLE DB. Компоненты ADO легко могут быть использованы в программах на VBA, VBScript, JavaScript.

В качестве примера такого способа доступа рассмотрим программу планирования корпоративных ресурсов, работающую в среде MS Excel (электронная таблица).

Один из листов (PlMoney) таблицы содержит плановые данные по наличию денежных средств на каждый день месяца (наличные в колонке B и безналичные в колонке C):

 

 

 

 

 

 

Для заполнения фактическими данными колонок E и F выберем из базы данных системы «Галактика» остатки на каждый день месяца по счетам 50 (наличные) и 51 (безналичные). Таблица таких остатков ведётся в «Галактике» автоматически при получении ежедневных отчётов о наличии средств в кассе (счёт 50) и на банковских счетах (счёт 51).

Для выборки данных и заполнения колонок используем следующую VBA–программу (сервер базы данных – Oracle[7] , имя базы – Galaxy, имя ODBC–источника – GalMain):

Sub GetFactMoney()

Dim GalData As ADODB.Connection

Dim Nal As ADODB.Recordset, BNal As ADODB.Recordset

Dim iRow As Long

Set GalData = New ADODB.Connection

GalData.ConnectionString = "DSN=GalMain;UID=ivanov;PWD=123456"

GalData.Open

Set Nal = New ADODB.Recordset ‘остатки наличных

Nal.Source = "select to_oradate(fdatesal) datsal, " _

           & "sum(fsums) sumday " _

           & "from galaxy#.saldday where rtrim(FDBSCHETO)='50' group by fdatesal"

Nal.ActiveConnection = GalData: Nal.Open: Nal.MoveFirst

Do While Not Nal.EOF

    iRow = 3

    'Ищем строку с нужной датой

    Do While Sheets("PlMoney").Cells(iRow, 1) <> Nal.Fields(0): iRow = iRow + 1: Loop

    Sheets("PlMoney").Cells(iRow, 5) = Nal.Fields(1) ' Записываем сумму в колонку

    Nal.MoveNext

Loop

Nal.Close: Set Nal = Nothing

Set BNal = New ADODB.Recordset ‘остатки на банковских счетах

BNal.Source = "select to_oradate() datsal, " _

           & "sum(fsums) sumday " _

           & "from galaxy#.saldday where rtrim(FDBSCHETO)='51' group by fdatesal"

BNal.ActiveConnection = GalData: BNal.Open: BNal.MoveFirst

Do While Not BNal.EOF

    iRow = 3

    Do While Sheets("PlMoney").Cells(iRow, 1) <> BNal.Fields(0): iRow = iRow + 1: Loop

    Sheets("PlMoney").Cells(iRow, 6) = BNal.Fields(1)

    BNal.MoveNext

Loop

BNal.Close: Set BNal = Nothing

End Sub

Такой метод извлечения данных не требует ни использования клиентской части системы «Галактика», ни дополнительных программ–мониторов и диспетчеров, а промежуточные отчёты существуют в виде динамических наборов данных и не требуют перекодировки. Взамен требуется знание структуры базы данных, особенностей её реализации на разных платформах и достаточно высокая квалификация при написании сложных SQL–запросов к базе данных.

 

Часть 2. Система «Галактика» и Internet/Intranet

Рассмотрим две простые задачи, требующие организации взаимодействия системы «Галактика» с компонентами Internet/Intranet: формирование для публикации на корпоративном Web–сайте прайс–листа и удалённый просмотр корпоративной информации.

Первая задача может быть решена, как в примере с печатью платёжных поручений, с использованием механизма присоединённых форм системы «Галактика». Новая присоединённая форма должна сформировать выходной файл в формате HTML, использующемся для публикации информации в Сети. Основное отличие таких форм от привычных – добавление тегов описания страницы и замена текстовых таблиц на набор тегов с описанием таблиц, строк и ячеек. Так фрагмент присоединённой формы, выводящий строки прайс–листа в виде текстовой таблицы

Наименование

Уч.  ед. измер.

Цена за   уч. единицу

Коэф-т
пересчета

Отпускная
ед
. измер

Цена за   отп. единицу

Кол-во к продаже

.{

.{

^

.}

.{

 

 

 

 

 

 

@@@@@@@@@@@@@@@@@@@

@@@@@@@

&'&&&&&&&

&'&&&&&&

@@@@@@

&'&&&&&&

&'&&&&&&

.{

.}

.}

 

 

 

 

 

 

 

заменяется на другой, выполняющий ту же операцию, но в формате HTML:

<table  width=85% ALIGN=CENTER BORDER=1 CELLPADDING=2 id=PrTable>

<thead ALIGN=CENTER >

<tr>

<tdnowrap>Наименование</td><td>Учетная единица</td><td>Цена за учетную единицу</td>

<td>Коэффициент пересчета</td><td>Отпускная единица</td><td>Цена за отпускную единицу</td><td>Количество к продаже</td>

</tr>

</thead>

<tbody VALIGN=top>

.{

.{

<!-- строка с группой -->

<tr>

<td colspan=7>

^

</td></tr>

<.}

.{

!-- строки группы -->

<tr>

<td align=left>^</td><td align=center>^</td> <td>^</td> <td>^</td> <td align=center>^</td> <td>^</td><td>^</td>

</tr>

.{

.}

.}

</tbody>

</table>

Получившийся в результате прайс–лист можно поместить на страницу корпоративного сайта для просмотра его покупателями с использованием бесплатных программ MS Internet Explorer или Netscape Communicator. В этом примере роль «компонента передачи данных» выполняет команда копирования отчёта в каталог Web–сервера, в роли «внешней программы обработки» выступают Web–сервер и браузер.

Пример с прайсом достаточно прост, поэтому исходные тексты форм не приводим, при необходимости их можно восстановить из текста результата.

Небольшие изменения позволят превратить прайс–лист в форму для заказа товаров через Internet: в каждую строку прайса следует добавить текстовое поле (<td> <inputtype=textvalue=”     ”> </td>), в которое покупатель впишет заказанное количество. В конце документа следует поместить кнопку пересылки заказа на сервер, в текст документа добавить программу (<script..../>) анализа и пересылки данных.

Дополнительные выразительные возможности документу придаст использование элементов динамического HTML – таблицы стилей, скрипты, изменяющие содержание или представление элементов документа и т.д.

Здесь приведён ещё один пример (со всеми исходными файлами) выходной формы в HTML-формате (теперь для «внутреннего» потребления – Главная книга предприятия).

 

Удалённый просмотр корпоративной информации может быть реализован с использованием MS IIS [8] и технологии активных серверных страниц (ASP–страниц).

Рассмотрим в качестве примера программу просмотра текущих остатков матценностей на предприятии. Информацию выберем из таблиц SklOSt, KatMC и KatEd базы данных системы «Галактика» с использованием знакомого механизма ADO. Подключение к базе, выборку данных и формирование HTML–страницы («выходной документ» по схеме взаимодействия) для пользователя выполняет следующая ASP–программа[9] :

<%@ Language=VBScript %>

<%Response.Expires = 0%>

<html><head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<title>Складские запасы</title></head><body>

<% 'Открытие БД

Dim DB, MCSet, MCSetSql, MCOst

MCSetSql=           "select sum(fkol) ost, max(k.fname) mcname, "

MCSetSql=MCSetSql & "max(e.fname) ename, avg(fzapasmin) min, avg(fzapasmax) max "

MCSetSql=MCSetSql & "from galaxy#.sklost o, galaxy#.katmc k,galaxy#.kated e "

MCSetSql=MCSetSql & "where o.fcmc=k.fnrec and e.fnrec=k.fced "

MCSetSql=MCSetSql & "group by k.fname"

set DB = Server.CreateObject("ADODB.Connection")

DB.ConnectionString = "DSN=GalMain; UID=ivanov; PWD=123456"

DB.open() 

if (DB.State = 1) then  'соединение успешно

       set MCSet = Server.CreateObject("ADODB.Recordset")

       MCSet.Open MCSetSql, DB

       if  (MCSet.State = 1)  then 'выборка успешна

%>

Наличие матценностей на предприятии<br><br>

<%     'Основной цикл      %>

<Table BORDER=1 ><THead><TR BGCOLOR=green Color=black ALIGN=CENTER>

   <TH>Наименование</TH> <TH>Ед.изм.</TH>  <TH>Минимум</TH>

   <TH>Максимум</TH>     <TH>Наличие</TH>  <TH>Дефицит/избыток</TH>

</TR></THead><TBody>

<%     MCSet.MoveFirst

       do while (not MCSet.EOF)

           MCOst=CDbl(MCSet.Fields("ost").Value): Result="Норма."

    if MCOst<CDbl(MCSet.Fields("min").Value) then Result="Дефицит."

    if MCOst>CDbl(MCSet.Fields("max").Value) then Result="Лишнее!!"

%>

  <TR>

      <TH><%=MCSet.Fields("mcname").Value%></TH>

      <TH><%=MCSet.Fields("ename").Value%></TH>

      <TH><%=MCSet.Fields("min").Value%></TH>

      <TH><%=MCSet.Fields("max").Value%></TH>

      <TH><%=MCOst%></TH> <TH><%=Result%></TH> </TR>

<%         MCSet.MoveNext()%>

<%     loop%>

</TBody></Table><br>

<%     end if%>

<%end if%>

<%     'Закрываем БД

MCSet.Close: Set MCSet = Nothing:  DB.Close():  set DB = Nothing %>

</body></html>

 

Такой способ представления данных конечному пользователю является самым универсальным, т.к. не требует на клиентском компьютере наличия каких-либо программ, кроме Internet–браузера. Пользователь может быть подключён к локальной сети предприятия, а может подключаться к корпоративному серверу через Internet. Комбинация подобных страниц, выводящих информации о различных сторонах хозяйственной деятельности предприятия, может послужить основой модной в настоящее время «ситуационной комнаты» руководителя.

 



[1] Полные версии программ, использованных в примерах, можно получить у автора, программные компоненты – на Web–сайтах производителей.

[2] Visual Basic for Application – внутреннийязыкпрограмм MS Office. VBA–программы можно запускать изнутри компонентов MS Office с помощью «горячих» клавиш, кнопок на Toolbar’е и т.п.

[3] Можно порекомендовать свободно распространяемую программу LogMon, автор Vadim Dumbravanu, koenigvad@geocities.com, http://www.geocities.com/SiliconValley/Network/4436/Eng/

[4] Такая программа–диспетчер может быть написана на любом языке, поддерживающем вызовы OLE-серверов (через функцию CreateOleObject) – Delphi, VB, VC++ и т.д. Сценарий–диспетчер может быть написан на языках VBScript или JavaScript и исполнен с помощью сервера сценариев WSH, который бесплатно поставляется Microsoft в составе Internet Explorer и входит как составная часть в Windows 98/2000. Диспетчер может также производить предварительную обработку, например, перекодировать информацию в Windows–кодировку.

[5] Вот фрагмент кода на языке Pascal (Delphi 3/4), выполняющий указанные действия диспетчера:

var

  MsWord: Variant;

  Tmplt, Flnm, Macro: string;

begin

MsWord:=CreateOleObject('Word.Application');

if IDispatch(MsWord) <> nil then // Здесь Word загрузился

begin

       MsWord.Visible:=True;

       Tmplt:='PlatPor.dot'; Flnm:='pp_wrd.out'; Macro:= 'mainFill'

       MSWord.Documents.Add(Template:=Tmplt, NewTemplate:=False);

       OleApplicationSetProperty(MSWord.ActiveDocument,'SrcDataFile',Flnm,4);

       MsWord.application.Run(MacroName:=Macro);

end;

[6] Например, в составе пакета Option Pack.

[7] Для других платформ (MS SQL Server, BTrieve) строка запроса (свойство .Source набора данных) должна быть скорректирована в соответствии с особенностями реализации базы данных и особенностями диалекта SQL.

[8] MS Internet Information ServerWeb–сервер фирмы Microsoft, входит в состав Windows NT Server. Windows NT Workstation и Windows 98 имеют вариант с ограниченным числом подключений (Personal WebServer). IIS бесплатно распространяется в составе пакета Option Pack.

[9] Теги <%……%> содержат код, исполняемый на сервере.