Обновление таблицы в удаленной автономной базе данных в Access - PullRequest
0 голосов
/ 03 января 2019

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

У меня есть разные базы данных в одной и той же папке (все они в автономном режиме и могут распространяться повторно - это аналитический инструмент для использования с файлами CSV и TXT, созданными SAP.) Для компании крайне важно, чтобы этот инструмент находился в автономном режиме и работал VBA для доступа + SQL. Я пытаюсь обойти ограничение в 2 ГБ, используя различные базы данных. Одна из них - это центральная база данных, где у меня есть формы и код. У меня есть различные запросы на соединение, которые создают новые таблицы, которые используются для отчетов и т. Д.

Как я могу объединить две таблицы (существующие) в удаленной автономной базе данных (существующей) и вставить ее в новую таблицу (не существует) в базе данных (существующей)?

Sub adddatesALT()
Dim sDate As String
DoCmd.SetWarnings False
Dim ssql as String

dbinput - это база данных UNION с таблицами AGR_USERS_ALL, USR_02_ALL, и именно там находятся таблицы (FROM)

dboutput - это база данных с именем MASTER, и я хочу вставить таблицы (IN)

dbinput = "[" & Application.CurrentProject.Path & "\UNION.accdb" & "]"
dboutput = "[" & Application.CurrentProject.Path & "\MASTER.accdb" & "]"

Короткий вопрос - как включить путь в запрос на обновление?

DoCmd.RunSQL ("UPDATE AGR_USERS_ALL SET AGR_USERS_ALL.JNC_STATUS = 'ACTIVE' WHERE ((AGR_USERS_ALL.TO_DAT) > (AGR_USERS_ALL.CH_DATE));")

И главное - как включить этот путь в более сложный запрос, как этот

ssql = "SELECT AGR_USERS_ALL.AGR_NAME, AGR_USERS_ALL.UNAME, AGR_USERS_ALL.FROM_DAT, AGR_USERS_ALL.TO_DAT, AGR_USERS_ALL.COL_FLAG, AGR_USERS_ALL.JNC_STATUS, USR_02_ALL.JNC_STATUS, USR_02_ALL.USTYP, USR_06_ALL.LIC_TYPE INTO USR02_AGR_ACTIVE_ROLES"
ssql = ssql & " FROM (AGR_USERS_ALL INNER JOIN USR_02_ALL ON (AGR_USERS_ALL.UNAME = USR_02_ALL.BNAME) AND (AGR_USERS_ALL.[SYSTEM NO] = USR_02_ALL.[SYSTEM NO])) INNER JOIN USR_06_ALL ON (USR_02_ALL.BNAME = USR_06_ALL.BNAME) AND (USR_02_ALL.[SYSTEM NO] = USR_06_ALL.[SYSTEM NO])"
ssql = ssql & " WHERE (((AGR_USERS_ALL.COL_FLAG) Is Null) AND ((AGR_USERS_ALL.JNC_STATUS)<>'Expired') AND ((USR_02_ALL.JNC_STATUS)<>'Expired') AND ((USR_02_ALL.USTYP)<>'B' And (USR_02_ALL.USTYP)<>'L'));"
DoCmd.RunSQL ssql

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Большое спасибо!

Тем временем я нашел решение, но я тоже последую вашему совету;)

Мое решение:

Sub USR02AGRJOIN()
Dim ssql As String
Dim ssql2 As String
DoCmd.SetWarnings False

Dim dbinput As String
Dim dboutput As String

dboutput = "[" & Application.CurrentProject.Path & "\MASTER.accdb" & "]"
dbinput = "'" & Application.CurrentProject.Path & "\UNION.accdb" & "'"

ssql = "SELECT AGR_USERS_ALL.AGR_NAME, AGR_USERS_ALL.UNAME, AGR_USERS_ALL.FROM_DAT, AGR_USERS_ALL.TO_DAT, AGR_USERS_ALL.COL_FLAG, AGR_USERS_ALL.JNC_STATUS, USR_02_ALL.JNC_STATUS, USR_02_ALL.USTYP, USR_06_ALL.LIC_TYPE INTO " & dboutput & ".USR02_AGR_ACTIVE_ROLES"
ssql = ssql & " FROM (AGR_USERS_ALL INNER JOIN USR_02_ALL ON (AGR_USERS_ALL.UNAME = USR_02_ALL.BNAME) AND (AGR_USERS_ALL.[SYSTEM NO] = USR_02_ALL.[SYSTEM NO])) INNER JOIN USR_06_ALL ON (USR_02_ALL.BNAME = USR_06_ALL.BNAME) AND (USR_02_ALL.[SYSTEM NO] = USR_06_ALL.[SYSTEM NO]) IN " & dbinput & ""
ssql = ssql & " WHERE (((AGR_USERS_ALL.COL_FLAG) Is Null) AND ((AGR_USERS_ALL.JNC_STATUS)<>'Expired') AND ((USR_02_ALL.JNC_STATUS)<>'Expired') AND ((USR_02_ALL.USTYP)<>'B' And (USR_02_ALL.USTYP)<>'L'));"
DoCmd.RunSQL ssql

End Sub

Я только что боролся с синтаксисом:)

Спасибо еще раз!

0 голосов
/ 03 января 2019

У вас есть несколько способов сделать это


  1. Используйте предложение IN

Для короткого, который дает

DoCmd.RunSQL ("UPDATE AGR_USERS_ALL IN '" & dboutput  & "' SET AGR_USERS_ALL.JNC_STATUS = 'ACTIVE' WHERE ((AGR_USERS_ALL.TO_DAT) > (AGR_USERS_ALL.CH_DATE));")

  1. Ссылка внешние таблицы.

Это для меня лучшее решение. Связанные таблицы - одна из сильных сторон Access, и ваши запросы останутся простыми.

Чтобы сделать это эффективно, добавьте префикс имени связанной таблицы к имени базы данных, чтобы вы всегда знали, из какой БД является таблица

Для короткого, который дает

DoCmd.RunSQL ("UPDATE MASTER_AGR_USERS_ALL SET MASTER_AGR_USERS_ALL.JNC_STATUS = 'ACTIVE' WHERE ((MASTER_AGR_USERS_ALL.TO_DAT) > (MASTER_AGR_USERS_ALL.CH_DATE));")

Используйте точно такие же трюки для "основного". Неважно, является ли это оператором UPDATE или SELECT, или большим или коротким запросом.

...