Как выполнить импорт данных из Excel (добавление и обновление)

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


Результат: новые данные добавляются, а существующие не обновляются.
im_vooov
Дата: 20.02.2008 11:04:51
Cyrila
Дата: 20.02.2008 11:09:10
im_vooov
Поиск


Я бы не стал создавать новой темы не прочитав существующих тем. После чтения того, что было предложено найти ответ на свой вопрос не смог.
Вариант создания промежуточных таблиц не является решением задачи.
im_vooov
Дата: 20.02.2008 11:15:07
вот вариант (в комментариях) http://am.rusimport.ru
Cyrila
Дата: 20.02.2008 11:28:34
im_vooov
вот вариант (в комментариях) http://am.rusimport.ru

Благодарю за помощь!
Cyrila
Дата: 20.02.2008 11:59:44
im_vooov
вот вариант (в комментариях) http://am.rusimport.ru


Пример хороший, если я правильно понял импорт данных осуществляется через промежуточные таблицы. В моем случае - это невыполнимо.
Karfaqen
Дата: 20.02.2008 12:14:11
Для того, чтобы сделать обновление существующих записей, вам требуется установить соответствие записей источника и приемника - т.е. как указать, что некая исходная запись соответствует уже имеющейся, которую и надо обновить. Это значит, что вы должны задать КРИТЕРИЙ такого соответствия.

Например, если у вас в источнике и приемнике есть поля уникального кода записи, вы можете сделать критерием соответствия записей равенство значений в этих полях. Тогда для обновления вам потребуется для каждой исходной записи НАЙТИ в приемнике запись с таким же кодом и обновить поля найденной записи значениями полей источника.

Искать эти записи и обновлять их можно разными способами. Например, СВЯЗАТЬ (INNER JOIN) в запросе на обновление (UPDATE) эти две таблицы по этому полю кода (исходную таблицу можно присоединить), и выполнить SET значений для нужных полей.

Либо программно - открыть RECORDSET для исходной таблицы и в цикле для каждой ее записи делать поиск по этому же коду в Recordset'е принимающей таблицы - при нахождении делать Edit/Update записи.
Cyrila
Дата: 20.02.2008 12:24:14
Karfaqen
Для того, чтобы сделать обновление существующих записей, вам требуется установить соответствие записей источника и приемника - т.е. как указать, что некая исходная запись соответствует уже имеющейся, которую и надо обновить. Это значит, что вы должны задать КРИТЕРИЙ такого соответствия.

Например, если у вас в источнике и приемнике есть поля уникального кода записи, вы можете сделать критерием соответствия записей равенство значений в этих полях. Тогда для обновления вам потребуется для каждой исходной записи НАЙТИ в приемнике запись с таким же кодом и обновить поля найденной записи значениями полей источника.

Искать эти записи и обновлять их можно разными способами. Например, СВЯЗАТЬ (INNER JOIN) в запросе на обновление (UPDATE) эти две таблицы по этому полю кода (исходную таблицу можно присоединить), и выполнить SET значений для нужных полей.

Либо программно - открыть RECORDSET для исходной таблицы и в цикле для каждой ее записи делать поиск по этому же коду в Recordset'е принимающей таблицы - при нахождении делать Edit/Update записи.


Ключевые поля в наличие имеются - 4 шт. А для совершения поиска способом Recordset необходимо код для каждого поля писать или достаточно указать таблицу? Читаю ХП, но он весь на английском. Есть русскоязычный источник или пример?
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'е здешнем есть
Cyrila
Дата: 20.02.2008 13:59:02
У кого-нибудь есть конкретный и подробный пример с комментариями по обновлению двух таблиц через Recordset?