如何在VBA中的MS Access数据库关系中声明FOR EACH循环?

时间:2017-02-22 22:34:53

标签: vba ms-access foreach

我有一个数据库,用于跟踪我们游泳池的家庭通行证和会员使用情况。我有3个表,一个用于家庭详细信息,一个用于每个成员,一个用于跟踪签到。

连接每个单独记录的关系是适当的家庭通行证。每个人都会获得一个由条形码扫描器扫描的通行证,并使用一个简单的表格进行检查。我想为一个按钮编写一个循环,当它们一起出现时会检查每个家庭成员,而不是每个个人扫描他们的卡。

DoCmd.OpenForm "CheckIn"

Dim person As ?
Dim family As ?

FOR EACH person IN family

    Forms!CheckIn![PASSHOLDER] = Me![BARCODE]
    Forms!CheckIn![CHECKINTIME] = Now()
    DoCmd.GoToRecord , , acNewRec

NEXT

DoCmd.Close acForm, "CheckIn", acSaveYes

问题是我对VBA了解不足以弄清楚如何实现这一目标。我需要先创建一个数组吗?如何从我的关系中准备我的数据以执行我的循环?

2 个答案:

答案 0 :(得分:1)

假设表之间的规范化结构,只需使用SQL。召回表格只是表格的直观表示,通常用于数据管理(添加,编辑,保存,删除)。由于您知道添加的内容,因此使用后端查询自动执行数据输入。

家庭详情

FamilyID ...

个人会员

MemberID, FamilyID ...

MemberID, PASSHOLDER, CHECKINTIME ...

所以在VBA中,如果一个家庭签入,请按下按钮并运行追加查询,刷新后将在 CheckIn 表单中显示为单个记录。这假设某些 Family 标识符文本框驻留在要在WHERE子句中使用的表单上,在这种情况下使其成为包含条形码的未绑定文本框,因为这些字段不会用于用户数据输入,但 SQL自动数据输入。甚至可以考虑除了实际 CheckIn 之外的未绑定表单,以实现此特定自动化。

Private Sub FamilyCheckinCommand_Click()

    If Not IsNull(Forms!CheckIn![FamilyID]) Then
        strSQL = "INSERT INTO CheckIn (MemberID, PASSHOLDER, CHECKINTIME)" _
                   & " SELECT m.MemberID,'" & Forms!CheckIn![BarCode] & "', Now()" _
                   & " FROM IndividualMembers m" _
                   & " WHERE m.FamilyID = " & Forms!CheckIn![FamilyID]

        ' RUNS QUERY
        CurrentDb.Execute strSQL, dbFailOnError

        ' REFRESHES FORM
        Me.Form.Requery
    Else
        Msgbox "Please enter a family!", vbExclamation, "MISSING FAMILY"
    End If

End Sub

答案 1 :(得分:0)

你能尝试这样吗?它可能工作:)(没有其余的代码,不知道究竟什么是家庭,很难说):

DoCmd.OpenForm "CheckIn"

Dim person As variant
Dim family As variant

'you should assign person to something actually.

    FOR EACH person IN family

        Forms!CheckIn![PASSHOLDER] = Me![BARCODE]
        Forms!CheckIn![CHECKINTIME] = Now()
        DoCmd.GoToRecord , , acNewRec

    NEXT

    DoCmd.Close acForm, "CheckIn", acSaveYes

这是迭代集合的方式:

https://msdn.microsoft.com/en-us/library/y0e76axa(v=vs.100).aspx