Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Вызов запроса MSAccess из Delphi   Найти похожие ветки 

 
Slider007 ©   (2004-04-13 12:16) [0]

Здравствуйте !
У меня возникла такая проблема:
В MSAccess я создал запрос (MyQuery), в котором используется написанная на встроенном VisualBasic"е функция (MyFunc)
Так вот когда я питаюсь выполнить этот запрос:

ADOQuery.SQL.Text := "Exec MyQuery";
ADOQuery.Active   := true;

..у неня вылетает ошибка: "Неопределенная функция "MyFunc" в выражении"

В самом Аксессе это запрос выполняется без проблем.

Скажите пжалста в чём моя ошибка :)
Заранее спасибо.


 
Slider007 ©   (2004-04-13 12:16) [0]

Здравствуйте !
У меня возникла такая проблема:
В MSAccess я создал запрос (MyQuery), в котором используется написанная на встроенном VisualBasic"е функция (MyFunc)
Так вот когда я питаюсь выполнить этот запрос:

ADOQuery.SQL.Text := "Exec MyQuery";
ADOQuery.Active   := true;

..у неня вылетает ошибка: "Неопределенная функция "MyFunc" в выражении"

В самом Аксессе это запрос выполняется без проблем.

Скажите пжалста в чём моя ошибка :)
Заранее спасибо.


 
sniknik ©   (2004-04-13 12:20) [1]

MyFunc компилируется и выполняется access-ом, дельфевская прога про нее ничего не знает, и встроеного вижуал бейсика не имеет.

в общем нельзя так делать.


 
sniknik ©   (2004-04-13 12:20) [1]

MyFunc компилируется и выполняется access-ом, дельфевская прога про нее ничего не знает, и встроеного вижуал бейсика не имеет.

в общем нельзя так делать.


 
Slider007 ©   (2004-04-13 12:21) [2]

понятно, спасибо


 
Slider007 ©   (2004-04-13 12:21) [2]

понятно, спасибо


 
Anatoly Podgoretsky ©   (2004-04-13 12:23) [3]

MSAccess является OLE сервером, так что можешь рулить им как угодно.


 
Anatoly Podgoretsky ©   (2004-04-13 12:23) [3]

MSAccess является OLE сервером, так что можешь рулить им как угодно.


 
Digitman ©   (2004-04-13 12:25) [4]


> В самом Аксессе


Access как среда включает в себя интерпретатор VBA-программ
ADO же никаких VBA-программ не знает

Для того чтобы можно было вызывать на выполнение запросы, содержащие VBA-ссылки, следует отказаться от ADO и работать именно с Access-объектом


 
Digitman ©   (2004-04-13 12:25) [4]


> В самом Аксессе


Access как среда включает в себя интерпретатор VBA-программ
ADO же никаких VBA-программ не знает

Для того чтобы можно было вызывать на выполнение запросы, содержащие VBA-ссылки, следует отказаться от ADO и работать именно с Access-объектом


 
asafr   (2004-04-13 12:48) [5]

Связка компонентов AdoConnection->AdoStoredProc
В AdoStoredProc в Object Inspector вручную в свойстве AdoStoredProc.ProcedureName прописываешь имя запроса MyQuery. Вручную, потому что по умолчанию не предлагается список запросов, наподобии того, если б ты работал с MS SQL Server... И теперь используй AdoStoredProc на здоровие...


 
asafr   (2004-04-13 12:48) [5]

Связка компонентов AdoConnection->AdoStoredProc
В AdoStoredProc в Object Inspector вручную в свойстве AdoStoredProc.ProcedureName прописываешь имя запроса MyQuery. Вручную, потому что по умолчанию не предлагается список запросов, наподобии того, если б ты работал с MS SQL Server... И теперь используй AdoStoredProc на здоровие...


 
asafr   (2004-04-13 12:49) [6]

Пардон... В MS SQL не список запросов, а список SP предлагается


 
asafr   (2004-04-13 12:49) [6]

