2016-03-29 4 views
2

ユーザーがキャンセルした場合に新しく作成されたレコードを削除するようにコードを取得しようとしています。何らかの理由で、テーブル内に存在する一意のIDをクエリが確実にフィルタリングしていても、アクセスはレコードを削除しません。アクセスはエラーを投げていません。CurrentDb.Execute delete query VBAから実行されたときに何も削除しない

PG_IDは両方のテーブルの一意の識別子です。これは長い整数です。

以下に、私のコードのサンプル部分を含めました。助けてください!

Dim var_PGID As String 
    Dim Delete_PG_Data, Delete_PG_Upld As String 
    Dim db As Database 
     Set db = CurrentDb 
     var_PGID = TempVars![var_PG_ID_NEW] 
     Delete_PG_Data = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group " & _ 
         "WHERE PG_ID=" & var_PGID 
     Delete_PG_Upld = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group_Attachements " & _ 
         "WHERE PG_ID=" & var_PGID 
     Debug.Print Delete_PG_Data 
     Debug.Print Delete_PG_Upld 
     db.Execute Delete_PG_Data, dbFailOnError 
     db.Execute Delete_PG_Upld, dbFailOnError 

私はmsgboxをDebug.Printに切り替えました。以下は、アクセスクエリに置かれたときに正しく動作するdebug.print出力です。

タイミングの問題でした。トランザクションをコミットしてから削除クエリを実行することで修正しました。あなたのご意見ありがとうございました!

Private Sub cmd_Cancel_Click() 
On Error Resume Next 
DoCmd.SetWarnings False 
If TempVars![var_NewRecord] = True Then 
    Do While Not Me.Recordset.EOF 
      Me.Recordset.Update 
      Me.Recordset.MoveNext 
     Loop 
      DBEngine.CommitTrans 
      Me.Recordset.Close 
    Dim var_PGID As String 
    Dim Delete_PG_Data, Delete_PG_Upld As String 
    Dim db As Database 
     Set db = CurrentDb 
     var_PGID = TempVars![var_PG_ID_NEW] 
     Delete_PG_Data = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group " & _ 
         "WHERE PG_ID=" & var_PGID 
     Delete_PG_Upld = "DELETE * " & _ 
         "FROM tbl_CapEx_Projects_Group_Attachements " & _ 
         "WHERE PG_ID=" & var_PGID 
     Debug.Print Delete_PG_Data 
     Debug.Print Delete_PG_Upld 
     db.Execute Delete_PG_Data, dbFailOnError 
     db.Execute Delete_PG_Upld, dbFailOnError 

    ''Me.Recordset.Delete 
    ''DBEngine.BeginTrans 
    ''DBEngine.CommitTrans 
Else 
    If Me.Saved Then 
     DBEngine.Rollback 
    Else 
     If Me.Dirtied Then DBEngine.Rollback 
    End If 
End If 
DoCmd.Close ObjectType:=acForm, ObjectName:=Me.Name 
    Form_frm_CapEx_Edit_Project_Groups_Cont.Requery 
DoCmd.SetWarnings True 
End Sub 
+0

PG_IDが本当に長いintであればうまくいくようです。 'MsgBox'を' Debug.Print'で置き換えて、イミディエイトウィンドウの出力をあなたの質問に追加してください(Ctrl + Gはあなたをそこに連れて行きます)。 - 参照:[動的SQLをVBAでデバッグする方法](0120-18753-03) – Andre

+1

アクセスにエラーが発生する可能性がありますが、 dbFailOnError'パラメータをdb.Executeに設定します。 Delete_PG_DataおよびDelete_PG_Upld変数の値をクエリビルダにコピーして実行してください。 –

+0

TempVars![var_PG_ID_NEW]変数に正しい値が含まれていますか? –

答えて

0

使用DoCmd.RunSQL

例:

Public Sub DoSQL() 

    Dim SQL As String 

    SQL = "UPDATE Employees " & _ 
      "SET Employees.Title = 'Regional Sales Manager' " & _ 
      "WHERE Employees.Title = 'Sales Manager'" 

    DoCmd.RunSQL SQL 

End Sub 

したがって、あなたの新しいコードは以下のようになります:

Dim var_PGID As String 
Dim Delete_PG_Data, Delete_PG_Upld As String 
var_PGID = TempVars![var_PG_ID_NEW] 
Delete_PG_Data = "DELETE * " & _ 
        "FROM tbl_CapEx_Projects_Group " & _ 
        "WHERE PG_ID=" & var_PGID 
Delete_PG_Upld = "DELETE * " & _ 
        "FROM tbl_CapEx_Projects_Group_Attachements " & _ 
        "WHERE PG_ID=" & var_PGID 
MsgBox Delete_PG_Data 
MsgBox Delete_PG_Upld 
DoCmd.RunSQL Delete_PG_Data 
DoCmd.RunSQL Delete_PG_Upld 
+2

実際には 'db.Execute'は' DoCmd.RunSQL'よりも良い選択です:http://www.fmsinc.com/microsoftaccess/query/action-queries/SuppressWarningMessages.htm – Andre

+1

DoCmd.RunSQLは、実行前にデフォルトの警告を無効にする必要もあります。プロシージャが有効になる前に失敗した場合は、設計モードでのアクションの入力を求められません。データベースへの偶発的な損傷を引き起こす可能性があります。 –

+0

Andreと@Sergeyに感謝します。私はまた、DBを使用して開始されます。私の将来のプロジェクトで実行します。 –

1

..ユーザーならば、新しく作成されたレコードを削除キャンセルする

レコードのようなサウンドは保存されません。そうでなくても、フォームとは別のコンテキストでクエリを実行するときのタイミングの問題になる可能性があります。

実際に作成されている場合は、フォームのRecordsetCloneからレコードを削除するのが最も簡単で簡単な方法です。

+0

タイミングに問題がある可能性があります。私は上記の新しいレコードを作成するコードを添付します。問題は、メインテーブルと同時に別のレコードを作成する必要があることです。 2番目のテーブルは、同じテーブル上にあるときにクエリが遅くなっているため、すべての添付ファイルを保持しています。 2番目のレコードは初期の作成されたメインレコードの一部ではないため、問題が発生している場所ですが、参加しました。 – Moehling

+0

タイミングの問題のように思えます。挿入からのロックはまだ削除されていませんが、削除は実行できません。ロックはファイルシステムで行われ、削除に時間がかかる可能性があります。 ** RecordsetClone **が動作しない場合は、フォームの** Recordset **、ロックが適用されたオブジェクトになります。 – marlan

+0

グスタフありがとう、タイミング問題でした。私はトランザクションをコミットして削除した後、なぜ2番目の添付テーブルが前に削除されないのか不明な点を修正しましたが、いずれにしてもこれを修正するように見えました。私は上記の変更されたコードを添付しました。再度ありがとう – Moehling

関連する問題