Как связать ERP на основе xBase с веб-приложением?

Мне необходимо настроить веб-приложение, которое будет взаимодействовать с существующей системой ERP (WinMagi). ERP — это интерфейс к базе данных xBase (FoxPro). База данных находится на собственном сервере. ERP, насколько мне известно, не имеет API, но может принимать заказы на покупку и т. д. через модуль EDI. Веб-приложение должно иметь возможность принимать онлайн-заказы и запрашивать данные для отчетности.

Мой план на данный момент:

  1. Synchronize the xBase DB to a SQL server instance on a cloud hosted VM.
    • (one-way from ERP -> SQL Server)
  2. Используйте этот процесс синхронизации в качестве интерфейса между ERP и веб-приложением.
  3. Push purchase orders back to the ERP using EDI.
    • My thinking here is that it would be safer from a data concurrency perspective to create or update data in the ERP through a controlled and accepted (by the ERP) interface.

Вопросы/проблемы:

  1. Каков наилучший способ обновить базу данных SQL из базы данных xBase? Существуют ли какие-либо уже существующие библиотеки, которые могут это сделать, чтобы мне не пришлось изобретать велосипед?
  2. Будет ли xBase DB заблокирована во время синхронизации? Или иным образом вызвать проблемы с работающей ERP?
  3. Как избежать проблем с параллелизмом/целостностью данных во время синхронизации?
  4. Эта система не будет передавать оперативные данные в веб-приложение. Какие проблемы я могу ожидать из-за этого?
  5. Должен ли я предпочесть один язык другому для такого рода проектов? Мой план состоял в том, чтобы использовать Java/Hibernate MVC.

Я, возможно, иду об этом неправильно? Было бы лучше, если бы мое веб-приложение напрямую взаимодействовало с базой данных xBase DB? Некоторые проблемы, которые сразу приходят на ум при таком подходе, — это проблемы с сетью между офисом и облачной виртуальной машиной, а также потенциальные уязвимости безопасности из-за открытия ERP непосредственно в Интернете.

Любые советы или предложения, которые вы могли бы предоставить, будут очень признательны! Заранее спасибо.

ОБНОВЛЕНИЕ – 3 сентября 2012 г.

Как я сейчас делаю копирование данных (это не синхронизация) - работает каждую ночь:

  1. Linux-система в офисе копирует необходимые файлы DBF из доступного только для чтения общего ресурса на сервере ERP в локальное хранилище.
  2. DBF конвертируются в CSV с помощью фантастического perl-скрипта dbf2csv Дейва Бертона.
  3. Полученные CSV rsync синхронизируются с удаленной виртуальной машиной. В данных есть только небольшие изменения, так что это довольно быстро.
  4. После завершения rsync удаленная виртуальная машина выполняет mysqlimport в рабочую БД.

Преимущества этого подхода

  • ERP никоим образом не может быть повреждена, поскольку доступ к сети осуществляется только для чтения.
  • Для синхронизации данных не требуется реализовывать пользовательскую логику, поэтому нет опасений, что данные могут быть неправильными на удаленной виртуальной машине.
  • As the data copy runs at night the run time isn't too important.
    • Current run time is approx 7 minutes for over 1 million records with approx 20-30 fields per record.
    • Самые длинные этапы — это копирование DBF и преобразование в CSV.

Недостатки

  • DBF каждый раз необходимо копировать полностью.
  • DBF должны быть полностью преобразованы каждый раз.
  • Копируемые таблицы блокируются во время mysqlimport. На самом деле это не слишком большая проблема, так как импорт выполняется ночью, а mysqlimport занимает всего около 20 секунд.

