我有#34;联系人"的表格。这有一个带子表单的选项卡控件。其中一个页面具有连续的子表单以满足要求。这12种需求类型中的9种具有相应的标签页和子表单。我使用公共函数来检查页面的可见性,以便确保唯一可见的页面是已设置为有要求的页面。
我需要控制的其他事项如下:
如果有人删除了某个要求,我必须检查要求联系 - 要求明细表以获取任何明细记录。用户可以添加联系人要求。这将显示标签页和子表单,但用户可能永远不会填写该要求的任何详细信息。因此代码在该需求中查找子记录。如果有,则会警告用户并要求他们确认是否要删除详细记录。如果是,则删除它们,然后删除联系人要求记录本身。如果没有明细记录,那么该联系人要求记录就会被删除。
如果有人去添加新要求,则在添加新记录之前,我需要检查此联系人记录是否具有针对该相同需求类型的联系人要求记录。如果是这样,告诉他们他们不能这样做,并将其退出。
所以这里是根据联系人需求表中的需求类型检查当前联系人的页面可见性的代码。为清楚起见,我在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
我不知道我是否过度编码,把东西放在错误的地方,或者是什么。
如果有人能帮我解决这个问题,我会非常感激另一双眼睛!
答案 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
位置,位置,位置。在你调用正在运行的程序的地方调用它真的很重要。
感谢所有回复和帮助!