Vba 如何在表中允许记录之前测试多个条件?

Vba 如何在表中允许记录之前测试多个条件?,vba,ms-access,criteria,Vba,Ms Access,Criteria,可获得以下资料: 一年有一节课 一节课有三个学期 这个学生将在学校呆三年 一名学生在1学期至1至3年级期间最多只能注册9门不同科目 学生将在另一个课程中升入另一个班级,并提供相同的科目。(我想需要再注册一次) 我已经拥有的 我有一个名为tblEnrolled的表,其中记录了注册情况 我有一张报名表 我希望在表中允许记录之前满足以下条件: 任何学生在一学期内注册的专业科目不得超过1个(要检查所选学生是否已在所选学期和所选课程中注册了所选科目) 任何学生在一学期内不得注册超过九(9)门不同科目 我到

可获得以下资料:

  • 一年有一节课

  • 一节课有三个学期

  • 这个学生将在学校呆三年

  • 一名学生在1学期至1至3年级期间最多只能注册9门不同科目

  • 学生将在另一个课程中升入另一个班级,并提供相同的科目。(我想需要再注册一次)

  • 我已经拥有的

  • 我有一个名为tblEnrolled的表,其中记录了注册情况

  • 我有一张报名表

  • 我希望在表中允许记录之前满足以下条件:

  • 任何学生在一学期内注册的专业科目不得超过1个(要检查所选学生是否已在所选学期和所选课程中注册了所选科目)

  • 任何学生在一学期内不得注册超过九(9)门不同科目

  • 我到底想要什么

    我希望SaveButton的On_Click事件检查上述任何条件是否被违反

    谢谢你的帮助

    编辑: 代码仅检查某个科目是否已为特定学生注册

    Dim NewSubjectCode As String
    Dim NewSubject As String
    Dim stLinkCriteria As String
    Dim strCriteria As String
    Dim strMainCriteria As String
    On Error GoTo Err
    
    If IsNull(cboSession) Then
        MsgBox "Please select SESSION to proceed.", vbInformation, "Required"
        Me.cboSession.SetFocus
        Exit Sub
    End If
    If IsNull(cboTerm) Then
        MsgBox "Please select TERM to proceed.", vbInformation, "Required"
        Me.cboTerm.SetFocus
        Exit Sub
    End If
    If IsNull(cboSelectClass) Then
        MsgBox "Please select CLASS to proceed.", vbInformation, "Required"
        Me.cboSelectClass.SetFocus
        Exit Sub
    End If
    If IsNull(cboName) Then
        MsgBox "Please select STUDENT to proceed.", vbInformation, "Required"
        Me.cboName.SetFocus
        Exit Sub
    End If
    If IsNull(cboCode) Then
        MsgBox "Please select SUBJECT to proceed.", vbInformation, "Required"
        Me.cboCode.SetFocus
        Exit Sub
    End If
    
    NewSubject = Me.txtSubjects.Value
    NewSubjectCode = Me.cboCode.Column(0)
    NewStudentID = Me.txtStudentID.Value
    stLinkCriteria = "[SubjectCode] = " & "'" & NewSubjectCode & "'"
    strCriteria = "[StudentID] = " & "'" & NewStudentID & "'"
    strMainCriteria = stLinkCriteria & "And" & strCriteria
    
    If Me.cboCode.Column(0) = DLookup("[SubjectCode]", "QueryEnrollmentDetails", strMainCriteria) Then
        MsgBox "" & NewSubject & " is already selected for this student.", vbCritical, "Duplicate Subject"
        Me.Undo
        Me.cboCode.SetFocus
        Me.txtStudentID = Me.txtID
        Me.txtStudentName = Me.cboName
        Me.txtStudentClass = Me.txtClass
        Me.txtSession = Me.cboSession
        Me.txtTerm = Me.cboTerm
    Exit Sub
    Else
        DoCmd.RunCommand acCmdSaveRecord
        DoCmd.GoToRecord , , acNewRec
        Me.[SubformSubjects].Requery
        Me.cboCode.SetFocus
        Me.txtStudentID = Me.txtID
        Me.txtStudentName = Me.cboName
        Me.txtStudentClass = Me.txtClass
        Me.txtSession = Me.cboSession
        Me.txtTerm = Me.cboTerm
    End If
    Err:
    Exit Sub
    End Sub
    
    非常感谢@David G

    您的要求:

  • 任何学生在一学期中注册的特定科目都不能超过1个(要检查所选学生是否已在所选学期和所选课程中注册了所选科目)

  • 任何学生在一学期内不得注册超过九(9)门不同科目

  • 可按以下方式实施(仅大纲):

    第一个可以实现为记录谁为哪个主题输入的表的主键:Student和subject的组合是该表的主键,根据定义,主键是唯一的。再次尝试插入组合将被数据库拒绝


    第二个可以实现为从student=“&StudentName&“”中的科目中选择计数(*),然后检查计数是否小于或等于9。

    谢谢大家。后来,我通过使用多个条件检查此类记录是否存在来修复它

    保存按钮的点击事件如下所示:

    Private Sub cmdEnroll_Click()
    Dim NewSubjectCode As String
    Dim NewSubject As String
    Dim strStudent As String
    Dim strSubject As String
    Dim strTerm As String
    Dim strSession As String
    Dim strClass As String
    Dim StudentCheck As String
    Dim SubjectCheck As String
    Dim TermCheck As String
    Dim SessionCheck As String
    Dim SubjectCodeCheck As String
    Dim strCriteria As String
    Dim ClassCheck As String
    On Error GoTo Err
    
    If IsNull(cboSession) Then
        MsgBox "Please select Session to proceed.", vbExclamation, "Subjects Enrollment"
        Me.cboSession.SetFocus
        Exit Sub
    End If
    If IsNull(cboTerm) Then
        MsgBox "Please select Term to proceed.", vbExclamation, "Subjects Enrollment"
        Me.cboTerm.SetFocus
        Exit Sub
    End If
    If IsNull(cboSelectClass) Then
        MsgBox "Please select Class to proceed.", vbExclamation, "Subjects Enrollment"
        Me.cboSelectClass.SetFocus
        Exit Sub
    End If
    If IsNull(cboName) Then
        MsgBox "Please select Student to proceed.", vbExclamation, "Subjects Enrollment"
        Me.cboName.SetFocus
        Exit Sub
    End If
    If IsNull(cboCode) Then
        MsgBox "Please select Subject to proceed.", vbExclamation, "Subjects Enrollment"
        Me.cboCode.SetFocus
        Exit Sub
    End If
    
    SubjectCheck = Me.txtSubjects.Value
    SubjectCodeCheck = Me.cboCode.Column(0)
    StudentCheck = Me.txtStudentID.Value
    TermCheck = Me.cboTerm.Value
    SessionCheck = Me.cboSession.Value
    ClassCheck = Me.cboSelectClass.Value
    strSubject = "[SubjectCode] = " & "'" & SubjectCodeCheck & "'"
    strStudent = "[StudentID] = " & "'" & StudentCheck & "'"
    strTerm = "[Term] = " & "'" & TermCheck & "'"
    strSession = "[Session] = " & "'" & SessionCheck & "'"
    strClass = "[StudentClass] = " & "'" & ClassCheck & "'"
    
    strCriteria = strStudent & "And" & strSubject & "And" & strTerm & "And" & strSession & "And" & strClass
    
    If IsNull(DLookup("[StudentID]", "QueryEnrollmentDetails", strCriteria)) Then
    
        CurrentDb.Execute "INSERT INTO tblEnrolled(StudentID,StudentName,StudentClass,SubjectCode,SubjectName,Session,Term) " & _
            " VALUES('" & Me.txtID & "','" & Me.cboName & "','" & Me.cboSelectClass & "','" & _
            Me.cboCode & "','" & Me.txtSubjects & "','" & Me.cboSession & "','" & Me.cboTerm & "')"
        Me.[SubformSubjects].Requery
        Me.cboCode.SetFocus
        Me.txtStudentID = Me.txtID
        Me.txtStudentName = Me.cboName
        Me.txtStudentClass = Me.txtClass
        Me.txtSession = Me.cboSession
        Me.txtTerm = Me.cboTerm
    Exit Sub
    Else
        MsgBox "" & SubjectCheck & " is already selected for this student.", vbCritical, "Duplicate Subject"
        Me.Undo
        Me.cboCode.SetFocus
        Me.txtStudentID = Me.txtID
        Me.txtStudentName = Me.cboName
        Me.txtStudentClass = Me.txtClass
        Me.txtSession = Me.cboSession
        Me.txtTerm = Me.cboTerm
    
    End If
    Exit_Command:
        Exit Sub
    Err:
        MsgBox Err.Description, vbCritical, "Error"
        Resume Exit_Command
    End Sub
    

    有几种方法可以实现此类限制/检查。如何输入数据?这决定了需要执行检查的方式。是否要使用VBA/SQL/表定义?如果是的话,你试过什么了吗?如果是,请发布您的代码/尝试。谢谢您的帮助。我想在Access中使用VBA。我使用表单将数据输入到表中。因此,您需要在表单后面的VBA中进行一些检查。你做过一些调查吗?你试过密码吗?如果是这样,请在你的问题中发布。再次感谢David G。请问我如何在这里发布代码?我是新来的。编辑你的问题(小“编辑”按钮)并复制粘贴你的代码。然后选择您的代码并使用功能区顶部的“代码”按钮。我感谢您的帮助。然而,我不清楚你的建议。我的观点是,我有一个带有两个组合框的表单。我想检查我在这些组合框上选择的组合是否不会导致我的表中出现重复记录。因此,我需要一个VBA代码在保存记录之前进行检查。谢谢,如果您正确定义了表的主键,againIt将不会导致重复条目!这就是主键的全部思想——查找概念。尝试插入副本时,保存将失败。请参阅示例