VBA + Access + OLE

Программирование на Visual Basic for Applications
Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

VBA + Access + OLE

Сообщение Frot » 30.04.2006 (Вс) 15:57

Доброго времени суток, уважаемые! Вопрос заключается собственно в следующем: есть надстройка, есть база данных с таблицей, в которой одно из полей типа OLE. В нем храниться некий объект (в частности Microsoft Visio Drawing). Так вот: нужно его открыть этой надстройкой. Что я делаю:

Код: Выделить всё
Set rs = CurrentDb.OpenRecordset("SELECT project_table.Projects FROM project_table;")

rs.MoveLast
rs.MoveFirst
While Not rs.EOF
Set appVisio = CreateObject("visio.application")
    appVisio.Application.Visible = True
   ' Get documents collection for application
    Set docsObj = appVisio.Documents
    Set docObj = docsObj.Open(rs!projects)
    rs.MoveNext
Wend


Ткните носом плиз, где я ошибся? В VBA я не силен, поэтому сильно не пинайте :-)
Если это важно: то у меня M$ Access 2003, M$ Visio 2000, M$ Windows 2003 Server (не смейтесь, так надо)

--
Заранее благодарен :!:

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 30.04.2006 (Вс) 18:24

не проверял код на работоспособность (не ругайте :) ? ну не стоит у мну Визио (и не лежит)) , но может тут?

Set docObj = docsObj.Open(rs!projects)

нато бы так:

Set docObj = docsObj.Open(rs.projects)
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2006 (Вс) 18:31

Лучше не изобретай велосипед.
Размести на форме OLE-контрол, привяжи его к полю proects и открывай (либо дабл-кликом, либо методом Activate).
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 30.04.2006 (Вс) 19:23

alibek писал(а):Лучше не изобретай велосипед.
Размести на форме OLE-контрол, привяжи его к полю proects и открывай (либо дабл-кликом, либо методом Activate).

ммм... Еще бы знать как, да и лучше бы открыть визио через ОЛЕ...

Код: Выделить всё
Set docObj = docsObj.Open(rs.projects)
не работает все равно, говорит File not found...