Пардон... В MS SQL не список запросов, а список SP предлагается


 
sniknik ©   (2004-04-13 13:01) [7]

asafr   (13.04.04 12:48) [5]
тут проблема не в получении списка и не в самом запросе, а в том что внутри процедура написаная в access используется.


 
sniknik ©   (2004-04-13 13:01) [7]

asafr   (13.04.04 12:48) [5]
тут проблема не в получении списка и не в самом запросе, а в том что внутри процедура написаная в access используется.


 
Digitman ©   (2004-04-13 13:21) [8]


> asafr


с AccessVBA-кодом может работать только сам Access


 
Digitman ©   (2004-04-13 13:21) [8]


> asafr


с AccessVBA-кодом может работать только сам Access


 
Slider007 ©   (2004-04-13 13:39) [9]

хмм, так я ничего и не понял :)
у кого-нибудь это на практике получалось ?
дайте пожалуйста окончательный ответ :)


 
Slider007 ©   (2004-04-13 13:39) [9]

хмм, так я ничего и не понял :)
у кого-нибудь это на практике получалось ?
дайте пожалуйста окончательный ответ :)


 
Digitman ©   (2004-04-13 13:45) [10]


> Slider007


вердикт окончательный и обжалованию не подлежит : ADO не дает возможности исполнять любые запросы, содержащие тексте ссылки на VBA-процедуры.. исполнение таких запросов - прерогатива самого Access, ибо только он сам знает, что делать когда в тексте встречается такая ссылка


 
Digitman ©   (2004-04-13 13:45) [10]


> Slider007


вердикт окончательный и обжалованию не подлежит : ADO не дает возможности исполнять любые запросы, содержащие тексте ссылки на VBA-процедуры.. исполнение таких запросов - прерогатива самого Access, ибо только он сам знает, что делать когда в тексте встречается такая ссылка


 
Slider007 ©   (2004-04-13 13:48) [11]

А вообще есть способ из Delphi выполнить такой запрос ?


 
Slider007 ©   (2004-04-13 13:48) [11]

А вообще есть способ из Delphi выполнить такой запрос ?


 
Digitman ©   (2004-04-13 13:54) [12]

есть.

отказаться от АДО и работать непосредственно с Access как с внешним сервером автоматизации


 
Digitman ©   (2004-04-13 13:54) [12]

есть.

отказаться от АДО и работать непосредственно с Access как с внешним сервером автоматизации


 
Slider007 ©   (2004-04-13 13:59) [13]

Digitman, если не трудно, объясни пожалуйста, каким образом это осуществить (работать непосредственно с Access как с внешним сервером автоматизации), и что такое "внешний сервер автоматизации"
или если тебе известна какая-нибудь ссылка в инете по этому вопросу, дай мне её пожалуйста :)


 
Slider007 ©   (2004-04-13 13:59) [13]

Digitman, если не трудно, объясни пожалуйста, каким образом это осуществить (работать непосредственно с Access как с внешним сервером автоматизации), и что такое "внешний сервер автоматизации"
или если тебе известна какая-нибудь ссылка в инете по этому вопросу, дай мне её пожалуйста :)


 
Digitman ©   (2004-04-13 14:12) [14]


> Slider007


у тебя в палитре компонентов делфи есть закладка Servers ?


 
Digitman ©   (2004-04-13 14:12) [14]


> Slider007


у тебя в палитре компонентов делфи есть закладка Servers ?


 
Slider007 ©   (2004-04-13 14:15) [15]

Есть !


 
Slider007 ©   (2004-04-13 14:15) [15]

Есть !


 
sniknik ©   (2004-04-13 14:24) [16]

Slider007 ©   (13.04.04 14:15) [15]
> Есть !
забудь о ней. ;о) это зделаеш зато заполучиш другие проблеммы.


 
sniknik ©   (2004-04-13 14:24) [16]

