Добрый день
В некоторых случаях при работе предприятия возникает необходимость синхронизации баз данных WinCalc между удаленными участками (в основном из-за удаленности производства и отдела продаж). При наличии на предприятии безбумажного производства, очень важным является бесперебойная работа.
К сожалению (или даже к счастью) FireBird не содержит встроенных средств репликации. Поэтому нами был разработан соответствующий инструмент.
Использование инструмента идет из командной строки:
vsreplicator.exe /prepare config.xml - подготавливает исходную базу к репликации (только один раз выполнить)
vsreplicator.exe /prepare_dest config.xml - назначает права пользователю REPLICATOR в базе получателя (подключатся к приемнику под пользователем REPLICATOR нужно в случае обратной синхронизации баз) (только один раз выполнить)
vsreplicator.exe /replicate config.xml - собственно сама процедура репликации (выполнять периодически для переноса данных)
Далее будут рассмотрены ситуации и способы их решения:
1. Отдел продаж находится в разной сети с техническим отделом и производством
Отдел продаж работает в базе А
Технический отел работает в базе Б
Безбумажное производство работает в базе Б
Необходимо передавать из базы Б в базу А статусы заказов и историю кликов "безбумажка"
Сложность заключается в том, что базы А и Б не являются копию друг-друга (база Б формируется выгрузкой заказов из 1С, соответственно внутренние ID заказов отличаются).
При передаче информации выполняется синхронизация заказов по текстовым номерам, позиции в безбумажке синхронизируются по порядковому номеру
Конфигурационный файл:
Вложение:
np_out.xml [1,95 КБ]
Скачиваний: 38
2. Отдел продаж находится в одной сети с техническим отделом, производство удалено
Отдел продаж работает в базе А
Технический отдел работает в базе А
Производство работает в базе Б
Заказы из базы А необходимо передавать в базу Б для обеспечения работы безбумажного производства, обратно должна приходить информация о статусах заказа и истории кликов безбумажки
(решение в разработке)
Конфигурационный файл для передачи заказов:
Вложение:
full.xml [2,52 КБ]
Скачиваний: 9
P.S. Описание структуры конфигурационного файла:
Код:
<root>
<source> - параметры исходной базы
<server>localhost</server>
<path>o:\repl\src\wcoffers.fdb</path>
<user>SYSDBA</user>
<pas>masterkey</pas>
</source> - параметры базы-получателя
<dest>
<server>localhost</server>
<path>o:\repl\dest\wcoffers.fdb</path>
<user>REPLICATOR</user>
<pas>replicator</pas>
<pas_sysdba>masterkey</pas_sysdba> - пароль дял пользователя SYSDBA, чтобы назначить пользователю права на чтение и запись таблиц
</dest>
<tables> - список таблиц для репликации
<NHISTORY>
<ID>90</ID> - просто уникальный номер
<FChangeList> - список полей, значения которых нужно заменить
<cid>
<src>select notext,ztype,id as oid, cast(:cid as Integer) as cid from offers where id = :oid</src> - запрос, который делает выборку из исходной базы, параметры - текущая запись таблицы
<dest>select id as oid from offers where notext = :notext and ztype = :ztype</dest> - запрос, который получает новое значение поля. Параметры - результат запроса узла src
<src_row>select cast(rdb$get_context('USER_TRANSACTION', 'row#') as Float) as row_number, constructions.id, cast(:cid as Integer), rdb$set_context('USER_TRANSACTION', 'row#', Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) + 1) as TTT from constructions where pid = :oid</src_row> - запрос, возвращающий порядковый номер значения в базе источнике (порядковый номер берется при совпадении поля 1 и 2
<dest_row>select cast(rdb$get_context('USER_TRANSACTION', 'row#') as Float) as row_number, constructions.id, rdb$set_context('USER_TRANSACTION', 'row#', Coalesce(rdb$get_context('USER_TRANSACTION','row#'),0) + 1) as TTT from constructions where pid = :oid</dest_row> - запрос, возвращающий порядковый номер в базе приемнике. Значение поля 1 будет новое значение для поля cid
</cid>
<oid>
<src>select notext,ztype from offers where id = :oid</src> - запрос к базе источнику
<dest>select id from offers where notext = :notext and ztype = :ztype</dest> - запрос к базе приемнику, значение поля 0 будет новым значение поля oid
</oid>
</FChangeList>
</NHISTORY>
<CONSTRUCTIONS>
<RELATED> - подчиненные таблицы
<CALCREP>PID</CALREP> - имя и поле, по которому связана таблица
</RELATED>
</CONSTRUCTIONS>
</tables>
</root>