|
|
|
| Выдает сообщение, что ActiveX компонент не может создать объект...
В чем тут дело?
Кто нибудь сталкивался с подобным? | |
|
| |
|
|
|
| извините,
а где пример кода? | |
|
| |
|
|
|
| И шо может дать этот пример кода?
Разве што глянуть как регется этот актив икс | |
|
| |
|
|
|
| Ну извини, FORMAT - я подумал может так нагляднее разговор получиться - нежели ни о чём...
Был не прав | |
|
| |
|
|
|
| Вероятно Объект который вы пытаетесь Create отсутвует или криво зарегистрирован | |
|
| |
|
|
|
| Dim appAccess As Access.Application
Set appAccess = CreateObject("Access.Application")
appAccess.OpenCurrentDatabase strActiveConnection, False
appAccess.DoCmd.CopyObject strReplicaName, , acTable, "tblWares"
appAccess.DoCmd.CopyObject strReplicaName, , acTable, "tblBarCode"
appAccess.DoCmd.CopyObject strReplicaName, , acTable, "tblAvailability"
Set appAccess = Nothing
Под Access все работает, глюк возникает при запуске под Runtime | |
|
| |
|
|
|
| а-а-а так вы ACCESS создаете...
Кажется Run-Time так нельзя создать т.к. он не запускается без MDB файла, попробуйте использовать GetObject("C:\Путь\ФАйл.mdb")
правда не совсем понятно зачем второй раз отрывать тот же MDB (мне показалось что именно это Вы делаете) | |
|
| |
|
|
|
| Запускается библиотечная процедура которая на данном кусочке кода КОПИРУЕТ таблицы из одного файла mdb в другой mdb
Определяющим мотивом является применение команды DoCmd.CopyObject
как самый простой путь.
И все работало, пока не потребовалось запускаться под Runtime | |
|
| |
|
|
|
| Может Вам попробовать создать запросом таблицу в другой базе прилинковав предварительно таблицу к текущей базе? | |
|
| |
|
|
|
| В том то и дело, что хочется уйти от этого гемороя:
ведь таблицу (а она не временная, это дополнительные локальные таблицы в создаваемой реплике), созданную по запросу, необходимо потом настраивать:
форматировать поля, уточнять типы данных, настраивать ключи и т.д.
т.е. явно делать, то, что "автоматом" делается при копировании объекта. | |
|
| |
|
|
|
| Провел зксперименты с тремя базами:
1.содержит копируемую таблицу
2.пустая
3.содержит функцию с кодом, аналогичном приведенному ранее
Под рантаймом все тот же результат
А ведь функции CreateObject, GetObject и команда New лежат в основе технологий
использования Access как сервера (клиента) автоматизации...
Получается, что под рантаймом не всякое приложение будет работоспособным.
А жаль, два привлекательных инструментария и оказывается не совмещаются ...
Полный облом. | |
|
| |
|
|
|
| Да в чем облом-то?
Что вам мешает заменить CreateObject на GetObject?
Вообще не видно никакой проблемы.
По поводу New: что мешает, например, хранить пустую БД в OLE поле и при необходимости сохранять на диск и использовать GetObject? | |
|
| |
|
|
|
| Пробовал все и CreateObject и GetObject и New с одним и тем же конечным результатом.
Простой пример из области технологии автоматизации.
запускается db3.mdb в которой по макросу AutoExec вызывается функция:
Public Function MyCopyTable()
On Error GoTo Err_MyCopyTable
Dim appAccess As Access.Application
' Dim appAccess As New Access.Application
MsgBox 1
' Set appAccess = CreateObject("Access.Application")
' appAccess.OpenCurrentDatabase "D:\Мои документы\db2.mdb", False
Set appAccess = GetObject("D:\Мои документы\db2.mdb", "Access.Application")
appAccess.DoCmd.CopyObject "D:\Мои документы\db1.mdb", , acTable, "tblWares"
Set appAccess = Nothing
MsgBox 2
Exit_MyCopyTable:
Exit Function
Err_MyCopyTable:
MsgBox Err & ": " & Error$
Resume Exit_MyCopyTable
End Function
В программе:
Формируется ссылка (по GetObject в данном случае) на приложение db2.mdb
В приложении db2.mdb запускается команда копирования таблицы в базу db1.mdb
Простейший пример.
Под полновесным Access все отрабатывает без проблем.
А вот под Runtime выдает сообщение:
429: ActiveX conponent can't create object
Причем вне зависимости от того как формируется ссылка на приложение выполняющее роль сервера автоматизации:
по CreateObject или GetObject или New
А проблема в том, что возникла потребность исполнения приложения,
используещего такого рода ссылки под рантаймом.
Само приложение я естествено не привожу, в нем своих сложностей хватает.
Но вот пример, без лишней шелухи, казалось бы проще простого.
И работать вроде бы должен, и в рантайме есть все нужные библиотеки в которых
присутствуют все нужные функции и объекты.
ВОТ ТАКАЯ НЕПОНЯТКА...
P.S. При запуске примера под Access в режиме /runtime все работает.
Не работает под "натуральным" рантаймом, хотя вроде бы и должен. | |
|
| |
|
|
|
| На какой строке возникает ошибка?
Вы пробовали вместо
Dim appAccess As Access.Application
Set appAccess = GetObject("D:\Мои документы\db2.mdb", "Access.Application")
|
использовать
Dim appAccess As Object
Set appAccess = GetObject("D:\Мои документы\db2.mdb")
|
Я разрабатывал проекты для рантайм и особых проблем не было.
Сейчас пока проверить негде.
Может быть скачаю рантайм 2007 и посмотрь | |
|
| |
|
|
|
| глючит всегда на Set appAccess = и т.д.
т.е. при создании экземпляра класса
Что характерно, глюк как-то связан с типом Access.Aplication
CreateObject при работе с объектами файловой системы
работает под рантаймом без проблем.
P.S. Я работаю по 2003 Office
Ваше последнее предложение я также опробировал.
С тем же результатом. | |
|
| |
|
|
|
| Установил на VM Access Runtime 2007.
Вы правы, указанный код приводит к ошибке.
Но достаточно немного подкорректировать и все работает:
Public Function MyCopyTable()
On Error GoTo Err_MyCopyTable
Dim appAccess As Object
Shell """" & Application.SysCmd(acSysCmdAccessDir) & "msaccess.exe"" ""D:\Мои документы\db2.mdb"""
Set appAccess = GetObject("D:\Мои документы\db2.mdb")
appAccess.DoCmd.CopyObject "D:\Мои документы\db1.mdb", , acTable, "blWare"
appAccess.Quit
Set appAccess = Nothing
Exit_MyCopyTable:
Exit Function
Err_MyCopyTable:
MsgBox Err & ": " & Error$
Resume Exit_MyCopyTable
End Function
|
Для того, чтобы избежать Security Warning создал Trusted Location для каталога с базами | |
|
| |
|
|
|
| Любопытно, но не совсем понятно.
Не могли бы вы пояснить происходящее
либо сослаться на источник, где бы рассматривался похожий случай.
P.S.
Наблюдал один феномен.
Вначале, в предложенной вами строке Shell и т.д.
допустил синтаксическую ошибку.
Вследствие чего приложение db2.mdb не было найдено и соответственно запущено,
(запустился и повис экземпляр Access)
но ввиду того, что такая ошибка в команде Shell, прерывания исполняемого кода не вызывает,
все отработало и отработало ожидаемым образом.
Получается, что в строке с Shell имя запускаемого приложения для нашего случая
не имеет значения. | |
|
| |
|
|
|
| Не могли бы вы пояснить происходящее
либо сослаться на источник, где бы рассматривался похожий случай.
Я добавил строку Shell исходя из логики, так что сослаться на источник не могу.
Известно, что GetObject("ИмяФайла.mdb) либо возвращает ссылку на приложение, если этот файл открыт, либо открывает этот файл в новом или запущенном Access.Application.
Раз не получился один вариант, я попробовал второй.
А описанный вами феномен вы наблюдали в Runtime? | |
|
| |
|
|
|
| Феномен он и есть феномен, ввиду отсутствия регулярной повторяемости.
Если чесно, то я сейчас и сам сомневаюсь и задаю себе ваш вопрос.
Спасибо за помощь. | |
|
| |