找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 729|回复: 6

[求助]:各位VBA高手及斑竹!怎样在VBA中关联实体和数据库记录??急?

[复制链接]
发表于 2004-4-26 09:08:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
*-*6 ,各位VBA大虾及斑竹:
  我在VBA中已经读出了实体对象(如多义线plwelement)和数据库(access)中的对应记录的字段,如何用VBA将实体对象和数据库记录关联起来,用手工的方法太麻烦(如必须在菜单tools中点击dbconnect,然后再在data view对话框中选择对应的记录值再在图形中选择对象与之相连),因为我的实体对象很多,数据库中的记录值也很多,但是每个对象只对应一个记录值,我该怎样连接?????多谢各位大虾!!!急!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-4-26 14:29:55 | 显示全部楼层
你如何判断某实体与哪个记录要关联?这是做程序的根据。下面是VBA用CAO的API的方法:

Sub Main()
  Dim i As Integer, j As Integer
  Dim SSObj As AcadSelectionSet
  
  EntityObjects = 20
  ReDim KeyValue(0 To EntityObjects - 1) As Long
  
  For i = 0 To EntityObjects - 1
    KeyValue(i) = i          ' 随机产生1--3037之间的数
  Next i
  
  Dim Workspace As Workspace
  Dim Mdb As Database
   
' 也可用ADO
  Set Workspace = DBEngine.Workspaces(0)
  Set Mdb = Workspace.OpenDatabase("D:\V\Database\WSH_数据库.mdb")
  
  Dim dbConnect As CAO.dbConnect
  Dim LinkTemplates As CAO.LinkTemplates
  Dim LinkTemplate As CAO.LinkTemplate
  Dim LinkSel As CAO.Links
'  Dim Link As CAO.Link
  
  For Each SSObj In ThisDrawing.SelectionSets
    If SSObj.Name = "NBK" Then
      SSObj.Delete
      Exit For
    End If
  Next SSObj
  
  Set dbConnect = GetInterfaceObject("CAO.DbConnect")
  Set LinkTemplates = dbConnect.GetLinkTemplates(ThisDrawing)          ' 得到CAD多文档的当前文档的LinkTemplates
  Set LinkTemplate = LinkTemplates.Item(0)                ' 得到LinkTemplates的第一个LinkTemplate
  
  Dim FilterType(0 To 0) As Integer, FilterData(0 To 0) As Variant
  
  FilterType(0) = 8: FilterData(0) = "WSH_油罐"
  
  Set SSObj = ThisDrawing.SelectionSets.Add("NBK")
  SSObj.Select acSelectionSetAll, , , FilterType, FilterData
  
  ReDim ObjectIDs(0 To SSObj.Count - 1) As Long         ' 定义存储实体的ObjectID
  
  For i = 0 To SSObj.Count - 1
    ObjectIDs(i) = SSObj.Item(i).ObjectID               ' 得到被选中实体的ObjectID,存于数组
  Next i

' ObjectIDs中包含有Link和无Link的实体,GetLinks方法能将无Link的实体过滤掉
  Set LinkSel = dbConnect.GetLinks(LinkTemplate, ObjectIDs, CAO.kEntityLinkType) ' GetLinks方法的格式
  
  ReDim KeyValues(0 To LinkSel.Count - 1, 0 To 1) As Long   ' 二维数组存储Key值和实体的ObjectID
  For i = 0 To LinkSel.Count - 1
    KeyValues(i, 0) = LinkSel.Item(i).KeyValues.Item(0).Value
    KeyValues(i, 1) = LinkSel.Item(i).ObjectID
  Next i

  Dim UpBound As Long
  
  快速排序 KeyValues(), 0, LinkSel.Count - 1       ' 使用快速排序的方法对数组从小到大排序
  
  UpBound = KeyValues(LinkSel.Count - 1, 0)
' 定义以Key值为下标变量的数组,使从数据库返回的Key值直接与数组下标对应
  ReDim KeyValuesExpand(0 To UpBound - 1, 0 To 1)
  For i = 0 To LinkSel.Count - 1
    KeyValuesExpand(KeyValues(i, 0) - 1, 0) = KeyValues(i, 0)
    KeyValuesExpand(KeyValues(i, 0) - 1, 1) = KeyValues(i, 1)  ' 存储对应的实体的ObjectID
  Next i
  
  Dim En As AcadEntity, EnObjectId As Long
  For i = 0 To EntityObjects - 1
    If KeyValuesExpand(i, 1) = 0 Then Exit For
    EnObjectId = KeyValuesExpand(i, 1)
    Set En = ThisDrawing.ObjectIdToObject(EnObjectId)
    En.Highlight (True)
  Next i
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-26 21:23:14 | 显示全部楼层
请教楼上,“CAO的API的方法”中的CAO指的是什么?以上程序需要引用什么吗?为什么我的程序一运行就出现dbConnect As CAO.dbConnect未定义?希望楼主能告诉我!多谢!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2004-4-27 09:31:10 | 显示全部楼层
需要引用CAO 1.0 Type Library。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-28 08:24:25 | 显示全部楼层
请教二楼楼主?实体与数据库记录关联的是哪个语句?您的“快速排序”后,我不太能看得懂!麻烦您能告诉我,实体与数据库记录关联是哪个语句?别的我会了!谢谢您!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-28 13:19:40 | 显示全部楼层
设两个模块,,判断是2000还是2002

在主模块中
      If InStr(1, ThisDrawing.Application.Caption, "Auto 2002", vbTextCompare) = 0 Then
        AutoCAD2000.GreatLink_2000 MaxID + 1
      Else
        AutoCAD2002.GreatLink_2002 MaxID + 1
      End If
      Set NewLink = LinkTemplate.CreateLink(SSObj.Item(i).ObjectID, CurrKeyValues)


Sub GreatLink_2000(MapKeyValue As Long)
  Set CurrKeyValues = GetInterfaceObject("CAO.KeyValues")
  Set OneKeyValue = GetInterfaceObject("CAO.KeyValue")
  OneKeyValue.fieldName = "MapKey"                               ' CAO.KeyValue类针对单个实体,让.FieldName属性值与数据库的Field的name相同
      
  OneKeyValue.Value = MapKeyValue                                ' 其值等于数据库的Field的值
  CurrKeyValues.Add OneKeyValue
End Sub


Sub GreatLink_2002(MapKeyValue As Long)
  CurrKeyValues.Clear   ' 清除上一次存储的值
  CurrKeyValues.Add "MapKey", MapKeyValue
End Sub
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-4-30 11:54:52 | 显示全部楼层

请教楼上!我有点看不懂?能说得明白点吗?

请教楼上!首先,我对您的无私帮助表示感谢!以上代码,我有点看不懂?能说得明白点吗?我现在房子对象为plwelement,我的数据库是access的,我已经读出了房子中的注记(如1001,1002,1003,1004,1005等),我的数据库中的字段名为id(如:1001,1002,1003,1004,1005等),街道号、街坊号、使用人、土地用途。我需要以房子中的注记和数据库中的ID作为链接字段,我现在用什么语句打开数据库、读取数据库,新建链接名、链接数据库记录。您能给我说得明白点吗?我对数据库真的不是很清楚!谢谢!!急!!!*-*8
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 05:51 , Processed in 0.519908 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表