如何将 rst.FindFirst 与 rst.NoMatch 一起使用?

Posted

技术标签:

【中文标题】如何将 rst.FindFirst 与 rst.NoMatch 一起使用?【英文标题】:How to use rst.FindFirst with rst.NoMatch? 【发布时间】:2013-07-11 01:32:40 【问题描述】:

我的代码工作除了这一行

.FindFirst "[DONOR_CONTACT_ID] = strTemp2"

我希望我的代码检查是否存在特定 DONOR_CONTACT_ID 的记录,因为有多个记录具有相同的 DONOR_CONTACT_ID。如果该记录不存在,那么我想将 DONOR_CONTACT_ID 和 RECIPIENT_CONTACT_ID 添加到 RECIPIENT_1。如果该记录确实存在,我想将 RECIPIENT_CONTACT_ID 添加到 RECIPIENT_2 以获取特定的 DONOR_CONTACT_ID。为此,我使用 .FindFirst,查看是否有记录,然后使用 .NoMatch。如果没有匹配,我想添加一条新记录,但如果有,我想检查它是否必须进入 RECIPIENT_2。

我得到的错误是“不将 'strTemp2' 识别为有效的字段名称或表达式”。我想看看记录是否等于strTemp2,但我认为我的语法错误。感谢您的帮助!

这是我的代码:

Option Compare Database
Option Explicit

Function UsingTemps()

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim rstOutput As DAO.Recordset
'Defines DAO objects
Dim strTemp1 As String
Dim strTemp2 As String
Dim strVal As String
Dim strRecip As String

DoCmd.SetWarnings False
DoCmd.OpenQuery ("Q_RECIPIENT_SORT")
DoCmd.OpenQuery ("Q_DELETE_T_OUTPUT")
DoCmd.SetWarnings True
Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("T_RECIPIENT_SORT", dbOpenDynaset)
'rst refers to the table T_RECIPIENT_SORT
Set rstOutput = dbs.OpenRecordset("T_OUTPUT", dbOpenDynaset)
'rstOutput refers to the table T_OUTPUT

rst.MoveFirst
'first record
strTemp1 = rst!DONOR_CONTACT_ID
'sets strTemp1 to the first record of the DONOR_CONTACT_ID
rst.MoveNext
'moves to the next record


    Do While Not rst.EOF
    'Loop while it's not the end of the file
        strTemp2 = rst!DONOR_CONTACT_ID
        'strTemp2 = DONOR_CONTACT_ID from T_RECIPIENT_SORT

    If strTemp1 = strTemp2 Then
    'Runs if temps have same DONOR_CONTACT ID
        strRecip = rst!RECIPIENT_CONTACT_ID
    'Sets strRecip = RECIPIENT_CONTACT_ID FROM T_RECIPIENT_SORT

        With rstOutput
        'Uses T_OUTPUT table
            If .RecordCount > 0 Then
            'If table has records then you can check
                .FindFirst "[DONOR_CONTACT_ID] = strTemp2"
                If .NoMatch Then
                    .AddNew
                    !DONOR_CONTACT_ID = strTemp1
                    !RECIPIENT_1 = strRecip
                    .Update
                Else

                    If !DONOR_CONTACT_ID = strTemp2 Then
                        If IsNull(!RECIPIENT_2) And Not (IsNull(!RECIPIENT_1)) Then
                            .Edit
                            !RECIPIENT_2 = strRecip
                            .Update
                        End If
                        .AddNew
                        !DONOR_CONTACT_ID = strTemp2
                        !RECIPIENT_1 = strRecip
                        .Update
                    End If
                End If

            Else
                .AddNew
                !DONOR_CONTACT_ID = strTemp2
                !RECIPIENT_1 = strRecip
                .Update
            End If

        End With

    End If

    strTemp1 = strTemp2
    rst.MoveNext

Loop

Set dbs = Nothing

End Function

【问题讨论】:

【参考方案1】:

将变量的,而不是变量name,构建到您提供FindFirst 以查找的字符串中。

假设DONOR_CONTACT_ID 是文本数据类型,还包括变量值的引号...

.FindFirst "[DONOR_CONTACT_ID] = '" & strTemp2 & "'"

但如果是数字,则不需要那些引号...

.FindFirst "[DONOR_CONTACT_ID] = " & strTemp2

【讨论】:

你连续第二天帮助了我!再次感谢!我办公室里没有其他人知道如何编码,所以我非常感谢您在过去两天帮助我并为我节省了这么多时间!

以上是关于如何将 rst.FindFirst 与 rst.NoMatch 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 'afterColumnResize' 事件与 'rhandsontable' 一起使用?

如何将 Quickblox 与 angularjs 集成?

如何将手表与 iPhone 连接

如何将两个整数与 Twisted 相加?

如何将 Celery 与 asyncio 结合使用?

我们如何将 OCP 与委托一起使用?