Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Как это сделать макросом? Руками знаю как, а вот макросом что то незнай как.
13 дек 17, 20:32    [21031964]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Для тех кто хочет помочь, но не понял что написано:
Как вот эту статью https://support.office.com/ru-ru/article/Импорт-данных-из-базы-данных-SQL-Server-или-связывание-с-ними-a5a3b4eb-57b9-45a0-b732-77bc6089b84e#ID0EABAAA=2010 сделать макромом на vba?
13 дек 17, 22:24    [21032186]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19586
Так макросом или на VBA?
+
Научись уже однозначно формулировать, не в детском саду...
13 дек 17, 23:20    [21032256]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Akina,ну как бы макросы пишутся на vba...
14 дек 17, 07:11    [21032490]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19586
BlackeAngel, на VBA пишут модули. А макросы - это макросы, для них даже вкладка одноимённая существует. Это не Эксель, где какой-то идиот модули решил называть макросами по причине отсутствия последних.
14 дек 17, 07:43    [21032506]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Akina, гм.. не знал, что именно все так плохо. Тогда модуль на vba.
14 дек 17, 07:46    [21032508]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19586
Вариант 1 (простой): через DoCmd.TransferDatabase с TransferType:=acLink.
Вариант 2 (посложнее): через DAO.database.CreateTableDef с присвоением соотв. .Connect и .SourceTableName.
Вариант 3: аналогично варианту 2, но через ADOX.
14 дек 17, 07:51    [21032511]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Akina, первый вариант рассмотрим?
14 дек 17, 08:20    [21032529]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19586
Да пжалста... сделай требуемое сперва именно макросом - там для каждого поля можно справку вызвать да почитать. А потом перенесёшь всё это в чистый VBA.
14 дек 17, 08:30    [21032539]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Линковать не стал, просто супер данные с серваке, как написано тут http://www.vb-helper.com/howto_ado_import_sql_server.html
15 дек 17, 23:04    [21038499]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
Сергей Лалов
Member

Откуда: localhost SPB
Сообщений: 1456
BlackeAngel
Линковать не стал, просто супер данные с серваке, как написано тут http://www.vb-helper.com/howto_ado_import_sql_server.html


Вы зря отказались от дальнейших попыток линка, по первому варианту Акины.
Потому что есть возможность линка таблиц/вьюшек, не привязываясь к конкретному экземпляру ODBC драйвера на стороне компьютера, где запускается ваш аксесс.
И во вторых потеряли возможность использовать в качестве формы ввода логина и пароля родной интерфейс коннектора, который сразу без костылей на стороне клиента (то бишь аксесса) использует права и доступ, написанный на стороне SQL server.
вот пример:
DoCmd.TransferDatabase acLink, "ODBC", "ODBC;DRIVER={SQL server};" _
& " SERVER=XX.XX.XXX.XXX; User=XXXX;Password=XXXX;DATABASE=XX_XXXX", acTable, "как_называется_таблица_на_сервере", "как_она_будет_называться_у_меня"


После выполнения линка таблицы с сервера привычно отображаются слева в трее как линкованные. Есть маленькая хитрость, если не указывать логин и пароль, то вас во время выполнения данной команды вас попросят ввести логин и пароль, вы его введите, но потом не сохраняйте , когда линковка закончиться.
Таблица разово прилинкуется, а потом, во время каждого открытия аксесса будет выскакивать это самое родное окно коннектора с просьбой ввести логин и пароль. Причем, независимо от того сколько вы залинковали таблиц, оно вводится один раз при загрузке аксесса и действует на время всей сессии в аксессе, на все таблицы, с правами и доступом соответственно, которые вы ввели при входе. (то есть если несколько юзеров, у которых права прописаны на стороне SQL server. будут вбивать их при входе, права на доступ к таблицам /вьюшкам при открытии базы в аксессе будут соответственно разные.)

Вторым нюансом является то, что такой способ (конкретно в коде выше) линкует таблицы без привязки к именованному экземпляру DSN, и база может запускаться и подключаться к серверу с любого компьютера , на котором есть аксесс , хоть от бабушки в Сызрани, хоть из фавел Колумбии.

Третьим нюансом является то, что в данном случае линковки вы не используете постоянные запросы к серверу в ADO , как вы прорекламировали по ссылке. После линковки объектов уже не надо ничего писать и поддержаивать лишнего. Функции поддержки соединения на себя берет встроенный ODBC driver. И вы на время работы в базе пользуетесь всем тем же классическим интерфейсом аксесса в полной мере возможностей.
20 дек 17, 19:25    [21049906]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Akina,

Прошло много времени, а проблема так и осталась - так никто не сказал как на vba прилинковать таблицу.

Используя ADO вне Access, например из Excel, или Word.
17 окт 19, 13:13    [21996475]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
Сергей Лалов,
Вы правы, что не стал делать линковку(связывание) таблицы. Тогда надо было на скорую руку. Теперь это стало тормозом. В Access сделав руками связанную таблицу, работа ускорилась в разы. Теперь надо это делать из VB6 или VBA, однако, вне Access.
Не знаю куда податься, поэтому пока пишу тут.
17 окт 19, 13:16    [21996484]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
court
Member

