控制子窗体记录和选项卡控制页面?

时间:2017-08-16 18:45:20

标签: ms-access combobox duplicates visibility beforeupdate

我有#34;联系人"的表格。这有一个带子表单的选项卡控件。其中一个页面具有连续的子表单以满足要求。这12种需求类型中的9种具有相应的标签页和子表单。我使用公共函数来检查页面的可见性,以便确保唯一可见的页面是已设置为有要求的页面。

我需要控制的其他事项如下:

  1. 如果有人删除了某个要求,我必须检查要求联系 - 要求明细表以获取任何明细记录。用户可以添加联系人要求。这将显示标签页和子表单,但用户可能永远不会填写该要求的任何详细信息。因此代码在该需求中查找子记录。如果有,则会警告用户并要求他们确认是否要删除详细记录。如果是,则删除它们,然后删除联系人要求记录本身。如果没有明细记录,那么该联系人要求记录就会被删除。

  2. 如果有人去添加新要求,则在添加新记录之前,我需要检查此联系人记录是否具有针对该相同需求类型的联系人要求记录。如果是这样,告诉他们他们不能这样做,并将其退出。

  3. 所以这里是根据联系人需求表中的需求类型检查当前联系人的页面可见性的代码。为清楚起见,我在tblReqType表中添加了列。它有ID和txtRequirementType。它还有txtRequirementPage和txtRequirementTable,它们具有页面和源表的名称,如果需求类型具有相应的页面和要识别的表。

    Public Function ShowReqs(MCID As Integer)
        Dim db As DAO.Database
        Dim ReqPages As String
        Dim ShowReqPages As DAO.Recordset
        Dim IsReq As Integer
        Dim showpg As Variant
        Dim reqrec As Integer
        Dim ctl As Control
    
        If Forms!frmMContacts.Detail.Visible = True Then
            Forms!frmMContacts.frmMContacts_SubRequirements.Form.Dirty = False
    
            Set db = CurrentDb
    
            ReqPages = "SELECT tblReqType.ID, tblReqType.txtRequirementPage, tblReqType.txtRequirementTable " & _
                            "FROM tblReqType " & _
                            "WHERE tblReqType.txtRequirementPage is not null;"
    
            Set ShowReqPages = db.OpenRecordset(ReqPages, dbOpenDynaset, dbSeeChanges)
    
            Forms!frmMContacts.Painting = False
    
            Do While Not ShowReqPages.EOF
                IsReq = DCount("*", "tblMContactRequirements", "FKMC = " & Nz(Forms!frmMContacts.ID, 0) & " and FKRequirementType = " & ShowReqPages.Fields("ID"))
                If IsReq = 0 Then
                    showpg = False
                Else
                    showpg = True
                End If
                Forms!frmMContacts.tbMContactsubs.Pages(ShowReqPages.Fields("txtRequirementPage")).Visible = showpg
                For Each ctl In Forms!frmMContacts.tbMContactsubs.Pages(ShowReqPages.Fields("txtRequirementPage")).Controls
                    With ctl
                        Select Case .ControlType
                        Case acSubform
                            ctl.Form.Requery
                        End Select
                    End With
                Next ctl
    
            ShowReqPages.MoveNext
            Loop
    
            Forms!frmMContacts.Painting = True
            Forms!frmMContacts.Repaint
            Set db = Nothing
            Set ShowReqPages = Nothing
        End If
    End Function
    

    这似乎有效,但是当我尝试为同一个联系人ID添加重复的需求类型时,它会受到妨碍。我需要捕获它,然后它传递给SQL中的表。这是因为我在tblMContactRequirements表上为FKMC(联系人ID)和FKRequirementType列添加了一个索引,以使这两个一起成为唯一的。它会抛出一个关于索引的令人讨厌的odbc消息,我希望超越它,检查可能的重复,如果它会导致重复/跳转索引错误,则将其退出。

    在子需求表单中,我将以下内容放在Before_Update中,然后放在Before_Insert中。无论哪种方式,我都会遇到奇怪的问题。很难指出它们,因为我无法分辨导致发生什么的原因。我解决了一件事,然后又出现了另一个问题。

    这是代码,意在捕捉欺骗:

    Private Sub Form_BeforeInsert(Cancel As Integer)
    Dim rst As DAO.Recordset
    Dim reqrec As Integer
    DoCmd.SetWarnings True
    Set rst = Me.RecordsetClone
    rst.FindFirst "[FKRequirementType] = " & Me.FKRequirementType & " AND [FKMC] = " & Me.Parent!ID
    If Not rst.NoMatch Then
        MsgBox "This requirement has already been added! ", vbOKOnly, "Requirements Shouldn't be Added Twice."
        Me.Undo
        BeforeResult = 1
    Else
        BeforeResult = 0
    End If
    rst.Close
    Me.Dirty = False
    

    我尝试将其放在需求类型组合控件的变更中:

    Private Sub FKRequirementType_Change()
    Form_BeforeInsert (0)
    If BeforeResult = 1 Then
    Exit Sub
    Else
        Form_AfterUpdate
    End If
    End Sub
    

    我尝试将其放在表单更新后:

    Private Sub Form_AfterUpdate()
    Dim FKMC As Integer
    FKMC = Nz(Me.Parent!ID, 0)
    Call ShowReqs(FKMC)
    End Sub
    

    我不知道我是否过度编码,把东西放在错误的地方,或者是什么。

    如果有人能帮我解决这个问题,我会非常感激另一双眼睛!

1 个答案:

答案 0 :(得分:0)

我找到了答案。这是组合现在的更改事件:

Private Sub FKRequirementType_Change()
Dim i As Integer
    If Nz(Me.FKRequirementType) <> 0 Then
        i = DCount("*", "tblMContactRequirements", "FKMC=" & Me.Parent!ID & " And FKRequirementType=" & Me.FKRequirementType.Value)
        If (i > 0) Then
            MsgBox "This contact already has a " & Me.FKRequirementType.Column(1) & " requirement.", vbOKOnly + vbExclamation, "No Duplicates!"
            Me.Undo
        Else
            Call ShowReqs(FKMC)
        End If
    End If
End Sub

位置,位置,位置。在你调用正在运行的程序的地方调用它真的很重要。

感谢所有回复和帮助!