Slider007 ©   (13.04.04 14:15) [15]
> Есть !
забудь о ней. ;о) это зделаеш зато заполучиш другие проблеммы.


 
sniknik ©   (2004-04-13 14:25) [17]

если только так, в порядке самообразования...


 
sniknik ©   (2004-04-13 14:25) [17]

если только так, в порядке самообразования...


 
Slider007 ©   (2004-04-13 14:29) [18]

конечно и для самообразования !
дайте хотя бы ссылку на документацию какую-нибудь :)
пожалуйста


 
Slider007 ©   (2004-04-13 14:29) [18]

конечно и для самообразования !
дайте хотя бы ссылку на документацию какую-нибудь :)
пожалуйста


 
Digitman ©   (2004-04-13 14:35) [19]

впрочем, это мало поможет тебе...

var
 Access: OleVariant;

..

 Access := CreateOleObject("Access.Application");

далее к объекту Access применяешь те методы, которые позволяют получить требуемый объект Recordset

подробности - в хэлпе на MS Access VBA


 
Digitman ©   (2004-04-13 14:35) [19]

впрочем, это мало поможет тебе...

var
 Access: OleVariant;

..

 Access := CreateOleObject("Access.Application");

далее к объекту Access применяешь те методы, которые позволяют получить требуемый объект Recordset

подробности - в хэлпе на MS Access VBA


 
Slider007 ©   (2004-04-13 14:37) [20]

спасибо, сейчас попробую


 
Slider007 ©   (2004-04-13 14:37) [20]

спасибо, сейчас попробую


 
sniknik ©   (2004-04-13 14:42) [21]

можеш залезть в папку
D:\Program Files\Borland\Delphi7\Ocx\Servers
и посмотреть Access97.pas .. AccessXP.pas, если пользоваться ими (или с компонентом с закладки что в принципе тоже самое) то хотя бы контекстная ссылка на процедуры будет (в отличие от [19]).


 
sniknik ©   (2004-04-13 14:42) [21]

можеш залезть в папку
D:\Program Files\Borland\Delphi7\Ocx\Servers
и посмотреть Access97.pas .. AccessXP.pas, если пользоваться ими (или с компонентом с закладки что в принципе тоже самое) то хотя бы контекстная ссылка на процедуры будет (в отличие от [19]).


 
Digitman ©   (2004-04-13 14:51) [22]


> хотя бы контекстная ссылка на процедуры будет


будет.

но с учетом "что такое "внешний сервер автоматизации" и "для самообразования" лучше таки на первых порах поэкспериментировать с поздним связыванием .. это ощутимо ближе к соотв.примерам в MSAccessVBA-хэлпе и практически не требует адаптации к синтаксису OP


 
Digitman ©   (2004-04-13 14:51) [22]


> хотя бы контекстная ссылка на процедуры будет


будет.

но с учетом "что такое "внешний сервер автоматизации" и "для самообразования" лучше таки на первых порах поэкспериментировать с поздним связыванием .. это ощутимо ближе к соотв.примерам в MSAccessVBA-хэлпе и практически не требует адаптации к синтаксису OP


 
Slider007 ©   (2004-04-14 08:29) [23]

Извините ребята, ещё вопрос:

>var
> Access: OleVariant;
>
>..
>
> Access := CreateOleObject("Access.Application");

Как этот самый объект "Access" связать с конкретным файлом БД ?


 
Slider007 ©   (2004-04-14 08:29) [23]

Извините ребята, ещё вопрос:

>var
> Access: OleVariant;
>
>..
>
> Access := CreateOleObject("Access.Application");

Как этот самый объект "Access" связать с конкретным файлом БД ?


 
sniknik ©   (2004-04-14 08:37) [24]

через его процедуры, функции, параметры...
почему я и думаю что с контекстной помощь. было бы легче.

