2010-10-24 49 views
0

我有一个子窗体(customersAnswersSub)内的主窗体(customersAnswers)。一旦有人进入一个新的customerAnswersSub条目 - 我想它首先检查重复。MS Access - 检查子表单之前输入复制

它必须首先检查4个不同的字段。

这是我到目前为止。

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Dim rsGlobals As ADODB.Recordset 
    Dim sql 
    Set rsGlobals = New ADODB.Recordset 
    sql = "Select * From CustomerAnswerD where subscriptionNo=" & _ 
     Me.subscriptionNo & " AND journal=" & Me.Journal & _ 
     " AND volume=" & Me.volume & " AND issue=" & Me.issue 
    rsGlobals.Open sql, CurrentProject.Connection, adOpenDynamic, adLockOptimistic, adCmdText 
    If Not rsGlobals.BOF And Not rsGlobals.EOF Then 
     MsgBox ("Already entered") 
     Cancel = True 
     Me.Undo 
    End If 
End Sub 

它没有做任何事 - 只是坐在那里。当我关闭表单时,它会弹出一个-id已经存在的框。

任何想法,我很没有经验,当谈到Access VB。

谢谢

回答

1

它不会做任何事情 - 只是坐在那里

只是检查,因为你说你没有经验与Access ......不会触发形式更新事件,直到记录保存尝试。只要用户将数据输入到所有字段,这可能不会自动发生。但是,您可以通过导航到子窗体中的其他记录或通过选择记录 - >从访问保存记录(2003)主菜单等方法触发更新。

我没有看到你的BeforeUpdate过程有什么问题。仍然我会转换它使用DCount()函数,而不是打开ADO记录集。 (请参阅访问帮助主题DCOUNT)

Private Sub Form_BeforeUpdate(Cancel As Integer) 
    Dim strCriteria As String 
    strCriteria = "subscriptionNo=" & Me.subscriptionNo & " AND journal=" & Me.Journal & _ 
     " AND volume=" & Me.volume & " AND issue=" & Me.issue 
    Debug.Print strCriteria 
    If Dcount("subscriptionNo", "CustomerAnswerD", strCriteria) > 0 Then 
     MsgBox ("Already entered") 
     Cancel = True 
     Me.Undo 
    End If 
End Sub 

那假设你的表的subscriptionNo,期刊,体积和问题字段都为数字数据类型。如果它们中的任何一个都是文本类型,则需要在strCriteria中将引号括起来。

我添加了Debug.Print strCriteria因此您可以在即时窗口中查看已完成的字符串表达式。您还可以通过复制该字符串并将其粘贴到作为WHERE子句的新查询的SQL视图中来解决该已完成字符串的问题。

此外,请考虑在subscriptionNo,日记帐,卷和问题上为您的CustomerAnswerD表设计添加唯一索引。这样你就可以在不依赖你的表单的情况下执行唯一性。使用DCount函数或您的原始记录集SELECT语句,该索引还将使您获得更快的性能。

如果您保持原始记录集方法,请在退出过程之前关闭记录集并设置对象变量= Nothing。

+0

哦,哎呀。是的,这是一对夫妇的文字和数字字段。天啊。谢谢你的双眼,但我很感激。 – Chasester 2010-10-25 13:47:39