#ms-access #append #suppress-warnings
Вопрос:
У меня есть ряд инструментов Excel, которые работают с базой данных Access (которая на самом деле является интерфейсом для ряда списков SharePoint). Каждый инструмент Excel имеет функцию экспорта, которая создает отдельный файл (CSV), содержащий данные для внесения в базу данных. В базе данных CSV поступает в виде локальной таблицы, и выполняется запрос добавления, чтобы добавить содержимое локальной таблицы в список SharePoint. Мне не нравится архитектура, но из-за надежности протоколов ИТ-безопасности моей компании это то, что я должен сделать.
Существует список столбцов, которые МОГУТ существовать в CSV, но существуют ли они или нет, зависит от данных, введенных в книгу. Например, вот все возможные заголовки столбцов:
- Экономия кВт * ч
- экономия кВт
- Экономия Природного Газа
- Экономия воды
- Экономия Мазута
- Экономия пропана
В зависимости от заказчика/здания/конечного использования некоторые поля могут не существовать. Например, если это калькулятор освещения, никакой экономии воды не будет, и, следовательно, эти колонки не будут существовать. Поскольку поле не существует, запрос добавления вызывает диалоговое окно с запросом значения параметра. Чего я пытаюсь добиться, так это того, чтобы он этого не делал. У меня нет предпочтения, просто ли оно игнорирует поле или по умолчанию равно 0. Есть какие-нибудь мысли? Вот мои запросы, которые заставляют все это работать:
[AppendFilter]
SELECT csv.*
FROM csv LEFT JOIN sharepoint ON (csv.FIM_Unique = sharepoint.FIM_Unique) AND (csv.[Building ID] = sharepoint.Building)
WHERE (((sharepoint.FIM_Unique) Is Null) AND ((sharepoint.Building) Is Null) AND ((csv.FIM_Unique) Is Not Null));
[AppendData]
INSERT INTO sharepoint ( FIM_Unique, FIM_Designation, [FIM Description], Safety_Factor, Building, [kWh Savings], [kW Savings], [Natural Gas Savings], [Water Savings], [Fuel Oil Savings], [Propane Savings] )
SELECT [AppendFilter].FIM_Unique, csv.[FIM Designation], csv.[FIM Description], csv.[Safety Factor], [AppendFilter].[Building ID], [AppendFilter].[kWh Savings], [AppendFilter].[kW Savings], [AppendFilter].[Natural Gas Savings], [AppendFilter].[Water Savings], [AppendFilter].[Fuel Oil Savings], [AppendFilter].[Propane Savings]
FROM [AppendFilter]. INNER JOIN csv ON [AppendFilter].FIM_Unique = csv.FIM_Unique
WHERE ((([AppendFilter].FIM_Unique) Is Not Null) AND (([AppendFilter].[Building ID]) Is Not Null));
Я пробовал DoCmd.SetWarnings False
при выполнении запроса, но эти предупреждения кажутся невосприимчивыми к этому!
Комментарии:
1. Являются ли эти объекты запроса, которые вы запускаете? Используйте VBA для динамического построения инструкций SQL.
2. И эти всплывающие окна не являются предупреждениями, они запрашивают доступ к отсутствующей информации.
3. Как бы это выглядело, чтобы создать динамическую инструкцию SQL для этого?
Ответ №1:
Можно использовать VBA для динамического построения и выполнения действий SQL. Один из способов-с помощью DAO TableDefs выполнить итерацию по полям таблицы, создать строку имен полей и использовать строковую переменную для построения инструкции SQL. Я не думаю, что нужно объединять CSV с AppendFilter. Во-первых, это приводит к запросу SELECT с повторяющимися именами полей, и это приведет к путанице, если поля не имеют префикса имени таблицы.
Однако это усложняется, если имена полей не совпадают в исходной и целевой таблицах. Я вижу некоторые различия с подчеркиванием и Building ID
в отличие от Building
. Поскольку существует только 3 поля с вариациями, создайте строковую переменную с условным кодом, чтобы проверить наличие определенных имен полей и внести соответствующие коррективы.
Dim db As DAO.Database, td As DAO.TableDef, fd As DAO.Field, strD As String, strF As String
Set db = CurrentDb
Set td = db.TableDefs("csv")
For Each fd In td.Fields
strF = fd.Name
If strF = "FIM Designation" Or strF = "Safety Factor" Then strF = Replace(strF, " ", "_")
If strF = "Building ID" Then strF = "Building"
strD = strD amp; "[" amp; strF amp; "],"
Next
strD = Left(strD, Len(strD) - 1)
db.Execute "INSERT INTO sharepoint(" amp; strD amp; ") " amp; _
"SELECT * FROM csv " amp; _
"WHERE FIM_Unique IN(SELECT FIM_Unique FROM AppendFilter)"
Я настоятельно рекомендую не использовать пробелы или знаки препинания/специальные символы в соглашении об именах. Подчеркивание-единственное исключение, но я его тоже никогда не использую.