Откуда:
Сообщений: 1831
BlackeAngel
Akina,

Прошло много времени, а проблема так и осталась - так никто не сказал как на vba прилинковать таблицу.

Используя ADO вне Access, например из Excel, или Word.
сказали тут - 21032511 п.3

Пример отсюда - http://hiprog.com/index.php?option=com_content&task=view&id=251661555&Itemid=35
Public Sub ADOXCreateLinkTable(strFileName As String, _
                                strTblName As String, _
                                Optional strLinkTblName As String = "")
'создание связанной таблицы MS ACCESS
'strFileName - путь к БД ACCESS, в которой находится таблица
'strTblName - имя таблицы в исходной БД
'strLinkTblName - имя, под которым будет создана связанная таблица
'если strLinkTblName опущено, то создается таблица с именем strFileName
Dim adoxCat As ADOX.Catalog
Dim adoxTbl As New ADOX.Table
Dim strType As String
Set adoxCat = New ADOX.Catalog
'получаем ссылку на текущую БД
adoxCat.ActiveConnection = CurrentProject.Connection ' Тут нужен будет коннекшион к целевой БД Акса
If strLinkTblName = "" Then strLinkTblName = strTblName
With adoxTbl
    .ParentCatalog = adoxCat
    .Name = strLinkTblName 'имя создаваемой таблицы
    'путь к файлу
    .Properties("Jet OLEDB:Link Datasource").Value = strFileName ' Вместо этого, ODBC-коннекшион стринг к СКЛ серверу 
    'имя таблицы в исходном файле
    .Properties("Jet OLEDB:Remote Table Name").Value = strTblName
    .Properties("Jet OLEDB:Create Link").Value = True
End With
adoxCat.Tables.Append adoxTbl 'добавляем таблицу в БД
Set adoxCat = Nothing
Set adoxTbl = Nothing

End Sub
17 окт 19, 13:27    [21996495]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
ldfanate
Member

Откуда:
Сообщений: 145
вопрос в тему: есть старая клиент-серверная ADP-шка, которую в связи с миграцией на офис 2013 приходится переделывать в accdb+связи с таблицами SQLсервера.
В adp-шке порядка 100 таблиц, а специфика работы приложения такова, что пользователи весь год сидят, а в последний месяц перед сдачей годового отчёта их порядка 200шт ломятся толпой в приложение, и начинают чтото править.
т.е. 100x200 = 20000 коннекций к серверу возникает в пиковые дни.

Как можно минимизировать пиковую нагрузку от присоединённых таблиц?
Просто переделанное приложение проживёт ещё год максимум, и дальше на другую платформу все переедут. Т.е. кардинально переписывать смысла не имеет. Есть какоето менее трудозатратное решение?
17 окт 19, 13:53    [21996519]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
court,
На строке
.ParentCatalog = adoxCat

91 ошибка:
Object variable or With block variable not set
17 окт 19, 14:03    [21996538]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
court
Member

Откуда:
Сообщений: 1831
BlackeAngel
court,
На строке
.ParentCatalog = adoxCat


91 ошибка:
Object variable or With block variable not set
ты эту переменную так объявил, как в примере ?
Dim adoxTbl As New ADOX.Table
17 окт 19, 14:18    [21996557]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
court,
Пардон, ошибка в другом месте:
.Properties("Jet OLEDB:Link Datasource").Value = "[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"