Еще раз: я полный ноль в VBA :-( я все больше по C++/Delphi...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2006 (Вс) 19:31

Тебе не надо знать, Visio откроет OLE-контрол.
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 30.04.2006 (Вс) 19:34

alibek писал(а):Тебе не надо знать, Visio откроет OLE-контрол.

Кусок кода можно? Я асболютно не знаю васик... Но лучше всего открыть визио, передав ему ссылку на значение из таблицы (если возможно)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2006 (Вс) 19:41

Передать документ из БД -- навряд-ли это возможно. У меня даже идей пока нет, с чего начинать следует.

Для того варианта, что я описал, код вообще не нужен, все делается в дизайнере. Размещаешь на форме OLE-контрол. Указываешь для формы источником данных таблицу project_table. Указываешь для OLE-контрола источником данных поле projects. Все. Это относится к формам Access, в чистом VB надо предварительно разместить на форме источник данных (DataControl или Adodc) и привязывать к нему.
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 30.04.2006 (Вс) 19:50

alibek писал(а):Передать документ из БД -- навряд-ли это возможно. У меня даже идей пока нет, с чего начинать следует.

Для того варианта, что я описал, код вообще не нужен, все делается в дизайнере. Размещаешь на форме OLE-контрол. Указываешь для формы источником данных таблицу project_table. Указываешь для OLE-контрола источником данных поле projects. Все. Это относится к формам Access, в чистом VB надо предварительно разместить на форме источник данных (DataControl или Adodc) и привязывать к нему.


Ну тут ножно помнить, что это надстройка (а это необходимо - пишу диплом, препод немного настырный) Как я форме укажу источником данных таблицу другого проекта?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.04.2006 (Вс) 19:52

База ведь у тебя есть?
Set Form1.DataSource = rs
или что-то подобное.
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 8:30

alibek писал(а):База ведь у тебя есть?
Set Form1.DataSource = rs
или что-то подобное.

Так, начинаю понимать, вроде бы. Насколько я понял, мне нужно в функции, которая вызывается при инициализации надстройки показать форму, которую нужно создать в надстройке же, и передать ей указатель на таблицу пользовательской БД? На форме должен быть компонент OLE-control (которого я не нашел в палитре инструментов), и задать для формы источником данных пользовательскую бд (это я тоже не понимаю как сделать). Если Вы разъясните ламеру как это сделать, буду очень признателен. Да, еще вопрос: может быть можно просто сохранить файл из БД пользователя на диск??? Это было бы идеальным решением. И еще: с WinAPI можно работать из васика?
--
Заранее благодарен!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 8:38

1. У OLE-контрола есть свойство DataSource (источник данных, рекордсет) и DataField (поле, к которому будет привязан контрол). Заполняй поле, позиционируй рекордсет. Это в VB, в Access чуть по другому, источник данных надо задавать форме, а контролу надо указывать RowSource.
2. В БД хранится не файл, там храниться OLE-объект. Если ты его просто выгрузишь в файл, ты его открыть в Visio не сможешь.
3. WinAPI использовать можно. Поищи по форуму по слову Declare. Только непонятно, чем тебе поможет API в данной ситуации.
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 9:07

На API я расчитывал в случае если можно сохранить на файл диск. Думал дождаться завершения работы визио чтобы стереть файл с диска.

Теперь далее: нашел OLE контрол, он был на самом видном месте, как обычно...
Продвинулся еще чуть-чуть:
Set rs = CurrentDb.OpenRecordset("SELECT project_table.Projects FROM project_table;")
Set Form_view_visio.Recordset = rs
далее если пытаюсь сделать
Set From_view_visio.RowSource = rs!Projects
то дебаггер ругается, говорит что нужен объект

И кстати, если два раза нажать на сточку таблицы где храниться OLE-объект, то открывается визио, может быть все-таки можно как-то выполнить эту штуку не привязываясь к компонентам? Если нельзя, то кусок кода плиз, который ну хотя бы ексел вызовет...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 9:36

Форма.DataSource = "select Projects from ..."
OLE0.RowSource = "Projects"
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 9:41

alibek писал(а):Форма.DataSource = "select Projects from ..."
OLE0.RowSource = "Projects"


Код: Выделить всё
Set rs = CodeDb.OpenRecordset("SELECT project_table.Projects FROM project_table;")
Set Form1.DataSource = rs
OLE0.RowSource = "Projects"

ругается на строчку Set Form1.DataSource = rs, дебаггер говорит Object Required, да кстати, я создаю форму не мастером а в режиме конструктора (т.е. он не привязан к таблице)

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 11:07

Аааааа!!! Ну неужели никто не поможет! Мне скоро диплом сдавать!!!

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 11:31

Хм. Понял в чем собака порылась:

Код: Выделить всё
Set rs = CodeDb.OpenRecordset("SELECT project_table.Projects FROM project_table")
Set Form_Fomr1.Recordset = rs
Set Form_Form1.OLE0.RowSource = "Projects"

А вот на последнюю строчку ругается, Invalid use of property...
ЛЮДИ ДОБРЫЕ!!! Помогите плиз, позарез надо!!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 11:39

Последняя строчка без Set, ты же не объект присваиваешь, а скаляр.
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 11:42

alibek писал(а):Последняя строчка без Set, ты же не объект присваиваешь, а скаляр.


Так, хорошо

Код: Выделить всё
Set rs = CodeDb.OpenRecordset("SELECT project_table.Projects FROM project_table")
Set Form_Form1.Recordset = rs
Form_Form1.OLE0.RowSource = "Projects"

Интерпретатор не ругается, уже хорошо... Но почему-то никаких действий не происходит. Ну то есть форма перерисовывается, но после двойного нажатия на OLE0 ничего ровным счетом не происходит :-( Где может быть проблема??? В таблице одна запись есть...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 11:45

Должно работать.
Попробуй сделать rs.MoveFirst.
Также выполни MsgBox TypeName(OLE0.Object).
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 11:49

Код: Выделить всё
MsgBox TypeName(OLE0.Object)

Вываливает сообщение "Page"
Что бы это значило? Должно быть наверно Microsoft Visio Drawing, или я ошибаюсь. если нет, то почему происходит так?
rs.MoveFirst сделал, не помогло...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 11:49

Можешь базу выложить?
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 11:57

alibek писал(а):Можешь базу выложить?

Без проблем...
Кстати, а почему bzip2 не разрешен??? Если кто в силах изменить правила, то окончание bz2 у файла, архивирует лучше рара и gzip`а... Еще можно 7z добавить, тоже неплохо сжимает...
Вложения
MyAddIn.mdb.gz
(81.94 Кб) Скачиваний: 77

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 12:08

Посмотри.
Вложения
fix.zip
Исправленная форма.
(82.64 Кб) Скачиваний: 118
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 12:18

Мммм. Ну что-то она открывает... Огромное спасибо. Теперь самое сложное, по крайне мере для меня: как сделать чтобы оно работало в виде надстройки? Что я уже сделал:
1) Создал таблицу USysRegInfo (как учили в микрософте)
2) Переименовал файл в *.mda (тоже по микрософту)
3) Добавил его в виде надстройки с точкой входа =MyEntryPoint()
Теперь вопрос: как в этой функции (точке входа) показать форму и открыть визио из _пользовательской_ бд? Для этого rs = !!1CurrentDb!!!

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 12:22

Так. Ну форму я показывать понял как...
Form_Form1.Visible = true

Как в OLE0 запихать OLE-объект пользовательской бд (не надстройки)???

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.05.2006 (Пн) 12:22

Что-то у тебя в теории не пробелы, а сплошная пустота.
Во-первых, посмотри свойства формы и объектов. К БД привязка там идет в дизайнере, а не из кода. Во-вторых, каким образом ты собираешься присвоить рекордсет базе данных? Это разные типы объектов. Кроме того, CurrentDb это DAO, а в Access 2000 и выше по умолчанию используется ADO, это надо смотреть в CurrentProject.Connection. И наконец, в чем проблема с открытием формы? DoCmd.OpenForm ...
Lasciate ogni speranza, voi ch'entrate.

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 12:25

Что-то у тебя в теории не пробелы, а сплошная пустота

Я разве утверждал обратное???
Вижу, что привязка идет в дизайнере... Это мне в VBA и не нравится - отлаживать сложно... И все же, как мне "привязать" OLE0 к данным из таблицы пользовательской базы?

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 01.05.2006 (Пн) 12:49

А насчет DAO и ADO, то rs объявлен как
Код: Выделить всё
Private rs As DAO.Recordset

Frot
Новичок
Новичок
 
Сообщения: 28
Зарегистрирован: 30.04.2006 (Вс) 15:47

Сообщение Frot » 14.05.2006 (Вс) 10:50

Ну неужели никто не подскажет? Скажите хотябы как сделать так, чтобы в таблице хранился файл, и чтобы какая-нибудь процедура его сохраняла на диск...
--
заранее благодарен!!!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 51

    TopList