powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
18 сообщений из 18, страница 1 из 1
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796498
iamskiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi All !

Есть .ADP проект Access как клиентская форма + MS SQL Server 2000 как БД
необходимо ПРОГРАММНО из него выгружать таблицу в локальную аксесовскую БД (.mdb)
или Excel-вский файл (.xls) по желанию пользователя. Подскажите как это реализовать ?

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

Я пошел другим путем пытаюсь использовать методы TransferSpreadsheet и TransferDatabase
Но тут же наткнулся на грабли :

Private Sub BtnExport_Click()

Dim rs As New ADODB.RecordSet
Dim cn As New ADODB.Connection
Dim sql As String

Set cn = CurrentProject.Connection
Set rs = New ADODB.RecordSet
sql = "SELECT * FROM [dbo].[Test]"
rs.Open sql, cn, adOpenKeyset, adLockOptimistic

' Проверка что исходной таблице есть записи
If rs.RecordCount > 0 Then
DoCmd.TransferSpreadsheet acExport, , "Test", "D:\TestExcel.xls"
DoCmd.TransferDatabase acExport, "Microsoft Access", "D:\TestAccess.mdb", acTable, "Test", "MyTest", False
End If

End Sub

Не работает ни TransferSpreadsheet ни TransferDatabase, ругается одинаково :

"Microsoft Office Access can't find the object 'Test.'"

Я так понимаю что Application.DoCmd обращается наверное к какому то не тому Connection
т.к. в текущем соединении таблица Test присутствует (ее явно видно среди таблиц),
она не временная и не вьюха, а вполне стационарная. Впрочем я пробовал и другие
таблицы результат тот же.

Подскажите куда копать ? или какие-нибудь альтернативные варианты ?
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796506
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Копать в форум Access, для начала.
А про DTS-пакеты и права админа - поподробнее, плз. Никаких прав админа я своим пользователям не давал, все работает на ура. Надо, конечно, распространить несколько библиотек вместе с приложением, но не более того.
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796649
iamskiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А про DTS-пакеты и права админа - поподробнее плз...
Я так понимаю пакет который из MS SQL Server
формально можно вызвать двумя способами :
1) EXEC sp_OACreate 'DTS.Package' + sp_OAMethod 'LoadFromSQLServer' и 'Execute'
2) exec xp_cmdshell dtsrun /Ffilename /Npackage_name /Mpackage_password

и команды sp_*и xp_cmdshell - выполняются юзерами с правами админа БД, не меньше

Да и необходимые .dll для запуска dts-пакета после копирования на конечный компьютер необходимо зарегистрировать с помощью Regsvr32.exe - что невозможно без прав админа компа (это как раз мой случай).

Есть еще какие-нибудь варианта запуска DTS-пакетов ?
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796742
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, установку тоже с правами админа провести не можете? Опять попытка решить организационную проблему техническими средствами. заставьте админа нормально установить нужные библиотеки.
И спокойно используйте dtspkg.dll и объект DTSPackage2 для запуска пакета.
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796751
Breakneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796870
iamskiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что установку тоже с правами админа провести не можете?
Ну допустим я даже установлю необходимые dll. Но ведь это только решает половину проблемы.

И спокойно используйте dtspkg.dll и объект DTSPackage2 для запуска пакета.
Сам запуск dts-пакета возможен только юзером с правами сисадмина.
Из BOL: Only members of the sysadmin fixed server role can execute sp_OACreate.
А как раз этих прав я конечным юзерам давать не могу.

Использованные мною TransferDatabase и т.п. этой проблемы лишены !
Необходим только доступ на чтение самой выгружаемой таблицы и не более.
Так что DTS (в моем случае) тупиковая ветвь развития.

Есть еще идеи ?
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796902
наверно таблица Test создавалась владельцом базы, а адп смотрит в базу под клиентскими правами.
пробуйте вместо
DoCmd.TransferSpreadsheet acExport, , "Test", "D:\TestExcel.xls"

написать

DoCmd.TransferSpreadsheet acExport, , "dbo.Test", "D:\TestExcel.xls"
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796939
iamskiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробуйте вместо DoCmd.TransferSpreadsheet acExport "dbo.Test" "D:\TestExcel.xls"
Все таблицы в БД созданы под владелцем dbo.
И юзер может видеть и их структуру и данные только на чтение

