MS Access中查询的字段默认值

时间:2008-10-01 14:16:18

标签: ms-access events

我在MS Access中的表上有一个字段,tblMyTable.SomeID,我想在tblUserPref.DefaultSomeID中将默认值设置为用户首选项。我似乎无法设置默认值以在tblMyTable的表定义中使用查询。我有一个表格,其中记录输入到tblMyTable。我试图在表单上设置字段的默认值,但似乎也不接受查询。所以,作为最后的手段,我试图用VBA来做。我可以在VBA中查询我想要的值,但我无法确定将代码附加到哪个事件。

我想在用户开始输入新的空白记录之前,只要在表单中打开一个新的空白记录就运行代码。我不想在打开或编辑现有记录时运行代码。但是,如果代码同时针对新的空白记录和现有记录运行,我可以编写代码。到目前为止,我在场上和表单上尝试过的所有事件都没有在我想要的时候运行。任何人都可以建议我应该使用哪个事件,以及在哪个对象上?

5 个答案:

答案 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)

你是对的。您不能将控件的默认值属性设置为编译时未知的值。该值将在运行时确定。因此,解决方案是在表单的当前事件期间设置控件的value属性,而不是defaultvalue属性。注意,getUserID()是一个公共函数,用于确定用户是谁。

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)

他是一种建议的替代方法。而不是在用户没有指定显式值时明确地插入默认值,而是将该值保留为缺失(我可能会在专用表中对此进行建模并对缺失值建模,好吧,不要插入行,但我知道许多人不反对在他们的表中有许多可以为空的列)。然后,您可以替换查询中的缺失值。这在您的应用程序中可能有效,也可能无效,正如我所说的另一种处理缺失数据的方法:)