表字段默认属性值功能在Microsoft Access 2010中不再工作

时间:2014-01-10 19:27:07

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

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

显然,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"")"

3 个答案:

答案 0 :(得分:2)

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

"=Now()"应该有效。至少它对我有用。

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

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

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

答案 1 :(得分:2)

如果此类功能在此之前有效,则问题可能是沙箱模式。

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

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

答案 2 :(得分:1)

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

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()调用可能会导致外部应用程序的插入失败,因此请谨慎操作。