1

そのため、いくつかの異なるフラグなどを設定するシステムを構築していますが、ステージングテーブルの内容を取得して、追跡に使用する別のテーブルに送信することもできます。ループへの挿入を使用してそれを実行しようとしていますが、意図したとおりに機能させる方法がわかりません。

Private Sub Form_Load()
    DoCmd.SetWarnings False
    DoCmd.OpenQuery ("qryDeleteEmail")
    Dim db As Object
    Dim rst As Object
    Dim test As Object

    Set db = Application.CurrentDb
    Set rst = db.OpenRecordset("qryDate")
    Set test = db.OpenRecordset("tblEmailTemp")

    If Me.RecordsetClone.RecordCount = 0 Then
        MsgBox ("No delinquent accounts. No email will be generated.")
        Me.Refresh
        DoCmd.Close acForm, "qryDate", acSaveNo
        DoCmd.CancelEvent
    Else
        rst.MoveFirst
        Do Until rst.EOF
           rst.Edit
           rst!NeedsEmail = 1
           rst.Update
           rst.MoveNext
        Loop

        'DoCmd.Requery
        'rst.Close


        DoCmd.RunMacro ("StagingTable")
        test.MoveFirst

        Do Until test.EOF
            CurrentDb.Execute "Insert Into EmailTracking (Account, ExpirationDate)" & _
                "Values ('" & AccountName & "', '" & ExpirationDate & "')"
            test.MoveNext              
        Loop

        test.Close
        rst.MoveFirst

        Do Until rst.EOF
            rst.Edit
            rst!EmailSent = 1
            rst.Update
            rst.MoveNext
        Loop

        'DoCmd.Requery
        rst.Close
        DoCmd.RunMacro ("Close")
        'DoCmd.OpenQuery ("qryDeleteEmail")
    End If
    Exit Sub
End Sub

現在起こっていることは、ステージングテーブルの最初のレコードを2回コピーしていることです。たとえば、アカウント名Aとアカウント名Sがありますが、AのレコードとSのレコードを挿入する代わりに、Aを2回挿入するだけです。

どんな助けでも大歓迎です!

4

2 に答える 2

4

解決しようとしている問題に焦点を絞った、より簡単な手順を作成してテストします。残念ながら、その問題が何であるかはわかりません。とにかくこれを提案します...

Public Sub TestLoopThruTable()
    Dim db As DAO.database
    Dim test As DAO.Recordset
    Dim strInsert As String

    DoCmd.SetWarnings True ' make sure SetWarnings is on
    Set db = CurrentDb
    Set test = db.OpenRecordset("tblEmailTemp")
    Do While Not test.EOF
        strInsert = "INSERT INTO EmailTracking (Account, ExpirationDate)" & vbCrLf & _
            "VALUES ('" & AccountName & "', '" & ExpirationDate & "')"
        Debug.Print strInsert
        'db.Execute strInsert, dbFailOnError
        test.MoveNext
    Loop
    test.Close
    Set test = Nothing
    Set db = Nothing
End Sub

元のバージョンでは、との間ExpirationDate)にスペースがなかったことに注意してくださいValuesvbCrLfスペースの代わりに改行()を使用しましたが、どちらでもdbエンジンを満足させることができます。

オンになっていることを確認SetWarningsしました。コードでは、最初にオフにしましたが、再びオンにすることはありませんでした。オフで操作するSetWarningsと、コードの問題を理解するために使用できる重要な情報が抑制されます。

そのコードはレコードセットをループするため、INSERTステートメントを作成して各行に表示するだけです。イミディエイトウィンドウで出力を表示できます(Ctrl+gキーボードショートカットを使用してそこに移動します)。これらのステートメントの1つをコピーINSERTし、新しいAccessクエリのSQLビューに貼り付けてテストします。そこで失敗した場合は、dbエンジンを満たすために何を変更する必要があるかを理解してください。INSERT成功した場合は、コードから実行してみてくださいdb.Execute。行の先頭から一重引用符を削除して、その行を有効にします。

VALUES句を書いた方法で[ExpirationDate]は、テキストフィールドが表示されます。ただし、そのデータ型が実際に日付/時刻である場合は、挿入する値を引用符で囲まないでください。#引用符の代わりに日付区切り文字を使用してください。

また、次のようにコードモジュールの宣言セクションに必ず含めOption Explicitてください。

Option Compare Database
Option Explicit

この質問の以前のバージョンであなたが示しOption Compareたが、そうではなかったので、私はその点に言及しましたOption Explicit。IMOを使用せずにコードのトラブルシューティングを試みるOption Explicitのは、時間の無駄です。

于 2012-12-27T18:01:20.637 に答える
1

あなたがここで何をしようとしているのかわかりません。(コメントされていても)ステートメントで何ErrorHandlerが行われているのかを理解するのは難しいです。Else

レコードセットをループする限り、MS-AccessのVBAプログラミングの基礎について少し読むことをお勧めします。以下の記事を読むことから始めることができます。これは、VBAレコードセットについての簡単な紹介であり、次にVBAで最も一般的な間違いです。

http://allenbrowne.com/ser-29.html

http://www.techrepublic.com/blog/10things/10-mistakes-to-avoid-when-using-vba-recordset-objects/373

それはあなたのコードを改善するのに役立つはずです。

于 2012-12-27T17:00:53.120 に答える