1

.FindLast を使用して特定のレコードを検索しようとしていますが、1 つの基準で機能していましたが、複数の基準で .FindLast を使用しようとすると機能しなくなりました。しかし、私は .FindFirst でほぼ同じステートメントを使用しており、それが機能するため、混乱しています。

表示されるエラーは、「条件式のデータ型が一致しません」です。エラーは次の行にあります: rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")。私は自分のコードをステップ実行し、行 .FindFirst ("DONOR_CONTACT_ID= 'strDonor1' and ORDER_NUMBER= 'strOrderNum1'") は正しく動作します。

Option Compare Database
Option Explicit

Public dbs As DAO.Database
Public rst As DAO.Recordset
Public rstOutput As DAO.Recordset
'Defines DAO objects
Public strDonor1 As Variant
Public strDonor2 As Variant
Public strRecip1 As Variant
Public strRecip2 As Variant
Public strOrderNum1 As Variant
Public strOrderNum2 As Variant
Public strLastDonor As Variant

Function UsingTemps()

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
strDonor1 = rst!DONOR_CONTACT_ID
'sets strTemp1 to the first record of the DONOR_CONTACT_ID
strRecip1 = rst!RECIPIENT_CONTACT_ID
strOrderNum1 = rst!ORDER_NUMBER
rst.MoveNext
'moves to the next record

Do While Not rst.EOF
'Loop while it's not the end of the file
    strDonor2 = rst!DONOR_CONTACT_ID
    'strTemp2 = DONOR_CONTACT_ID from T_RECIPIENT_SORT
    strRecip2 = rst!RECIPIENT_CONTACT_ID
    strOrderNum2 = rst!ORDER_NUMBER
    'Sets strRecip = RECIPIENT_CONTACT_ID FROM T_RECIPIENT_SORT
    With rstOutput
    'Uses T_OUTPUT table
    If (strDonor1 = strDonor2) And (strOrderNum1 = strOrderNum2) Then
    'Runs if temps have same DONOR_CONTACT ID

            If .RecordCount > 0 Then
            'If table has records then you can check

                rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")
                strLastDonor = rst!RECIPIENT_CONTACT_ID
                If strLastDonor = strRecip2 Then
                    Call LastDonor
                Else
                    Call FirstDonor
                End If
            Else
            'No records in T_Output so needs to add first record
                .AddNew
                !DONOR_CONTACT_ID = strDonor1
                !RECIPIENT_1 = strRecip1
                !ORDER_NUMBER = strOrderNum1
                .Update
            End If
    Else
        .FindFirst ("DONOR_CONTACT_ID= 'strDonor1' and ORDER_NUMBER= 'strOrderNum1'")
        If .NoMatch Then
            .AddNew
            !DONOR_CONTACT_ID = strDonor1
            !RECIPIENT_1 = strRecip1
            !ORDER_NUMBER = strOrderNum1
            .Update
        End If

    End If
    End With
    'Slides variables down
    rst.FindFirst "[RECIPIENT_CONTACT_ID] = " & strRecip2
    strDonor1 = strDonor2
    strRecip1 = strRecip2
    strOrderNum1 = strOrderNum2
    rst.MoveNext

Loop

Call LastRecord

Set dbs = Nothing
Set rst = Nothing
Set rstOutput = Nothing

End Function

編集:

次のコードを追加しました。

Dim strFind As Variant
strFind = "DONOR_CONTACT_ID= '" & strDonor1 & "' AND ORDER_NUMBER= '" & strOrderNum1 & "'"
Debug.Print strFind
rst.FindLast strFind

Debug.Print でこれを表示しました。

DONOR_CONTACT_ID= '10136851341' AND ORDER_NUMBER= '112103071441001'

これらは DONOR_CONTACT_ID と ORDER_NUMBER の正しい値ですが、rst.FindLast strFind 行で「条件式のデータ型が一致しません」というエラーが表示されます。変数をバリアントとして定義したことが原因でしょうか? テーブルには、DONOR_CONTACT_ID が 11 精度の Decimal として定義され、RECIPIENT_CONTACT_ID が 11 精度の Decimal として定義され、ORDER_NUMBER が 15 精度の Decimal として定義されています。次に、コード内の変数をバリアントとして定義します。これに問題があると思いますか?

4

2 に答える 2

4

これを変更すると、トラブルシューティングが容易になると思います...

rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")

このようなものに...

Dim strFind As String
strFind = "DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"
Debug.Print strFind
rst.FindLast strFind

コードがエラーをスローする場合、または単に期待どおりの結果が見つからない場合は、イミディエイト ウィンドウ ( Ctrl+ g) に移動し、 からの出力を調べますDebug.Print strFind。問題をすぐに見つけることができます。そうでない場合は、出力をコピーDebug.Printし、クエリ デザイナーで新しいクエリを開き、SQL ビューに切り替えて、コピーしたテキストをWHERE句で使用します。この場合、クエリ SQL は次のようになると思います。

SELECT *
FROM T_RECIPIENT_SORT
WHERE yadda_yadda;

yadda_yaddaを、イミディエイト ウィンドウからコピーしたテキストに置き換えます。

それは、一般的なトラブルシューティングのアドバイスのようなものでした. この特定の問題については、変数の値の代わりに変数の名前Findを含めるようにテキストを作成していると思います。これら 2 つの文字列式を実行すると、何が得られるかを確認してください。Debug.Print

"DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"
"DONOR_CONTACT_ID= '" & strDonor1 & "' AND ORDER_NUMBER= '" & strOrderNum1 & "'"

あなたのコードは最初のものを使用しましたが、実際には2番目が必要だと思います.

あなたが報告DONOR_CONTACT_IDした質問の更新でORDER_NUMBERは、両方とも数値データ型です。その場合、文字列内でそれらの検索値を引用しないでくださいFind

"DONOR_CONTACT_ID= " & strDonor1 & " AND ORDER_NUMBER= " & strOrderNum1
于 2013-08-02T16:08:36.257 に答える