2

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

每当在表单中打开新的空白记录时,我想在用户开始输入之前运行代码。我不想在打开或编辑现有记录时运行代码。但是,如果代码同时针对新的空白记录和现有记录运行,我可能可以围绕它编写代码。到目前为止,我在现场和表单本身上尝试过的所有事件都没有按照我的意愿运行。谁能建议我应该使用哪个事件,以及在哪个对象上?

4

5 回答 5

5

我不确定我是否理解了这个问题,但我认为您要求根据一些运行时信息(例如用户名)在从不同表中提取的字段中插入一个值。在这种情况下,您可以使用域查找函数 DLookup(),然后将要返回的字段的名称、要从中查找的表或查询的名称以及用于将结果限制为一行(我假设这取决于您可以在运行时收集的值)。然后可以将该 DLookup() 公式永久设置为表单控件上的默认值,并且在您创建真实记录之前不会导致表单被弄脏。

当然,我可能完全误解了您要执行的操作,因此这可能行不通,但是您似乎想在记录集中查找某些内容并将结果用作新记录的值,而 DLookup() 会让您无需任何编码就可以做到这一点(以及不会过早地弄脏记录的好处)。

于 2008-10-03T19:33:08.333 回答
3

我不知道您如何确定当前用户是谁,但我会假设您可以通过编程方式调用它。为了简单起见,我将在此示例中使用 Access 内置的“CurrentUser”方法。(需要用户级别的安全性,否则默认为“管理员”。)

在 VBA 模块中创建一个公共函数以返回当前用户的默认值:

Public Function InsertDefaultSomeID() As String

InsertDefaultSomeID = DLookup("DefaultSomeID", "tblUserPref", _
                              "UserID='" & CurrentUser & "'")

End Function

在 tblUserPref 中,您需要一个 [UserID] 字段和一个 [DefaultSomeID] 字段。为当前用户定义默认值。

然后,在绑定到 tblMyTable 的表单上,打开 [SomeID] 字段的属性并将默认值属性设置为:

=InsertDefaultSomeID()

保存您的表单,以具有已知默认值的用户身份登录,然后尝试插入新记录。您的默认值应自动填充。

于 2008-10-02T05:01:25.853 回答
0

您可能希望将该代码放在表单本身的“插入前”事件中(表单上没有任何对象)。

更正:在您的用户开始输入数据之前,这实际上不会触发 - 因此您只需要确保您想要默认设置的字段位于第一个数据输入字段之后。

您还可以在“On Current”事件中检查新记录。

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.f2 = "humbug"
    End If
End Sub

这样做的缺点是新记录在您输入时会立即创建/标记为脏。因此,如果您漫不经心地遍历记录,您最终可能会运行结束并创建几个仅包含默认数据的额外记录 - 因此您将不得不做一些事情来捕获这种情况(例如,必填字段, ETC。)

于 2008-10-01T14:22:16.043 回答
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
于 2008-10-01T17:30:17.760 回答
-1

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

于 2008-10-02T10:24:00.180 回答