Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д.

Работа с БД

Перечень литературы

29.08.2012  Creating Shape to Page Hyperlinks Automatically using Link Data to Shapes  David Parker.   

13.05.2009  Data Refresh on Open  Chris Roth.   

11.11.2007  Finding a Row in a Visio DataRecordset  David Parker.   

Ответы на вопросы

Как в VISIO 2002 автоматом создать карту сети?

Вас интересует технология работы с комплектом Enterprise Networks Tools или вопрос задается, так сказать, с нуля? 

Если с нуля, то… Нужно просканировать сеть, т.е. идентифицировать, определить типы имеющихся в ней устройств, получить их список. Нужно также иметь комплект шейпов для отображения всех устройств, которые при этом обнаружатся (несколько сотен типов - маршрутизаторы, коммутаторы, серверы и т.д. разных производителей). Наконец, программку, которая все эти шейпы с трафаретов перенесет на лист и соединит.
Все эти средства есть в дополнении Enterprise Networks Tools стоимостью около $1000. Говорят, что размещение получается не всегда оптимальным, но это легко исправляется.
Если задачи не глобальные, а попроще (например нужно только не спутать сервер с принтером) и сеть не слишком большая, то похожие компоненты можно написать и самому. Набор трафаретов будет попроще, сканер напишет практически любой программист, а для отображения нужен простейший алгоритм размещения и знакомство с объектной моделью Visio. 

Как визуализировать информацию из базы данных?

Я написал программу, опрашивающую по SNMP устройства сети и заносящую эту информацию в базу данных(ODBC). Теперь мне нужно визуализировать в Visio эту информацию. Вы не подскажете, как это можно сделать? 

Принципы визуализации следующие:
1. У вас должен быть заготовлен трафарет с нужными мастер-шейпами. В простейшем случае это Basic Network, в более сложных их существуют десятки для самых разнообразных сетевых устройств. Мастер-шейпы на трафарете адресуются по именам или индексам.
2. Из базы выбирается очередная строка; там должно быть имя или индекс имеющегося мастер-шейпа. Берется нужный мастер и укладывается на страницу рисунка.
3. Точно также берется и укладывается коннектор.
4. Каждый конец коннектора подцепляется к нужным точкам.
И так далее по всей базе. А вот иллюстрация (работа с базой опущена). Здесь рисуются два узла сети. Причем в данном случае трафарет Basic Network Shapes 3D.vss считается уже открытым (вручную). Это можно записать в качестве макроса и выполнить. 

Sub Example()
'предположим нужно разместить сервер и рабочую станцию
'Цепляемся за открытый! трафарет Basic Network Shapes 3D.vss, чтобы можно было
оперировать его шейпами
Set stnObj = Documents("Basic Network Shapes 3D.vss")
'Выбираем с трафарета шейп с именем Server (там такой есть)
Set mastObj = stnObj.Masters("Server")
'Сажаем его под именем shpObj1 в точку с координатами 2, 10 на активную старницу
Set shpObj1 = ActivePage.Drop(mastObj, 2, 10)
'Подпишем его
shpObj1.Text = "Хороший сервер"
'Поблизости делаем рабочую станцию из мастер-шейпа Workstation
Set mastObj = stnObj.Masters("Workstation")
Set shpObj2 = ActivePage.Drop(mastObj, 5, 8)
shpObj2.Text = "Так себе станция"
'Теперь нужно добавить коннектор. Берем для этой цели Bottom to Top Angled
Set mstObjConnector = stnObj.Masters("Bottom to Top Angled")
Set shpObjConnector = ActivePage.Drop(mstObjConnector, 0, 0)
'Прячем его, чтобы не перекрывал основные шейпы
shpObjConnector.SendToBack
'И подсоединяем началом к серверу
shpObjConnector.Cells("BeginX").GlueTo shpObj1.Cells("Connections.X1")
'а концом к рабочей станции
shpObjConnector.Cells("EndX").GlueTo shpObj2.Cells("Connections.X1")
End Sub 

Как формировать список выбора по данным из базы?

Есть база данных по вентиляторам. Сложность в том, что заранее не известно какие вентиляторы есть в базе. Тип вентилятора в списке выбора должен формироваться динамически, как только фигура вентилятора кладется на рабочий лист. 

