【问题标题】:Table Field Default Property Values Functions Not Working Anymore in Microsoft Access 2010表字段默认属性值函数在 Microsoft Access 2010 中不再起作用
【发布时间】:2014-01-10 19:27:07
【问题描述】:

我使用下面的代码创建表并将两个字段的默认属性值设置为函数。这些函数将默认值设置为用户和输入记录时的日期时间。一种非常简单的方法来跟踪何时输入数据以及由谁输入。

显然,Microsoft ACCESS 2010 不再允许将函数用作字段默认值。有什么简单的(设置)我可能会丢失吗?

我了解直接从代码中传递这些值的参数,并且可以操作 environ 函数。使用此代码的进程不够关键,不足以引起这种担忧。

CurrentDb.Execute "CREATE TABLE Table(ActivityYearMonth DOUBLE, UserName TEXT, UserID TEXT, UpdatedOn DATE, UpdatedBy text)"

CurrentDb.TableDefs("Table").Fields("UpdatedOn").Properties("DefaultValue") = "=Now()"
CurrentDb.TableDefs("Table").Fields("UpdatedBy").Properties("DefaultValue") = "=Environ(""UserName"")"

【问题讨论】:

  • 出了什么问题?代码运行但未设置默认值?错误信息(在哪一行?)

标签: ms-access vba ms-access-2010


【解决方案1】:

Access 确实允许某些功能作为字段默认值属性。但并非所有功能都可以接受。

"=Now()" 应该可以工作。至少对我有用。

但是"=Environ(""UserName"")" 触发错误 3388,“验证表达式中的未知函数 'Environ' 或 'Table.UpdatedBy' 的默认值。”

默认情况下,Environ 是沙盒的,因此 Access 限制了您可以在何处以及如何使用它。 Environ 的任何变体都不会被接受为字段默认值。

这并不是 Access 2010 的新发展。我在 Access 2007 中确认了相同的行为。

【讨论】:

    【解决方案2】:

    如果这些功能之前有效,那么问题可能是沙盒模式。

    http://office.microsoft.com/en-us/access-help/use-sandbox-mode-in-access-2010-HA010342092.aspx

    通过在注册表 \Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines 中设置 SandBoxMode = 2 而不是 3 来禁用 sanbox 模式和您的表达式应该可以工作。

    【讨论】:

      【解决方案3】:

      由于您使用的是 Access 2010,您或许可以使用事件驱动的数据宏来实现此目的。我刚刚尝试过,虽然 =Environ(...) 不允许使用,但我可以使用我作为 VBA 函数创建的 =GetUser()

      Option Compare Database
      Option Explicit
      
      Public Function GetUser()
          Static s As String
          Dim WshNet As Object  ' WshNetwork
          If Len(s) = 0 Then
              Set WshNet = CreateObject("WScript.Network")  ' New WshNetwork
              s = WshNet.UserName
              Set WshNet = Nothing
          End If
          GetUser = s
      End Function
      

      Before Change 数据宏很简单

      If [IsInsert] Then
          SetField
              Name   UpdatedOn
             Value   = =Now()
          SetField
              Name   UpdatedBy
             Value   = =GetUser()
      

      注意:从 Access 本身添加记录时,这工作正常,但 GetUser() 调用可能会导致来自外部应用程序的插入失败,因此请谨慎操作。

      【讨论】:

      • 考虑一个基于GetUser = CreateObject("WScript.Network").UserName 的更简单的函数如果担心后期绑定的性能,包括一个Static 变量来保存UserName 值---那么它只需要调用@987654330 @ 每个访问会话一次。
      • @HansUp 很好的建议,谢谢。我已经调整了代码。在经历了 VB6(及更早版本)内存泄漏的痛苦经历后,我仍然努力成为 Set objVar = Nothing 的忠实拥护者。旧习惯....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多