2013-07-02 2 views
1

у меня есть процедура VBA (за формой), которая выполняет следующие действия; -Access VBA - обнаружить дублированные записи

  • импортирует данные из файла XML в ч пустой временную таблицу (с одним ключевым полем называется ID)
  • создает таблицу на основе запроса из временной таблицы
  • добавляет данные в таблицу резервного копирования с помощью запроса дописывания (резервная таблица имеет такой же формат таблицы, как временную таблицу, то есть ключевое поле называется ID)
  • удаляет все из temp ready для следующего запуска

После импорта данных из XML я хочу уметь записывать сценарии, в которых один и тот же файл пытается дважды импортироваться (т. где таблица temp содержит идентификаторы, которые также существуют в таблице резервного копирования), сообщите пользователю через msgbox, а затем закройте Sub.

Я бы подумал, что это будет возможно сделать с помощью обработки кода ошибки при попытке добавить, захватив ошибку о дублирующих ключах.

У меня есть запрос на добавление к резервной копии, и если я запустил этот запрос с помощью самого запроса, я получаю предупреждения и т. Д. О наличии дубликатов, с возможностью продолжить выполнение запроса или нет.

Однако, я делаю это в VBA через OpenQuery (и отключил предупреждения), и поэтому ничего не происходит? Кажется, я не вижу код ошибки.

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

+0

Я неясно, как таблица вписывается в это.Вы все еще хотите создать таблицу, если в таблице temp есть строки, которые дублируются в таблице резервного копирования? – HansUp

+0

Нет. Он должен обнаружить это и дать пользователю четкое сообщение о том, что дубликаты присутствуют и проверить входной файл. –

ответ

0

«Я делаю это в VBA через OpenQuery (и отключил предупреждения), и поэтому ничего не происходит? Кажется, я не вижу код ошибки».

Отключение SetWarnings выключает подавление информации в целом, поэтому ваше ожидаемое сообщение об ошибке не появляется. Многие опытные разработчики Access советуют поворачивать SetWarnings off - плохая идея. См. this SO question для другого примера того, как устранить проблему можно с помощью SetWarnings.

Поскольку у вас есть «append query», выполните его с помощью метода DAO.Database .Execute вместо использования OpenQuery.

Dim db As DAO.Database 
Dim strInsert As String 
strInsert = "INSERT INTO backup_table(ID, fld1, fld2)" & vbCrLf & _ 
    "SELECT ID, fld1, fld2 FROM temp_table" 
Set db = CurrentDb 
db.Execute strInsert, dbFailOnError 

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

Отдельно, если вы хотите подсчет дубликатов, этот запрос должен дать вам это.

SELECT Count(*) AS count_of_duplicates 
FROM 
    temp_table AS t 
    INNER JOIN backup_table AS b 
    ON t.ID = b.ID 

Если вы хотите вставить, не дублировать temp_table строки в backup_table, попробуйте запрос, как это ...

INSERT INTO backup_table(ID, fld1, fld2) 
SELECT t.ID, t.fld1, t.fld2 
FROM 
    temp_table AS t 
    LEFT JOIN backup_table AS b 
    ON t.ID = b.ID 
WHERE b.ID Is Null 
+0

Спасибо. Я использовал ваш метод DAO.Database .Execute, и теперь он дает диалог «ошибка 3022» о дублирующих ключах и останавливает процесс (это то, что я хотел). Это нормально, но я хочу получить более удобный текст ошибки для пользователя. Как изменить текст ошибки? –

+0

Вы можете добавить обработчик ошибок к процедуре VBA, чтобы захватить ошибку 3022 и отобразить пользовательское сообщение пользователю. Однако, основываясь на вашем ответе на таблицу, возможно, вам следует сначала пересчитать дубликаты. Если 'count_of_duplicates' = 0, напишите таблицу и добавьте строки таблицы temp в таблицу резервного копирования. Если 'count_of_duplicates'> 0, уведомите пользователя. – HansUp

+0

Хорошо, но как я могу определить в VBA значение count_of_duplicates в выражении VBA if? Это поле, возвращаемое запросом ... –