我在MS Access中的表上有一个字段,tblMyTable.SomeID,我想在tblUserPref.DefaultSomeID中将默认值设置为用户首选项。我似乎无法设置默认值以在tblMyTable的表定义中使用查询。我有一个表格,其中记录输入到tblMyTable。我试图在表单上设置字段的默认值,但似乎也不接受查询。所以,作为最后的手段,我试图用VBA来做。我可以在VBA中查询我想要的值,但我无法确定将代码附加到哪个事件。
我想在用户开始输入新的空白记录之前,只要在表单中打开一个新的空白记录就运行代码。我不想在打开或编辑现有记录时运行代码。但是,如果代码同时针对新的空白记录和现有记录运行,我可以编写代码。到目前为止,我在场上和表单上尝试过的所有事件都没有在我想要的时候运行。任何人都可以建议我应该使用哪个事件,以及在哪个对象上?
答案 0 :(得分:5)
我不确定我是否理解了这个问题,但我认为你要求根据一些运行时信息(例如用户名)在不同的表中绘制一个值。在这种情况下,您可以使用域查找功能,DLookup(),并且您将传递要返回的字段的名称,您正在查找的表或查询的名称以及将结果限制为一行(我认为这取决于您可以在运行时收集的值)。然后可以将DLookup()公式永久设置为表单控件上的默认值,并且在创建真实记录之前不会导致表单变脏。
当然,我可能完全误解了你要做的事情,所以这可能行不通,但你似乎想在记录集中查找一些内容并将结果用作新记录的值,并且DLookup ()允许你在没有任何编码的情况下这样做(以及不会过早地弄脏记录的好处)。
答案 1 :(得分:3)
我不知道你是如何确定当前用户是谁,但我会假设你可以通过编程方式调用它。为了简单起见,我将在本例中使用Access的内置“CurrentUser”方法。 (需要用户级安全性,否则默认为“Admin”。)
在VBA模块中创建公共函数以返回当前用户的默认值:
Public Function InsertDefaultSomeID() As String
InsertDefaultSomeID = DLookup("DefaultSomeID", "tblUserPref", _
"UserID='" & CurrentUser & "'")
End Function
在tblUserPref中,您需要[UserID]字段和[DefaultSomeID]字段。为当前用户定义默认值。
然后,在绑定到tblMyTable的表单上,打开[SomeID]字段的Properties并将Default Value属性设置为:
=InsertDefaultSomeID()
保存表单,以具有已知默认值的用户身份登录,然后尝试插入新记录。您的默认值应自动填充。
答案 2 :(得分:0)
您可能希望将该代码放在Form it self的“Before Insert”事件中(表单上没有任何对象)。
更正:在您的用户开始输入数据之前,这实际上不会触发 - 所以您只需要确保在第一个数据输入字段之后有您想要默认的字段。
您还可以在“当前”事件中检查新记录。
Private Sub Form_Current()
If Me.NewRecord Then
Me.f2 = "humbug"
End If
End Sub
这样做的缺点是当您输入新记录时会立即创建/标记为脏。因此,如果您不加思索地逐步浏览记录,您可以最终运行结束并创建几个额外的记录,其中只包含默认数据 - 因此您必须做一些事情来捕获这种情况(例如,必填字段,等)
答案 3 :(得分:0)
Private Sub Form_Current()
On Error GoTo Proc_Err
Dim rs As DAO.Recordset
Dim fOpenedRS As Boolean
If Me.NewRecord = True Then
Set rs = CurrentDb.OpenRecordset("SELECT DefaultSomeID " _
& "FROM tblUserPref WHERE UserID = " & getUserID())
fOpenedRS = True
rs.MoveFirst
Me!txtPref.Value = rs!DefaultSomeID
End If
Proc_Exit:
If fOpenedRS = True Then
rs.Close
End If
Set rs = Nothing
Exit Sub
Proc_Err:
MsgBox Err.Number & vbCrLf & Err.Description
Err.Clear
Resume Proc_Exit
End Sub
答案 4 :(得分:-1)
他是一种建议的替代方法。而不是在用户没有指定显式值时明确地插入默认值,而是将该值保留为缺失(我可能会在专用表中对此进行建模并对缺失值建模,好吧,不要插入行,但我知道许多人不反对在他们的表中有许多可以为空的列)。然后,您可以替换查询中的缺失值。这在您的应用程序中可能有效,也可能无效,正如我所说的另一种处理缺失数据的方法:)