2

我在 MS Access 2003 数据库中有一组组合框,它们都绑定到单个表中的字段。但是,它们允许您选择的数据并非来自该表,而是来自其他各种表。这适用于记录创建故事,但现在我希望能够追溯编辑记录。问题是我不知道如何在不编写一堆自定义代码的情况下重新填充表单元素。

我最初的想法是提供一个组合框,将您的选择限制为记录 ID,然后进行自定义查询并使用它来设置所有不同表单元素中的选定值。但是,我觉得我应该能够做一些简单的事情,DoCmd.GoToRecord , , , ID并且表单应该重新填充就好了。我并不反对从事繁重的工作,但我确信我只是在我对 VBA 和 Access 的相对微不足道的知识中遗漏了一些东西。

4

3 回答 3

1

只是为了增加组合,我会提供两种方法,一种推荐,另一种不推荐。

方法 1:如果您已将表单绑定到整个数据表(这是不推荐的方法),您可以使用组合框向导导航到请求的记录,但我不会在最近的版本中推荐它使用权:

一个。它不允许您在创建代码之前正确命名组合框。

湾。代码是错误的。

这是我刚刚在我的测试数据库中生成的代码:

Dim rs As Object

Set rs = Me.Recordset.Clone
rs.FindFirst "[InventoryID] = " & Str(Nz(Me![Combo2], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark

这在很多方面都是错误的,这非常了不起。代码应该是这样的:

With Me.RecordsetClone
  .FindFirst "[ID]=" & Me!cmbMyComboBox
  If Not .NoMatch Then
     If Me.Dirty Then Me.Dirty = False
     Me.Bookmark = .Bookmark
  Else
     MsgBox "Not Found!"
  End If
End With

当 RecordsetClone 已经存在时,不需要克隆表单的记录集。

当您可以直接使用预先存在的对象时,没有理由使用对象变量。

在离开记录之前需要检查脏记录,因为如果您不强制保存,保存过程中的错误可能会导致数据丢失。

但更好的方法是:

方法 2:使用组合框更改表单的基础记录源。

组合框的 AfterUpdate 事件如下所示:

If Not IsNull(Me!cmbMyComboBox) Then
   Me.Recordsource = Me.Recordsource & " WHERE [ID]=" & Me!cmbMyComboBox
End If

现在,这只适用于第一次,因为在 Recordsource 的第二次重置时,您最终会得到两个 WHERE 子句,这并不好。有两种方法:

一个。假设表单在没有 WHERE 子句的情况下打开,将打开的记录源值存储在表单的 OnLoad 事件中的模块级变量中:

   Private Sub Form_Load()
     strRecordsource = Left(Me.Recordsource,Len(Me.Recordsource)-1)
   End Sub

在模块级别,相应地定义 strRecordsource:

   Dim strRecordsource As String

然后在组合框的 AfterUpdate 事件中,改为:

   Me.Recordsource = strRecordsource & " WHERE [ID]=" & Me!cmbMyComboBox

现在,如果您的表单打开时已经定义了 WHERE 子句,它会变得更加复杂,但我不会深入讨论,而是将它作为练习留给读者,最好的方法可能是什么。

于 2009-03-25T03:45:57.583 回答
0

我假设您已经为每个组合框设置了行源。只要您没有将组合框限制在该列表中;它应该显示您在该列中存储的内容。

但是,如果您的 Combo Box 更改其每一行的列表,您可以在记录的 OnCurrent 事件或字段的 GotFocus 事件中执行以下操作:

Me.combo_box_name.Requery 
于 2009-03-24T14:51:26.150 回答
0

重新阅读您的问题后,我想我看到了您想要实现的目标。GotoRecord尽管我可能会在这种情况下使用 ,但您在正确的轨道上OpenForm,因为它具有WhereCondition允许您使用 SQL 来准确指定要打开的记录的属性。听起来您想在表单中实现“跳转到记录”类型的功能,其中用户从列表中选择记录 ID,并且表单会更改以显示所选记录。

一种可能性是每次用户在 ComboBox 中选择一个项目时切换到新记录。您可以在 ComboBox 的Click事件中处理此问题。

我将使用一个简单的示例:假设您有一个Students表,以及一个StudentForm用于查看/编辑表中记录的Students表。有一个通过它的属性绑定到列的StudentFormComboBox 。当您在 ComboBox 中选择一个学生 ID 时,将切换到显示相应的学生记录。cboStudentIDStudents.IDRowSourceStudentsForm

ClickComboBox 的事件处理程序中,您可以使用如下代码编写此“跳转到记录”功能:

Private Sub cboStudentID_Click() 
    Dim recordID As Long
    'The ItemData property will return the value of the bound'
    'column at the specified index.'
    recordID = cboStudentID.ItemData(cboStudentID.ListIndex)
    'Jump to the record. This assumes we want to use the same form.'
    'You can change the form name if you want to open a different form when'
    'the user selects an ID from the ComboBox.'
    DoCmd.OpenForm "StudentForm", WhereCondition:="Student.ID=" & recordID
End Sub

正如 David W. Fenton 在评论中指出的那样,您可以缩短以下行:

recordID = cboStudentID.ItemData(cboStudentID.ListIndex)

对此:

recordID = Me!cboStudentID

要不就:

recordID = cboStudentID

因为在这种情况下 ComboBox 的默认值将是当前绑定列的值ListIndex。在这种情况下,您可以完全删除recordID并将事件编码Click如下:

Private Sub cboStudentID_Click() 
    DoCmd.OpenForm "StudentForm", WhereCondition:="Student.ID=" & cboStudentID
End Sub
于 2009-03-24T14:51:47.150 回答