А в TransferSpreadsheet я пробовал указывать и так
TransferSpreadsheet ... "имя_таблицы"
и так "владелец.имя_таблицы"
и так "имя_БД.владелец.имя_таблицы"
и даже запрос " select * from имя_БД.владелец.имя_таблицы"

результат одинаковый : "Microsoft Office Access can't find the object ..."
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796968
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А таблица Test каким образом создавалась?
дела в том что ADP-к засасывает служебную инфу через друго конект
и порой его надо подтолкнуть чтобы освежил инфу в коллекциях.
Например если таблица созданна из кода или в рез-те какого нибудь SELECT INTO
после подключения к базе
то в в окне базы ее не будет и TransferDatabase ее не увидит

Как вариант можно програмно создавать рядом MDB-к с линкованной таблицей и запускать экспорт из него.

PS Чтобы узнать о наличии срок не нужно тащить на клиента всю таблицу
Код: plaintext
1.
'If rs.RecordCount > 0 Then
If Not cn.Execute("SELECT top 1 1 AS RowExists FROM [dbo].[Test]").Eof Then
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33796970
только что проверил (зашел владельцем) - работает такой вариант

Код: plaintext
1.
DoCmd.OutputTo acTable, "ИмяТаблицы", "MicrosoftExcelBiff8(*.xls)", "c:\tmp\exceltest.xls", True, "",  0 

акс2002, адп
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33797000
iamskiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
только что проверил (зашел владельцем) - работает такой вариант
А как вы зашли по владельцем ?
У меня владелец dbo, а сисадмин другой логин, под ним и захожу
но
DoCmd.OutputTo acTable, "[dbo].[TEST]", "MicrosoftExcelBiff8(*.xls)", "D:\Test.mdb", True, "", 0
выдает все то же "Invalid object name 'dbo.TEST'."

сам конекшин прописан на уровне ADP т.е. в меню File\Connection

Может я каких то нужных модулей не включил в Tool\References ?


Latuk: А таблица Test каким образом создавалась?

to Latuk: Таблица создавалась средствами MS SQL Servera, как уже писал она статическая, не виртуальная и не динамическая

Как вариант можно програмно создавать рядом MDB-к с линкованной таблицей и запускать экспорт из него.
Как я понимаю прилинковать таблицу из MsSqlServer в mdb-файл можно только с помощью ODBC - это не удобно т.к. физический путь к базе
с конечного компьютера конечный юзер знать не должен,
другое дело в ADP - достаточно IP,имя базы,логин и пароль прописанные заранее в свойствах connection проекта.
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33797032
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>другое дело в ADP - достаточно IP,имя базы,логин и пароль прописанные заранее в свойствах connection проекта.
Что мешает вынуть эти значения из свойств проекта
и создав MDB-к создать в нем линкованную таблицу или запрос
с этими параметрами?
При чем здесь юзер?
Все произойдет без его участия.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim q As DAO.QueryDef 
Dim dbe As DAO.DBEngine
Dim WS As DAO.Workspace
Dim db As DAO.Database
app As Access.Application

Set dbe = New DAO.DBEngine 
Kill CurrentProject.Path + "\__tmp.mdb" 
Set db = dbe.Workspaces( 0 ).CreateDatabase(CurrentProject.Path + "\__tmp.mdb", dbLangGeneral) 
Set q = db.CreateQueryDef("spq") 
q.Connect = "ODBC;DRIVER={SQL Server};SERVER=" +  CurrentProject.Connection.Properties("Data Source")+ ";DATABASE=" +  CurrentProject.Connection.Properties("Initial Catalog")+ ";Trusted_Connection=yes;dsn=;" 
'Для  скульной аутентификации см. WizHook.AdpUIDPwd
q.SQL = "SELECT * FROM [dbo].[Test]" 
q.Close 
......................
закрываем нашу базу и подымаем ее как асс приложение и выполняем в ней все че надо
В принципе можно создать шаблон MDB-ка
хранить его в базе
подсасывать с сервера
потом тока таблицы в нем приязывать
можно даже на морду ниче не выводить
а можно веселеньких прогресбоксов напихать
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33797062
специально проверил еще раз под пользовательским логином
работают оба варианта выгрузки -
DoCmd.TransferSpreadsheet
и
DoCmd.OutputTo