В обработчике события ShapeAdded коннектитесь к базе, выбираете список вентиляторов, формируете из типов вентиляторов текстовую строку (не "12;13;14", а "ВПГ-56-380; ПВ-250" или что там будет в базе) и эту строку засовываете в ячейку Format в секции пользовательских свойств в нужную строку. Лучше, если соответствующее свойство в мастер-шейпе уже есть - тогда надо только подсунуть значение в одну ячейку.
То есть, как только Вы бросите шейп на лист, в нем уже появится сформированный список из базы. Далее уже ручками открываете свойства и выбираете нужную позицию. 

как из VISIO связывать Recordset с таблицей в базе данных?

Как из VISIO связывать datPrimaryRS с таблицей в базе данных?
База данных ACCESS 

Да так же, как и из любого приложения на VBA. Например, через ADODB. Вот здесь datPrimaryRS связывается с таблицей tabl1 в базе db1.mdb, лежащей в C:\temp, и выбирает из нее поля название и характеристика из всех записей: 

Private Sub Document_ShapeAdded(ByVal Shape As IVShape)
Dim cnn As New ADODB.Connection
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source= C:\temp\db1.mdb;"
Dim datPrimaryRS As New ADODB.Recordset
datPrimaryRS.Open "tabl1", cnn, adOpenKeyset, adLockOptimistic, adCmdTable
datPrimaryRS.MoveFirst
While Not datPrimaryRS.EOF
MsgBox datPrimaryRS!название & " " & datPrimaryRS!характеристика
datPrimaryRS.MoveNext
Wend
datPrimaryRS.Close
cnn.Close
End Sub 

Как изменить размеры шейпов по данным Excel?

Хотелось бы из VBA екселевского изменить размеры шейпов... по данным того же екселя.
Я что то не понимаю в иерархии объектов Visio, потому что ни как не могу найти к чему относиться свойство height, отвечющее за высоту шейпа....
вот:
pagsObj.Item(1).Shapes.Item("Vertical text 3-D bar blue.1")....height=3 что поставить вместо точек? 

Можно, например, так: 

pagsObj.Item(1).Shapes.Item(1).Cells("height").Formula = 3 

Здесь height, как ячейка. 

Visio и MS SQL

Как в особых свойствах шаблонов, к которым мы получаем доступ по правой кнопке мышки, выбрав Proterties, определенному свойству сопоставить таблицу базы данных MS SQL ?
Т.е. необходимо сделать так, чтобы на форме "Выбор спецпараметров", которая появляется при нажатии кнопки "Назначить..." в списке типов был бы тип "Прикрепленный список" или один из существующих типов списка, но в качестве значений выбирать поле из выбранной таблицы базы MS SQL, а не задавать этот список вручную в этом поле ?
Другими словами, я хочу в качестве значений combo box для выбора получать значения из определенного поля некоего справочника базы MS SQL. 

Сначала терминология (а то мы не поймем друг друга):
Шаблон - это заготовка для чертежа Visio. То есть файл с рисунком
Трафарет - поляна слева, с которой мы перетаскиваем мастер-шейпы (или мастера) на рисунок.
Шейп - это тот объект, который мы перетащили с трафарета на рисунок или нарисовали.
Во-первых, без VBA Ваша задача, по-моему, не получится.
Во-вторых, нужно решить, когда и насколько часто "заряжать" шейпы списками.
Возможно достаточно прописать списки в мастер-шейпах в трафарете.
Возможно списки должны обновляться при открытии документа (рисунка) или по специальной кнопке.
В каждом шейпе должен быть свой список или в шейпах одинакового типа и списки одинаковые? В этом случае достаточно менять список в мастер-шейпе в трафарете документа (Document Stencil) - изменение отразится во всех шейпах-экземплярах.
Ну и т.д.
А само техническое исполнение функции просто - связаться с базой, выполнить Select, перебрать строки RecordSet'а, формируя из полей строку с разделителями и засунуть получившуюся строку в нужную ячейку шейп-листа (ShapeSheet) шейпа или мастер-шейпа. Тип поля должен быть Fixed List, а строка засовывается в ячейку Format. 

Огромное спасибо. Все получилось. Я прописал список в мастер-шейпе в трафарете и обновляю его при открытии документа.