Ошибка: не удаётся найти файл D:\Мои документы\[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"
Что он забыл там?
17 окт 19, 14:22    [21996563]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
court
BlackeAngel
court,
На строке
.ParentCatalog = adoxCat


91 ошибка:
Object variable or With block variable not set
ты эту переменную так объявил, как в примере ?
Dim adoxTbl As New ADOX.Table

Да, всё верно, new пропустил.
17 окт 19, 14:35    [21996584]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
court,
Всё у меня выглядит вот так
Public Sub ADOXCreateLinkTable(strFileName As String, _
                                strTblName As String, _
                                Optional strLinkTblName As String = "")
'создание связанной таблицы MS ACCESS
'strFileName - путь к БД ACCESS, в которой находится таблица
'strTblName - имя таблицы в исходной БД
'strLinkTblName - имя, под которым будет создана связанная таблица
'если strLinkTblName опущено, то создается таблица с именем strFileName
Dim adoxCat As ADOX.Catalog
Dim adoxTbl As New ADOX.Table
Dim strType As String
Set adoxCat = New ADOX.Catalog
'получаем ссылку на текущую БД
adoxCat.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Sourse='D:\Desktop\base_test.mdb"
If strLinkTblName = "" Then strLinkTblName = strTblName
With adoxTbl
    .ParentCatalog = adoxCat
    .Name = "155555"'имя создаваемой таблицы
    .Properties("Jet OLEDB:Link Datasource").Value = "[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"
    .Properties("Jet OLEDB:Remote Table Name").Value = "155555"
    .Properties("Jet OLEDB:Create Link").Value = True
End With
adoxCat.Tables.Append adoxTbl 'добавляем таблицу в БД
Set adoxCat = Nothing
Set adoxTbl = Nothing

End Sub
17 окт 19, 14:42    [21996592]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
court
Member

Откуда:
Сообщений: 1831
BlackeAngel
court,
Пардон, ошибка в другом месте:
.Properties("Jet OLEDB:Link Datasource").Value = "[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"


Ошибка: не удаётся найти файл D:\Мои документы\[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"
Что он забыл там?

так, имхо
.Properties("Jet OLEDB:Link Datasource").Value = "ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name"
17 окт 19, 14:43    [21996594]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
court
BlackeAngel
court,
Пардон, ошибка в другом месте:
.Properties("Jet OLEDB:Link Datasource").Value = "[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"


Ошибка: не удаётся найти файл D:\Мои документы\[ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name].[dbo].[tablename]"
Что он забыл там?

так, имхо
.Properties("Jet OLEDB:Link Datasource").Value = "ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name"

По-прежнему та же ошибка. Почему он вначале добавляет мои документы?
17 окт 19, 14:46    [21996596]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
court
Member

Откуда:
Сообщений: 1831
BlackeAngel
court
пропущено...

так, имхо
.Properties("Jet OLEDB:Link Datasource").Value = "ODBC;Driver=SQL Server;Server=server;APP=Microsoft Office;UID=UserName;PWD=абырвалг; DataBase=base_Name"


По-прежнему та же ошибка. Почему он вначале добавляет мои документы?


измени имя свойства с "Jet OLEDB:Link Datasource" на "Jet OLEDB:Link Provider String"
17 окт 19, 14:52    [21996604]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
court
Member

Откуда:
Сообщений: 1831
court
BlackeAngel
пропущено...

По-прежнему та же ошибка. Почему он вначале добавляет мои документы?


измени имя свойства с "Jet OLEDB:Link Datasource" на "Jet OLEDB:Link Provider String"
да, правильно, не та "пропертя" была

навсякий:
https://www.tek-tips.com/viewthread.cfm?qid=1081913
Public Function SQLServerLinkedTable()
Dim oCat As ADOX.Catalog
Dim oTable As ADOX.Table
Dim sConnString As String

' Set SQL Server connection string used in linked table.
sConnString = "ODBC;" & _
               "Driver={SQL Server};" & _
               "Server={bigtuna};" & _
               "Database=pubs;" & _
               "Uid=sa;" & _
               "Pwd=;"

' Create and open an ADOX connection to Access database
Set oCat = New ADOX.Catalog
oCat.ActiveConnection = CurrentProject.Connection

' Create a new Table object
Set oTable = New ADOX.Table

With oTable
    .Name = "authors"
    Set .ParentCatalog = oCat
    .Properties("Jet OLEDB:Create Link") = True
    .Properties("Jet OLEDB:Remote Table Name") = "authors"
    .Properties("Jet OLEDB:Link Provider String") = sConnString
End With

' Add Table object to database
oCat.Tables.Append oTable
oCat.Tables.Refresh
Set oCat = Nothing

End Function
17 окт 19, 14:55    [21996607]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
court
court
пропущено...


измени имя свойства с "Jet OLEDB:Link Datasource" на "Jet OLEDB:Link Provider String"
да, правильно, не та "пропертя" была

навсякий:
https://www.tek-tips.com/viewthread.cfm?qid=1081913
Public Function SQLServerLinkedTable()
Dim oCat As ADOX.Catalog
Dim oTable As ADOX.Table
Dim sConnString As String

' Set SQL Server connection string used in linked table.
sConnString = "ODBC;" & _
               "Driver={SQL Server};" & _
               "Server={bigtuna};" & _
               "Database=pubs;" & _
               "Uid=sa;" & _
               "Pwd=;"

' Create and open an ADOX connection to Access database
Set oCat = New ADOX.Catalog
oCat.ActiveConnection = CurrentProject.Connection

' Create a new Table object
Set oTable = New ADOX.Table

With oTable
    .Name = "authors"
    Set .ParentCatalog = oCat
    .Properties("Jet OLEDB:Create Link") = True
    .Properties("Jet OLEDB:Remote Table Name") = "authors"
    .Properties("Jet OLEDB:Link Provider String") = sConnString
End With

' Add Table object to database
oCat.Tables.Append oTable
oCat.Tables.Refresh
Set oCat = Nothing

End Function

Завелось. Ура, спасибо.
Теперь последний штрих - как сделать что б прилинкованная таблица не запрашивала пароль? То есть сделать с сохранением юзера и пароля.
17 окт 19, 15:00    [21996612]     Ответить | Цитировать Сообщить модератору
 Re: Прилинковать таблицу с сервера SQL макросом  [new]
BlackeAngel
Member

Откуда:
Сообщений: 552
BlackeAngel,
Сам нашёл
Надо в пропертях
Properties("Jet OLEDB:Cache Link Name/Password").Value = True

Тогда всё хорошо.
17 окт 19, 15:10    [21996626]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft Access Ответить