-1

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

我需要能够控制的其他事情如下:

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

  2. 如果有人要添加新需求,在添加新记录之前,我需要检查此联系人记录是否没有相同需求类型的联系人需求记录。如果是这样,告诉他们他们不能这样做,然后退出。

所以这里是用于检查页面可见性的代码,基于联系人需求表中的需求类型,用于当前联系人。为清楚起见,我在 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

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

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

4

1 回答 1

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

位置,位置,位置。在哪里调用检查正在运行的过程真的很重要。

感谢所有的回复和帮助!

于 2017-08-18T12:54:12.147 回答