#sql #excel #vba #ms-access #adodb
#sql #excel #vba #ms-access #adodb
Вопрос:
У меня есть проект, в котором пользователям нужно будет заполнить файл Excel, а затем экспортировать данные в базу данных Access. Данные, собранные в файле Excel, необходимо будет экспортировать в 3 этапа: (1) экспортировать запись набора данных 1, (2) запросить доступ к первичному ключу (автономер) вновь импортированной записи, (3) экспортировать запись набора данных 2, которая включает заполненный первичный ключ в качестве внешнего ключа.
Я могу выполнить первый шаг, установив и открыв соединение ADODB. Однако я сталкиваюсь с проблемами на втором шаге, когда мне нужно выполнить внутреннее соединение в таблице Access и Excel.
wlodb.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:Users" amp;userSID amp; "DesktopWLO Ramp;C Database_10-4-16.accdb"
sqlFindREMPK = "Select ID " _
amp; "FROM [test1] a " _
amp; "INNER JOIN [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:UserRED-WIP.xlsm].[REM Upload$] b " _
amp; "ON a.[REM_ID_Database] = b.[REM_ID_Database] " _
amp; "WHERE (((a.[REM_ID_Database])=""REM9811044""));"
WLOrs.Open sqlFindREMPK, wlodb
ActiveSheet.Range("A10").CopyFromRecordset (WLOrs)
Имя таблицы и рабочего листа имеют одинаковые имена полей. Проблема связана с предложением SELECT . Если я оставлю все как есть, я получу сообщение об ошибке, в котором говорится, что поле может ссылаться на более чем одну таблицу в предложении FROM . Если я добавлю имя таблицы, например [test1].[ID] затем я получу сообщение о том, что для требуемых параметров не задано значение. Если я немного изменю имя поля Excel на ID1 и оставлю предложение SELECT как просто ID, код будет работать нормально.
Комментарии:
1. Вы пробовали использовать псевдоним
select a.ID
?2. Это сработало. Я не думал об использовании псевдонима, прежде чем объявлять его в предложении FROM . Кажется немного нелогичным, но это сработало.
Ответ №1:
Как только вы предоставляете псевдоним для таблицы, вы должны использовать этот псевдоним при обращении к этой таблице. Вы больше не можете получить доступ к таблице по ее первоначальному имени.
sqlFindREMPK = "Select a.ID " _
amp; "FROM [test1] a " _
amp; "INNER JOIN [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:UserRED-WIP.xlsm].[REM Upload$] b " _
amp; "ON a.[REM_ID_Database] = b.[REM_ID_Database] " _
amp; "WHERE (((a.[REM_ID_Database])=""REM9811044""));"
Комментарии:
1. В качестве альтернативы, мы могли бы нажать @sgeddes, чтобы дать на этот старый вопрос новый ответ!