我有一个数据库,用于跟踪我们游泳池的家庭通行证和会员使用情况。我有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了解不足以弄清楚如何实现这一目标。我需要先创建一个数组吗?如何从我的关系中准备我的数据以执行我的循环?
答案 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