乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 100|回复: 2

[编程交流] VBA数据库难题

[复制链接]

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 14:23:27 | 显示全部楼层 |阅读模式
大家好,
 
在我们公司,我们使用autocad绘制管道仪表图。我们使用MS Acces(.mdb)文件作为每个图形中所有组件的数据库,因此我们可以制作各种项目列表。大多数信息都在块及其属性中。
 
目前。。一切正常。当我们向图形中添加某些内容时,会出现以下VBA;
  1. Private Sub AcadDocument_ObjectAdded(ByVal Object As Object)
  2.    Dim G_tmp_db, G_name_add, G_blname, G_combbl As String
  3.    On Error GoTo Err_objera
  4.    Call G_frmt_chk
  5.    G_tmp_db = Left(G_dwg_path, (Len(G_dwg_path) - 4)) & "_tmpblk"
  6.    G_name_add = Mid(TypeName(Object), 2)
  7.    Set dbblock = opendatabase(G_tmp_db)
  8.    Set rsblock = dbblock.OpenRecordset("Blocks", dbOpenTable)
  9.    If (G_name_add = "AcadBlockReference") Then
  10.        If ((Left(Object.Name, 3) = "G_B") Or (Left(Object.Name, 3) = "G_E") Or _
  11.            (Left(Object.Name, 3) = "G_I") Or (Left(Object.Name, 3) = "G_A")) Then
  12.            rsblock.AddNew
  13.            rsblock("ObjectID") = Object.ObjectID
  14.            rsblock("Handle") = Object.Handle
  15.            rsblock.Update
  16.            rsblock.Close
  17.            dbblock.Close
  18.            Set rsblock = Nothing
  19.            Set dbblock = Nothing
  20.            Dim G_dbf_path As String
  21.            G_dwg_path = thisdrawing.Path & "" & thisdrawing.Name
  22.            G_dbf_path = Left(G_dwg_path, (Len(G_dwg_path) - 4)) & "-PID.mdb"
  23.            'Verbinding maken met database
  24.            Set dbInfo = opendatabase(G_dbf_path)
  25.            Set rsInfo = dbInfo.OpenRecordset("Attributes", dbOpenTable)
  26.            Set rsData = dbInfo.OpenRecordset("Add_info", dbOpenTable)
  27.            Set rsPED = dbInfo.OpenRecordset("PED_info", dbOpenTable)
  28.            Set rsLink = dbInfo.OpenRecordset("Link_info", dbOpenTable)
  29.            Set rsCdesc = dbInfo.OpenRecordset("Client_desc_info", dbOpenTable)
  30.            ''For Each elem In ThisDrawing.ModelSpace
  31.            With Object
  32.                If ((.HasAttributes) And (Left(elem.Name, 3) = "G_B") Or (Left(elem.Name, 3) = "G_E") Or (Left(elem.Name, 3) = "G_I")) Then
  33.                    'Gea_ordernummer = thisdrawing.GetVariable("PROJECTNAME")
  34.                    Call GEA_code_start.G_update_db(Object, Gea_ordernummer)
  35.                    'MsgBox "Instructie" & thisdrawing.GetVariable("CMDNAMES")
  36.                Else
  37.                End If
  38.            End With
  39.            rsData.Close
  40.            rsPED.Close
  41.            rsLink.Close
  42.            rsCdesc.Close
  43.            rsInfo.Close
  44.            dbInfo.Close
  45.            Set rsData = Nothing
  46.            Set rsPED = Nothing
  47.            Set rsLink = Nothing
  48.            Set rsCdesc = Nothing
  49.            Set rsInfo = Nothing
  50.            Set dbInfo = Nothing
  51.        End If
  52.    End If
  53.    thisdrawing.EndUndoMark
  54.    Exit Sub
  55. Err_objera:
  56.    If Err.Number = 3024 Then Exit Sub Else Resume Next
  57. End Sub
  58. Public Sub G_frmt_chk()
  59. Dim l As Integer
  60.    G_name_chk = False
  61.    G_dwg_path = thisdrawing.Path & "" & thisdrawing.Name
  62.    G_dwg_name = UCase(thisdrawing.Name)
  63.    l = Len(G_dwg_name)
  64.    G_dwg_name = Left(G_dwg_name, l - 4)
  65.    G_name_chk = (Left(G_dwg_name, 1) Like "~")
  66.    writelock = thisdrawing.GetVariable("WRITESTAT")
  67.    If writelock = 0 Then   
  68.        G_name_chk = False  
  69.    End If                  
  70. End Sub

 
但我们希望使我们的符号(具有属性的块)动态(可视性状态)。当我们添加动态块时,插入时间太长!动态块中的每个元素都是“添加的对象”,因此每个元素都必须通过上面的VBA。当动态块的可视性状态改变时。它还通过VBA运行。这会让您等待大约15到45秒。
 
现在有人知道如何更快地做到这一点吗?也许我可以过滤动态块和其他元素,这样只有属性才能通过?还有其他想法吗?
 
非常感谢您的提示!
回复

使用道具 举报

1

主题

80

帖子

73

银币

初来乍到

Rank: 1

铜币
16
发表于 2022-7-6 15:17:34 | 显示全部楼层
您可以通过重新排列来减少数据库打开开销,这样dbblock和rsblock就可以在需要之前(并且只有在需要时)创建:
 
...
 
如果(G\u name\u add=“AcadBlockReference”),则
如果((Left(Object.Name,3)=“G\u B”)或(Left(Object.Name,3)=“G\u E”)或_
(左(Object.Name,3)=“G_I”)或(左(Object.Name,3)=“G_A”))然后
Set dbblock=opendatabase(G\u tmp\u db)
设置rsblock=dbblock。OpenRecordset(“块”,dbOpenTable)
rsblock。添加新的
rsblock(“ObjectID”)=对象。ObjectID
rsblock(“句柄”)=对象。手柄
rsblock。使现代化
 
rsblock。关
数据库块。关
设置rsblock=Nothing
设置dbblock=Nothing
 
...
 
 
 
希望这有帮助,
 
休·亚达斯蒙
Cadro私人有限公司
www.hatchkit。通用域名格式。澳大利亚
 
 
 
回复

使用道具 举报

14

主题

40

帖子

26

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 15:24:11 | 显示全部楼层
很抱歉反应太晚。。。
 
谢谢你的回复。我还没有测试它,但它看起来更符合逻辑。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 01:12 , Processed in 0.401017 second(s), 58 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表