person max    schedule 11.03.2012    source источник
comment
Я думаю, вам подойдет инструмент ETL, такой как Talend, CloverETL или Pentaho. Таким образом, вы не изобретаете велосипед и можете контролировать синхронизацию.   -  person Andrew    schedule 12.03.2012
comment
Спасибо за предложение @Andrew. Я посмотрю на это. Есть ли у вас какие-либо другие идеи по поводу других вопросов/проблем? Знаете ли вы, что xBase DB будет заблокирована и вызовет проблемы для внутренней ERP?   -  person max    schedule 13.03.2012
comment
если вы выбираете из базы данных xBase, вы должны иметь возможность использовать операторы NOLOCK. Это, конечно, грязное чтение и имеет некоторые недостатки, но это вариант.   -  person Andrew    schedule 13.03.2012
comment
Мне нужно построить что-то подобное. Удалось ли вам найти лучшее решение?   -  person Gurinder Singh    schedule 11.06.2015


Ответы (2)


  1. Если вы используете Visual Foxpro 3.0 или более позднюю версию, вы можете использовать встроенный контейнер базы данных для создания подключения к базе данных SQL Server. Затем представления в .DBC будут выполнять тяжелую работу по чтению и обновлению таблиц SQL Server.

  2. Я бы представил процедуру, которая просматривает вашу таблицу Foxpro и считывает строки, а затем вносит обновления в базу данных SQL Server. Таким образом, таблицы Foxpro не должны быть заблокированы. Чтобы убедиться в этом, вы можете сначала запросить DBF в курсор, а затем выполнить цикл по курсору.

  3. Я бы предложил добавить процедуру для проверки параллелизма.

Другим вариантом сервера данных Foxpro в реальном времени в ваших веб-приложениях может быть создание связанного сервера в SQL Server с вашей базой данных Foxpro. Таким образом, ваши данные Foxpro могут быть доступны в режиме реального времени.

person Jerry    schedule 17.04.2012
comment
Спасибо @Джерри. Я действительно не хочу идти по пути использования Visual Foxpro. Однако мне нравится идея связанного SQL Server. - person max; 03.09.2012

В настоящее время я делаю что-то подобное - мне нужно сделать транзакции счетов из системы на основе FoxPro доступными через веб-приложение, которое будет находиться на удаленной виртуальной машине, работающей под управлением SQL Server.

Я отвечу на ваш первый вопрос, исходя из того, что я делаю - вы можете решить для себя, будет ли это работать для вас!

Как лучше всего обновить базу данных SQL из базы данных xBase? Существуют ли уже существующие библиотеки, которые могут это сделать, чтобы мне не пришлось изобретать велосипед?

Я действительно не искал какие-либо общие библиотеки. Что я сделал (несколько упрощенно):

  1. В таблицу транзакций на стороне ERP добавлено поле, содержащее значение CRC32 на основе других полей, в которых я хочу обнаружить изменения (например, баланс транзакции).

  2. Написал автономный EXE, который сканирует таблицу транзакций на стороне ERP по таймеру, вычисляет значение CRC32 на основе некоторых полей, сравнивает его с последним значением CRC32, хранящимся в новом поле из точки 1, и если отличается, то что-то изменилось и транзакцию необходимо отправить повторно. Этот EXE-файл был написан на VFP для простоты доступа к файлам DBF и работает как служба Windows. Когда у меня будет время, это будет переделано на С#.

  3. Все еще в этом EXE, когда у меня есть список новых или измененных транзакций, я конвертирую их в JSON. Я создал свои собственные функции JSON, но вы можете использовать функции Крейга Бойда из [Sweet Potato Software][1] или некоторых других. С транзакцией может быть связан PDF-документ, если он закодирован и встроен в JSON.

  4. Я отправляю JSON веб-службе на удаленной стороне, используя класс, использующий стандартную библиотеку Windows WinHTTP (WinHttp.WinHttpRequest.5.1). Удаленная веб-служба, по сути, работает под управлением Java. Он все это расшифровывает и обновляет SQL Server.

person Alan B    schedule 16.05.2012
comment
Спасибо за предложение @Alan. Вероятно, я мог бы реализовать что-то подобное, но не хочу вносить изменения в таблицы ERP. Пожалуйста, смотрите обновление в моем вопросе для моей реализации. - person max; 03.09.2012