我使用下面的代码创建表并将两个字段的默认属性值设置为函数。这些函数将默认值设置为用户和输入记录时的日期时间。一种非常简单的方法来跟踪何时输入数据以及由谁输入数据。
显然,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"")"
答案 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()
调用可能会导致外部应用程序的插入失败,因此请谨慎操作。