особенности такие

1) DoCmd.TransferSpreadsheet не пишет поверх существующего файла
2) под клиентским логином имя должно быть сформировано как "dbo.ИмяТаблицы" и никак иначе.

3) DoCmd.OutputTo под колиентским логином принимает варианты:
"ИмяТаблицы", "dbo.ИмяТаблицы" и даже "[dbo].[ИмяТаблицы]"
В последнем случае ругается уже Эксель, считая такое имя незаконным для имени страницы и самостоятельно исправляя ее.

все под Офис ИксПи.

У меня тоже есть вопрос:
Я не знаю как обойтись с такой ситуацией:
(очень прошу помочь знающих)

пусть есть таблица, создана под интегрированным логином
ИмяДомена\ИмяПользователя
Как правильно обращаться к объектам с такими владельцами в адо, адп, mdb+odbc?
Варианты вида
"ИмяДомена\ИмяПользователя.ИмяТаблицы" у меня не прокатывали в адо.
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33804131
iamskiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Снова прошу помощи ...

С экпортом в Excel проблема решена чудесно с помощью DoCmd.OutputTo (спасибо Guest-у) экпортирует все что угодно, даже вьюхи - то что мне и надо.

Теперь тоже самое проделать бы с локальным .mdb
:-( метод TransferDatabase мне уже не подходит т.к. Query он не экспортирует в MDB файл

DTS - не рассматриваем

Значит остается вариант типа INSERT INTO target SELECT * FROM source

Ушел от ADP, сделал MDB в котором хочу прилинковать SQL Server, НО
ведь по примеру от Latuk я должен через ODBC указать конкретную папку где лежит mdf моего SQL Server, так ? Но тут вопрос:
экспорт будет осуществлять юзер с ограниченными правами и и видеть он будет только выгружаемую вьюху и путь к базе ему в принципе будет не доступен (из-за политики безопасности), что делать в этом случае ?
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33804457
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>через ODBC указать конкретную папку где лежит mdf моего SQL Server
Ничего то ты не понял
какая на папка серввера?-Имя сервера или его IP-ник точно так же как в adp
Какие права есть такую вьюху и сможет увидеть
никакие файлы на сервере юзер видеть не должен
он открывает подключение на сервере
и сервер пускает его с теми правами которые ему пропишешь
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33806500
VeroNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iamskiv Но тут вопрос:
экспорт будет осуществлять юзер с ограниченными правами и и видеть он будет только выгружаемую вьюху и путь к базе ему в принципе будет не доступен (из-за политики безопасности), что делать в этом случае ?
А как насчет создать файловый DSN и через него подключаться?
Пользователь в этом случае выбирает только имя DSN? не вникая в подробности...
У меня тоже возникала необходимость переносить БД из SQL Server в mdb...
Но возникла проблема с TranferDatebase, так как таблицу этой командой можно импортировать только в ЛОКАЛЬНУЮ mdb (без проблем), а мне нужно было в удаленную...
Просто имей это в виду, когда будешь пользоваться этой командой....
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33806516
VeroNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iamskivHi All !
DoCmd.TransferDatabase acExport, "Microsoft Access", "D:\TestAccess.mdb", acTable, "Test", "MyTest", False


Это строка неправильная!
Вот как делала я:

DoCmd.TransferDatabase acImport, "ODBC", myConnDB, acTable, rsForm!Name, rsForm!Name, False, True

где

myConnDB = "ODBC;DRIVER=SQL SERVER;" & Mid(myConnect, InStr(1, myConnect, "SERVER"), myLen)
rsForm!Name - имя таблицы....
...
Рейтинг: 0 / 0
Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
    #33806529
VeroNa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыла скаать, что этот текст запускается из локальной mdb... То есть идет выборка данных из SQL Servera в mdb...
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экспорт из ADP в MDB или XSL с помощью TransferDatabase и TransferSpreadsheet
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]