表单中的组合框(Access 2010) - 从2个不同的字段中检索值

时间:2014-07-30 08:30:05

标签: vba ms-access access-vba ms-access-2010

我需要在访问2010上创建一个表单,该表单在表格中的记录(t_main)之间导航

但问题是我需要一个组合来选择param1_old和新的param2_old和新的。

这个组合将有2个值,每个参数的旧值和新值。最后,在我选择要为此用户保留哪些参数后,我将单击一个按钮并将此信息保存到新表中(t_saved)。

t_main具有以下结构:

user; date; name; param1_old; param1_new; param2_old; param2_new

t_saved具有以下结构:

user; date; name; param1; param2

关于如何做到这一点的任何想法?我应该使用记录集吗?有没有办法避免它,只是强制组合将2个不同字段的值带入值列表?

非常感谢您的帮助!

编辑: 我知道理解我需要的内容相当复杂,我会尝试在屏幕截图中显示:

表中的数据如下:

user; date; name; param1_old; param1_new; param2_old; param2_new 1234568789;"21/07/2014";"John Smith";'Lemon street 125';'Avocado avenue 123'; '...'; '..'

Please see this sample

1 个答案:

答案 0 :(得分:1)

您没有提到每个表中的主键是什么,所以我假设它是user字段,t_maint_saved中的每条记录都有唯一的{{ 1}}。
如果没有,则将其替换为实际的主键。

请注意,user是保留关键字,您无法为字段date命名,因此我将其重命名为date

我创建的small sample database可以按照您的描述运作(至少我理解)。

我用一些示例数据创建了这些表:

Table t_main

Table t_saved

Sampel data in t_main

我创建了一个绑定到thedate表的表单:

FormMain

请注意,下拉框t_maincbParam1未绑定到任何字段,而是未绑定

下拉框的行源有点像黑客,但效果很好 例如,对于cbParam2

cbParam1.RowSource

此查询从SELECT param1_old FROM t_main WHERE user=Forms![FormMain]![User] UNION ALL SELECT param1_new FROM t_main WHERE user=Forms![FormMain]![User]; 记录中选择与当前显示的t_main具有相同user的旧字段和新字段。实际上,它显示了组合框中当前记录的旧参数和新参数。

FormMain背后的代码主要用于管理显示 如果下拉框中的一个为空,或者我们之前已经添加了该记录,我们阻止用户将数据添加到t_saved

enter image description here

Option Compare Database
Option Explicit

' We use this variable to keep track of whether the
' record was already found in the t_saved table
Private alreadysaved As Boolean

'-----------------------------------------------------------------------------
' Update the UI after we change our selection of parameter
'-----------------------------------------------------------------------------
Private Sub cbParam1_AfterUpdate()
    UpdateUI
End Sub

Private Sub cbParam2_AfterUpdate()
    UpdateUI
End Sub

'-----------------------------------------------------------------------------
' Enable/Disable the save button.
' The button is only enabled if the user selected both parameters
'-----------------------------------------------------------------------------
Private Sub UpdateUI()
    btAddData.Enabled = Not (IsNull(cbParam1) Or IsNull(cbParam2)) _
                        And Not alreadysaved
End Sub

'-----------------------------------------------------------------------------
' Refresh teh data every time we change record
'-----------------------------------------------------------------------------
Private Sub Form_Current()
    ' Reset the values of the parameters comboboxes
    cbParam1 = Null
    cbParam2 = Null
    cbParam1.Requery
    cbParam2.Requery

    ' Check if there is already a record for the same user in the t_save table
    alreadysaved = DCount("user", "t_saved", "user='" & user & "'") > 0

    ' Display a warning to tell the user the current record cannot be saved again
    lblInfo.Visible = alreadysaved

    UpdateUI
End Sub

代码的重要部分实际上是将数据添加到t_saved表中的新记录的代码:

'-----------------------------------------------------------------------------
' The button was clicked.
' Save the current record data to the t_save table
'-----------------------------------------------------------------------------
Private Sub btAddData_Click()
    ' We create a new new record in t_save and copy our data
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("t_saved", dbOpenDynaset, dbFailOnError)
    With rs
        .AddNew
            !user = user
            !thedate = thedate
            !name = name
            !param1 = cbParam1
            !param2 = cbParam2
        .Update
        .Close
    End With
    Set rs = Nothing
    Set db = Nothing

    ' Force the form to refresh itself
    ' This will cause the Form's OnCurrent event to be triggered
    Me.Requery
End Sub