Архитектура приложения Excel

после 10 лет программирования я нахожусь в сложной задаче создания своего первого приложения Excel в Excel 2007. Я запрограммировал в VBA раньше на MS Access, так что это не совсем технический вызов для меня, но это реальная смена "Парадигма", смею сказать.

Теперь мне нужно реализовать приложение Excel, которое ведет переговоры с SQLServer (в специальной базе данных, которую я создаю), типичный материал CRUD, но то, что я не могу прочитать ни в одной книге (Excel Bible, Excel Power Programming и т.д.), как я должен структурировать приложение.

  • Могу ли я указывать имена в своих столбцах и использовать их в качестве столбца базы данных при отправке данных обратно в SQLServer

  • Когда я возвращаю данные, ожидаемые от приложения электронной таблицы, которые я, например, извлекаю ID, Описание (скрывая идентификатор в столбце и отображая описание), или я должен просто использовать описание для всего и хранить денормализованные данных в моих таблицах SQLServer, что делает их эквивалентными листы Excel на стороне сервера?

  • Если я хочу использовать нормализованные данные, например LookupTable (ID, Country), я должен хранить идентификатор, информацию о стране в диапазоне, и если да, то как заставить пользователя выбрать значение из этого диапазона ( ID, Страна) без использования соответствующего Combobox?

  • Когда я извлекаю данные из SQLServer, я должен моделировать его в ADODB.Recordset(например, вызывая представление или хранимую процедуру) и копировать его на лист, чтобы убедиться, что порядок полей в наборе записей так же, как в Листе, или есть лучший способ?

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

Спасибо.

Ответ 1

Я написал несколько приложений, похожих на те, которые вы описали, и пока я не могу притворяться, что предлагаю передовую практику, я могу комментировать, основываясь на моем личном опыте.

• Могу ли я дать имена моим столбцам и использовать их в качестве столбца базы данных при отправке данных обратно в SQLServer

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

• Если я хочу использовать нормализованные данные, например, для LookupTable (ID, Country), я должен хранить идентификатор, информацию о стране в диапазоне, и если да, то каким образом я могу заставить пользователя выбрать значение из этого диапазона (ID, Страна) без использования соответствующего Combobox?

Вы можете создавать отдельные (скрытые) листы для каждой таблицы поиска и принудительно выбирать выбор с помощью кода примерно так (на основе макросъемки, чтобы это можно было очистить)


    With Sheet1.Range("E3").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=B2:B5"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = "A sample"
        .ErrorTitle = "An error"
        .InputMessage = "Input message"
        .ErrorMessage = "Error message"
        .ShowInput = True
        .ShowError = True
    End With

Это даст вам поле со списком в ячейке, сообщение об ошибке при неудачной проверке и заголовок для ячейки.

• Когда я возвращаю данные, ожидаемые от приложения электронной таблицы, которые я, например, извлекаю из идентификатора, Описание (скрывая идентификатор в столбце и отображая описание), или я должен просто использовать описание для всего и хранить денормализованные данные в мои таблицы SQLServer, что делает их эквивалентом листа Excel на стороне сервера?

Это будет работать в любом случае. Идентификатор, вероятно, решает, основываясь на сложности данных. Если вам нужно собрать много кода проверки в VBA Id, у вас возникнет соблазн вытащить денормализованные данные в промежуточные таблицы в SQL Server и затем денормализовать использование хранимых процедур перед перемещением данных в ваши основные таблицы. YMMV.

• Когда я извлекаю данные из SQLServer, я должен моделировать его в ADODB.Recordset(например, вызывая представление или хранимую процедуру) и копировать его на Лист, следя за тем, чтобы порядок полей в наборе записей был одинаковым как в Листе, или есть лучший способ?

Я бы не использовал копирование и вставку, так как он использует системный буфер обмена, и странные вещи могут начаться, если вы используете ПК в одно время. Объект range в excel имеет метод CopyFromRecordset, который можно использовать для перемещения данных из ADO на рабочий лист. Это намного быстрее, чем повторение через набор записей, назначаемый вручную. Единственным недостатком является то, что вам придется заранее создавать заголовки заголовков.