gpt4 book ai didi

ms-access - 如何检查 VBA 模块何时被修改?

转载 作者:行者123 更新时间:2023-12-04 22:43:00 24 4
gpt4 key购买 nike

我写了一个版本控制模块。每当我或其他维护者之一登录时,AutoExec 宏就会启动它。它查找自上次更新以来已创建或修改的数据库对象,然后将条目添加到 Versions 表中,然后打开表(过滤到最后一条记录),这样我就可以输入我执行的更改的摘要。

它适用于表格、查询、表单、宏等,但我无法让它在模块中正常工作。

我发现了两个不同的属性,表明上次修改日期...

CurrentDB.Containers("Modules").Documents("MyModule").Properties("LastUpdated").Value
CurrentProject.AllModules("MyModule").DateModified

第一个(CurrentDB)始终将“LastUpdated”显示为它的创建日期,除非您修改了模块的描述或界面中的某些内容。这告诉我这个属性纯粹是针对容器对象的——而不是里面的东西。

第二个效果好很多。它准确地显示了我修改和编译/保存模块的日期。唯一的问题是,当您保存或编译模块时,它会再次保存/编译所有模块,因此将 DateModified 字段设置为相同的日期。这有点违背了在单个模块上拥有 DateModified 属性的目的,不是吗?

所以我的下一步行动将更加激烈。我想我需要维护所有模块的列表,并使用 VBA 扩展计算每个模块中的代码行数。然后,如果代码行与列表记录的不同 - 那么我知道模块已被修改 - 我只是不知道什么时候,除了“自从我上次检查以来”

有没有人有更好的方法?我宁愿不采取下一步行动,因为我可以看到它明显影响数据库性能(以一种糟糕的方式)

最佳答案

这是一个更简单的建议:

  • 计算每个模块的 MD5 哈希值。
  • 将其存储在版本表中。
  • 在 AutoExec 期间为每个模块重新计算它,并将其与版本表中的模块进行比较。如果不同,您可以假设它已被更改(虽然 MD5 不利于安全性,但它仍然可以保证完整性)。

  • 要使用 VBE 扩展性从模块中获取文本,您可以执行
    Dim oMod As CodeModule
    Dim strMod As String
    Set oMod = VBE.ActiveVBProject.VBComponents(1).CodeModule
    strMod = oMod.Lines(1, oMod.CountOfLines)

    然后您可以使用 this answer 中的以下修改后的 MD5 哈希函数如下所示,您可以将每个模块的哈希值存储起来,然后在 AutoExec 中进行比较。
    Public Function StringToMD5Hex(s As String) As String
    Dim enc
    Dim bytes() As Byte
    Dim outstr As String
    Dim pos As Integer
    Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
    'Convert the string to a byte array and hash it
    bytes = StrConv(s, vbFromUnicode)
    bytes = enc.ComputeHash_2((bytes))
    'Convert the byte array to a hex string
    For pos = 0 To UBound(bytes)
    outstr = outstr & LCase(Right("0" & Hex(bytes(pos)), 2))
    Next
    StringToMD5Hex = outstr
    Set enc = Nothing
    End Function

    关于ms-access - 如何检查 VBA 模块何时被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40749766/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com