Стратегия хранения общих данных для «живых» информационных панелей в Excel VBA

Я делаю пользовательский интерфейс в Excel, цель которого состоит в том, чтобы иметь «живую» информацию о Orders и Order Status между тремя пользователями, я назову их DataUser, DashboardOne и DashboardTwo для примера.

Процесс заключается в том, что DataUser будет заполнять данные о заказах, эти данные будут использоваться для заполнения информации на двух информационных панелях. Панели мониторинга будут обновляться в режиме реального времени с учетом изменений с DataUser (количество заказов увеличивается/уменьшается) и изменений статуса заказа между DashboardOne и DashboardTwo. Для оперативных обновлений я думаю об использовании вызова события Application.OnTime для обновления представления/панелей. Две приборные панели будут активны около 8 часов в день.

Там, где я изо всех сил пытаюсь понять, как и где хранить данные, у меня есть несколько вариантов, но я не знаю, чем они отличаются друг от друга, особенно с учетом того, что я намереваюсь запускать / обновлять информационные панели. каждые 30 сек. с Application.OnTime, что может оказаться дорогим.

Варианты, о которых я думал, где:

  • Основная рабочая книга, которая создаст отдельные рабочие книги для DashboardOne и DashboardTwo, а также базу данных действий и основной пользовательский интерфейс для DataUser.
  • Три отдельные рабочие книги, которые все будут ссылаться на одну DataWorkbook или другой плоский файл данных (возможно, XML или JSON).
  • Использование фактической базы данных для данных, хотя это повлечет за собой другие последствия (в настоящее время их нет).

Я не рассматриваю общую книгу, так как пробовал что-то подобное в прошлом (и на этот раз ^^, первые шаги), и все прошло довольно плохо, кошмар для синхронизации и плохая целостность данных.

Вкратце: какая стратегия хранения данных для Excel будет наилучшей, чтобы не ставить под угрозу целостность данных и не быть настолько дорогой, чтобы мешать безотказной работе остального кода? Есть ли лучшие варианты, которые я должен рассмотреть?


person Miguel_Ryu    schedule 12.11.2016    source источник


Ответы (1)


Существует довольно много альтернатив, в зависимости от времени, которое вы хотите инвестировать, и инструментов под рукой. Я дам вам пару вариантов здесь.

Но сначала основные предположения:

  1. Количество элементов данных, которыми вам нужно поделиться (будучи панелью инструментов), составляет несколько десятков (скажем, менее 100),

  2. У вас есть хотя бы базовые навыки программирования,

  3. Судя по вашему описанию, у вас есть один клиент с возможностями ЧТЕНИЕ-ЗАПИСЬ, а два клиента с возможностью ТОЛЬКО ДЛЯ ЧТЕНИЯ.

ВАРИАНТ 1. Вы можете сохранить данные в Excel в формате CSV (это очень небольшой объем данных, поэтому для их сохранения и чтения потребуется небольшая доля секунды).

Затем два клиента откроют файл в режиме только для чтения, загрузят данные и обновят отображение. Вам нужно будет включить обработку исключений для обоих типов клиентов:

  1. При одной записи обрабатывайте состояние ошибки, когда он пытается записать в то же время, когда один из клиентов пытается читать,

  2. При двух чтениях обрабатывать состояние ошибки при попытке открыть файл (только для чтения), пока другой процесс выполняет запись.

Поскольку операции записи и чтения будут занимать очень, ОЧЕНЬ короткое время (как было заявлено, небольшую долю секунды), эти условия будут очень редкими. Кроме того, поскольку оба клиента панели мониторинга будут открывать файл только для чтения, они не будут мешать друг другу, если попытаются открыть его в один и тот же момент.

Если вы хотите значительно снизить вероятность коллизий, вы можете установить таймеры (процесса обновления, с одной стороны, и процессов чтения, с другой) на первичное количество секунд. Например, таймер процесса обновления будет отсчитываться каждые 11 секунд, а таймер процесса чтения — каждые 7 секунд.

ВАРИАНТ 2. Установите канал TCP/IP между процессами, где основной процесс (т. была сохранена новая версия данных. После получения триггера оба процесса READ-ONLY будут обращаться к файлу и извлекать данные.

В этом случае вероятность столкновения станет близкой к нулю.

person FDavidov    schedule 12.11.2016