Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

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

 
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-ом, дельфевская прога про нее ничего не знает, и встроеного вижуал бейсика не имеет.

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


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

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


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

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


 
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:49) [6]

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


 
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


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

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


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


> Slider007


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


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

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


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

есть.

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


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

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


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


> Slider007


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


 
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:25) [17]

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


 
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


 
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]).


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


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


будет.

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


 
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 этот получился таким сервером к которому у тебя удаленный доступ. есть у него метод/параметр открытая тавлица/база сможеш грид подключить, нет ... не обессудь. ;о)
чего и говорил, решаеш одну маленькую проблемку а получаеш кучу больших.


 
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 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]

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


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


> sniknik


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

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



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.061 c
14-1079331760
ИМХО
2004-03-15 09:22
2004.04.11
Насколько опасен MS Outlook Express


3-1079513845
stud
2004-03-17 11:57
2004.04.11
генерация сообщений


3-1079512826
Rule
2004-03-17 11:40
2004.04.11
Не могу разобратся с разделителемя дробной части в FB 1


6-1079643480
pirat
2004-03-18 23:58
2004.04.11
как насильно завершить соединения TIdTCPServer


6-1079092329
ki11er
2004-03-12 14:52
2004.04.11
Аналог NMUDP в Delphi 7