Author |
Topic |
|
Vova
7 Posts |
Posted - 03/25/2003 : 08:52:42
|
Необходимо формировать список выбора в пользовательском поле Shape из поля базы данных Скажите пожалуйста, как это сделать?
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/25/2003 : 11:55:35
|
Тип поля должен быть установлен, например, в Fixed List, а в ячейку Format нужно подсунуть данные, выбранные из базы. Например, ="12;13;14" будет давать для выбора список из трех величин. |
|
|
Vova
7 Posts |
Posted - 03/25/2003 : 13:17:10
|
Есть база данных по вентиляторам Сложность в том, что заранее не изветстено какие вентиляторы есть в базе. Тип вентилятора в списке выбора должен форироваться динамически, как только фугура вентилятора кладется на рабочий лист. |
|
|
Tumanov
Russia
1198 Posts |
Posted - 03/25/2003 : 15:11:41
|
Ну, так и я об этом... В обработчике события ShapeAdded коннектитесь к базе, выбираете список вентиляторов, формируете из типов вентиляторов текстовую строку (не "12;13;14", а "ВПГ-56-380; ПВ-250" или что там будет в базе) и эту строку засовываете в ячейку Format в секции пользовательских свойств в нужную строку. Лучше, если соответствующее свойство в мастер-шейпе уже есть - тогда надо только подсунуть значение в одну ячейку. То есть как только Вы бросите шейп на лист, в нем уже появится сформированный список из базы. Далее уже ручками открываете свойства и выбираете нужную позицию.
|
|
|
Vova
7 Posts |
Posted - 03/31/2003 : 11:52:44
|
Где описывать обработчик ShapeAdded и как его вызывать? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/01/2003 : 11:03:28
|
Обработчик будет вызываться сам, как только на страницу упадет шейп. Чтобы его описать, нужно вызвать Microsoft Visual Basic (Tools / Macros / Visual Basic Editor), щелкнуть слева по ThisDocument, справа в списке объектов выбрать Document, а еще правее в списке событий выбрать ShapeAdded. При этом на листе появится заготовка типа: Private Sub Document_ShapeAdded(ByVal Shape As IVShape)
End Sub Впишите туда для проверки MsgBox, например: Private Sub Document_ShapeAdded(ByVal Shape As IVShape) MsgBox "Ой, Добавилось!" End Sub Теперь возвращайтесь на страницу рисунка и добавьте любой шейп или просто проведите линию и наблюдайте, как срабатывает Ваш обработчик.
|
|
|
Vova
7 Posts |
Posted - 04/08/2003 : 10:51:11
|
Предположим есть процедура Private Sub Document_ShapeAdded(ByVal Shape As IVShape) nam = Shape.Name If InStr(1, nam, "Вентилятор") > 0 Then formatstroka = "ВОМД-24;ВОМ-18" ' здесь надо задать формат в соответствии с форматной строкой
End If End Sub Как задать программно формату ячейки форматную строку? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/08/2003 : 11:38:32
|
Пусть в трафарете имеется мастер-шейп, в котором определено пользовательское свойство: Label = Typ; Type = Fixed List (другие аргументы, в том числе и формат, не заполнены). Тогда при премещении этого мастер-шейпа на лист (срабатывает данный обработчик) нужно будет в ячейку Format записать "ВОМД-24;ВОМ-18". Если бы данные брались не из базы, а просто как текстовая константа, это делалось бы так: Shape.Сells("prop.row_1.Format").Formula = """ВОМД-24;ВОМ-18""" В Вашем же случае вместо константы в тройных кавычках нужно будет подсунуть строку, сформированную из всех возможных значений, полученных из базы. Ну и, понятно, если пользовательских свойств несколько, то вместо prop.row_1 должна быть указана нужная строка. |
|
|
Vova
7 Posts |
Posted - 04/08/2003 : 13:43:17
|
Пробовал добавить эту строку, но к сожалению, возникает ошибка: Run time error '438' Object doesn't support this property or method |
|
|
Tumanov
Russia
1198 Posts |
Posted - 04/08/2003 : 14:29:16
|
Этот объект обязан поддерживать это свойство. Значит либо строка была не совсем такой, либо объект не совсем такой. Посмотрите шейп-лист этого шейпа. Проверьте, есть ли там секция Custom Properties, есть ли в ней строка Prop.Row_1, в которую Вы пытаетесть вводить данные. Если все на месте и ситуация совсем безвыходная, шлите рисунок по адресу ttt@post.rzn.ru (только по возможности выбросьте все лишнее и заархивируйте), я посмотрю на месте, в чем ошибка. |
|
|
Vova
7 Posts |
Posted - 05/05/2003 : 12:47:26
|
Предположим, что datPrimaryRS привязана к базе данных тогда процедура обработки может выглядеть так Private Sub Document_ShapeAdded(ByVal Shape As IVShape) nam = Shape.Name If InStr(1, nam, "Вентилятор") > 0 Then Do Until datPrimaryRS.Recordset.EOF If datPrimaryRS.Recordset!название = "ВОМД-24" Then Shape.Cells("Prop.Row_3").Result = datPrimaryRS.Recordset!характеристика End If datPrimaryRS.Recordset.MoveNext Loop End If End Sub вопрос: как из VISIO связывать datPrimaryRS с таблицей в базе данных? база данных ACCESS |
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/05/2003 : 15:15:17
|
как из VISIO связывать datPrimaryRS с таблицей в базе данных? Да так же, как и из любого приложения на 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
|
|
|
Vova
7 Posts |
Posted - 05/12/2003 : 13:34:08
|
База данных находится в том же каталоге, что и рисунок VISIO. Вопрос: как получить из VBA имя каталога для вызова строки ADO коненекшн? Функция CurDir дает: c:\windows\рабочий стол dirstr = CurDir constr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dirstr & "\v.mdb;" |
|
|
|
Topic |
|