вполне возможно что так явно ты не сможеш подключить к нему датасорс-грид, тут же что получается, вызвав "Access.Application" ты по сути запустил программу access а дальше ей управляеш извне, access этот получился таким сервером к которому у тебя удаленный доступ. есть у него метод/параметр открытая тавлица/база сможеш грид подключить, нет ... не обессудь. ;о)
чего и говорил, решаеш одну маленькую проблемку а получаеш кучу больших.


 
sniknik ©   (2004-04-14 08:37) [24]

через его процедуры, функции, параметры...
почему я и думаю что с контекстной помощь. было бы легче.

вполне возможно что так явно ты не сможеш подключить к нему датасорс-грид, тут же что получается, вызвав "Access.Application" ты по сути запустил программу access а дальше ей управляеш извне, access этот получился таким сервером к которому у тебя удаленный доступ. есть у него метод/параметр открытая тавлица/база сможеш грид подключить, нет ... не обессудь. ;о)
чего и говорил, решаеш одну маленькую проблемку а получаеш кучу больших.


 
Digitman ©   (2004-04-14 08:42) [25]

у объекта Access.Application есть объект-свойство DBEngine
у объекта DBEngine есть св-во-коллекция Workspaces объектов Workspace
у объекта Workspace есть метод OpenDatabase

все это подробно описано в справке по AccessVBA, почитай - все станет ясно


 
Digitman ©   (2004-04-14 08:42) [25]

у объекта Access.Application есть объект-свойство DBEngine
у объекта DBEngine есть св-во-коллекция Workspaces объектов Workspace
у объекта Workspace есть метод OpenDatabase

все это подробно описано в справке по AccessVBA, почитай - все станет ясно


 
Slider007 ©   (2004-04-14 08:53) [26]

Спасибо, сейчас буду копаться


 
Slider007 ©   (2004-04-14 08:53) [26]

Спасибо, сейчас буду копаться


 
Slider007 ©   (2004-04-14 11:19) [27]

Ребята !
у меня получилось сделать то, что я задумал следующим образом:
я положил на форму компонент TAccessApplication и написал следующий код :

var
 acc : TAccessApplication;
begin
 acc.Connect;
 acc.Visible := false;
 acc.OpenCurrentDatabase("c:\db1.mdb",true);
 acc.DoCmd.OpenQuery("MyQuery",acViewNormal,acEdit);
 acc.Disconnect;
end;

всё вроде замечательно работает, спасибо за подсказку про "внешний сервер автоматизации"


 
Slider007 ©   (2004-04-14 11:19) [27]

Ребята !
у меня получилось сделать то, что я задумал следующим образом:
я положил на форму компонент TAccessApplication и написал следующий код :

var
 acc : TAccessApplication;
begin
 acc.Connect;
 acc.Visible := false;
 acc.OpenCurrentDatabase("c:\db1.mdb",true);
 acc.DoCmd.OpenQuery("MyQuery",acViewNormal,acEdit);
 acc.Disconnect;
end;

всё вроде замечательно работает, спасибо за подсказку про "внешний сервер автоматизации"


 
sniknik ©   (2004-04-14 13:23) [28]

распространять программу будеш вместе с мс оффисом.


 
sniknik ©   (2004-04-14 13:23) [28]

распространять программу будеш вместе с мс оффисом.


 
Digitman ©   (2004-04-14 15:19) [29]


> sniknik


"Эт точно !" (с)

задница во весь экран)


 
Digitman ©   (2004-04-14 15:19) [29]


> sniknik


"Эт точно !" (с)

задница во весь экран)



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.59 MB
Время: 0.037 c
14-1082122032
Igorek
2004-04-16 17:27
2004.05.09
Простенькая задачка на выходные


1-1082513602
-Maximus-
2004-04-21 06:13
2004.05.09
ScrollBox


1-1082554995
Shag
2004-04-21 17:43
2004.05.09
выделение в Excel


7-1080148513
beard
2004-03-24 20:15
2004.05.09
Мультизагрузка в Windows XP


3-1081937395
Vitaliy
2004-04-14 14:09
2004.05.09
Создание dbf таблицы через ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский