【问题标题】:Field default value from query in MS AccessMS Access 中查询的字段默认值
【发布时间】:2008-10-01 14:16:18
【问题描述】:

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

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

【问题讨论】:

    标签: ms-access events


    【解决方案1】:

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

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

    【讨论】:

    • 我对大卫的回答投了赞成票,因为我不能对自己之前的回答进行投票,这几乎完全一样! ;)(不过,David 的方法更简单,因为它根本不需要自定义 VBA 函数。)如果这不能回答问题,我认为问题需要改写。
    • 这正是我一直在寻找的答案,尽管 Tim Lara 的答案几乎完全相同。这只是简单了一步。谢谢你们。
    • 如果您提供给 DLookup 的值来自您之前填写的字段,这似乎不起作用。
    【解决方案2】:

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

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

    Public Function InsertDefaultSomeID() As String
    
    InsertDefaultSomeID = DLookup("DefaultSomeID", "tblUserPref", _
                                  "UserID='" & CurrentUser & "'")
    
    End Function
    

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

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

    =InsertDefaultSomeID()
    

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        你是对的。您不能将控件的默认值属性设置为编译时未知的值。该值将在运行时确定。所以解决方法是在窗体的当前事件期间设置控件的 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
        

        【讨论】:

        • Value 属性是 Access 控件的默认属性,因此 Me!txtPref.Value 与 Me!txtPref 相同。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多