Cyrila
Дата: 20.02.2008 10:59:30
Есть задача импортировать данные из Excel в Access с учетом обновления существующих и добавлением новых. Вариант с созданием связанной таблицы (внешних данных) не подходит, так как Excel файлы поступают от разных пользователей.
Пока известен только метод "TransferSpreadsheet", но он не обеспечивает выполнения задачи. Кто может помочь советом, полезной ссылкой или кодом прошу отозваться. Полный код отработки нажатия кнопки на импорт данных приведен ниже.
Private Sub Btn_Imprt_Click()
Dim result As Integer
With Application.FileDialog(1)
.ButtonName = "Добавить"
.AllowMultiSelect = False
.Filters.Clear
result = .Show
If result <> 0 Then
FileName = Trim(.SelectedItems.Item(1))
DoCmd.TransferSpreadsheet acImport, , TblName, FileName, True
End If
End With
End Sub
Результат: новые данные добавляются, а существующие не обновляются.
Karfaqen
Дата: 20.02.2008 12:14:11
Для того, чтобы сделать обновление существующих записей, вам требуется установить соответствие записей источника и приемника - т.е. как указать, что некая исходная запись соответствует уже имеющейся, которую и надо обновить. Это значит, что вы должны задать КРИТЕРИЙ такого соответствия.
Например, если у вас в источнике и приемнике есть поля уникального кода записи, вы можете сделать критерием соответствия записей равенство значений в этих полях. Тогда для обновления вам потребуется для каждой исходной записи НАЙТИ в приемнике запись с таким же кодом и обновить поля найденной записи значениями полей источника.
Искать эти записи и обновлять их можно разными способами. Например, СВЯЗАТЬ (INNER JOIN) в запросе на обновление (UPDATE) эти две таблицы по этому полю кода (исходную таблицу можно присоединить), и выполнить SET значений для нужных полей.
Либо программно - открыть RECORDSET для исходной таблицы и в цикле для каждой ее записи делать поиск по этому же коду в Recordset'е принимающей таблицы - при нахождении делать Edit/Update записи.
Karfaqen
Дата: 20.02.2008 12:44:08
|
Ключевые поля в наличие имеются - 4 шт. А для совершения поиска способом Recordset необходимо код для каждого поля писать или достаточно указать таблицу? |
Ну делайте критерий по значению всех четырех полей, в таком духе
'делаем критерий по значениям ключа источника
s = "Поле1=" & src("Поле1") & " AND " & _
"Поле2=" & src("Поле2") & " AND " & _
"Поле3=" & src("Поле3") & " AND " & _
"Поле4=" & src("Поле4")
'ищем в приемнике
dst.FindFirst s
Это для числовых полей, если строки - в кавычки заверните значения. В FAQ'е здешнем есть