3

しばらくの間持っていたデータベースの1つに問題があり、それはやや厄介です。

ユーザーが各レコードの情報を入力してから、(各レコードの)[コミット]ボタンをクリックする必要がある、連続表示のフォームがあります。

そのレコードに入力された値に基づいて、「コミット」ボタンは最初に2つのテーブルのいずれかに情報を挿入し、次にフォームがクエリを実行している一時テーブルからレコードを削除します。

そのための擬似コードはここにあります:

IF x.checked && y > 70 then
  db.execute "Insert into tblCompleted values (me.empID,'completed',me.y);
else
  db.execute "insert into tblIncompleted values (me.empid, 'incomplete', 'me.y);
end if
db.execute "delete * from tblTemporary WHERE empid = me.empID"
 'form.requery
'form.refresh

「レコードが削除されました」ランタイムエラーが発生することがあります。同じレコードに対して2回発生することもあります。ただし、すべての操作は機能します。ただし、完了すると、レコードには##DELETEDが表示されます。これを修正するために、コードの最後にForm.refreshおよびForm.requeryステートメントを配置します。これにより、## DELETEDレコードが削除されますが、「レコードが削除されました」というエラーが表示されることがよくあります。

「なぜ2つのテーブルを使用しているのか、これを1つのテーブルでモデル化できないのか」と言う前に、これは私が実際に行っていることの単純化されたバージョンです。

私の主な関心事は、この実行時エラーです。私はそれを捕まえて未処理のままにすることもできましたが、実際に修正してこのバグのあるフォームを整理したいと思います。何かご意見は?

4

5 に答える 5

4

その理由は、レコードを削除した直後、フォームがまだそれを表示しようとしているためだと思います。関連する投稿の回答は、このようなコードを使用して現在のレコードを削除する前に、ブックマークを前のレコードに移動することを提案しています。

于 2012-10-24T18:39:01.953 に答える
1

テーブルを削除する前にRecordSourceを削除してから、再度追加してください。

form.RecordSouce = ""
db.execute "delete * from tblTemporary WHERE empid = me.empID"
form.RecordSouce = "tblTemporary"
于 2012-10-24T18:50:37.647 に答える
1

これが投稿されてから数年が経ちましたが、同じ問題が発生し(Access 2010)、上記のコメントを読んだ後、削除する前に次のレコードに移動するという以下の解決策を思いつきました。

        delBatchID = [ID]

        Me.Recordset.MoveNext

        'delete the batch headers
        qString = "Delete From T_Imported_Files Where ID = " & delBatchID & ";"
        CurrentDb.Execute qString

        'update the form to show that the batch is gone.
        Form.Requery
于 2014-07-31T13:10:16.653 に答える
0

次のようなものを試してください。

Dim lEmpID as Long
lEmpID = Me!EmpID
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True
db.Execute "DELETE * FROM tblTemporary WHERE empid = " & lEmpID

ここでの基本的な考え方は、通常のDeleteコマンドを使用して、おそらく1つのテーブルから1つのレコードを削除できるということです。これは、レコードがもう存在しないことをフォームに納得させるのに十分である可能性があります。

(カスケードの削除を使用して)参照整合性を構成する方法によっては、最後のdb.Executeを実行する必要がない場合もあります。

于 2012-10-24T22:37:15.720 に答える
0

これが古いスレッドであることは知っていますが、これに遭遇し、サブフォームの外部のコントロールにフォーカスを移動することで解決しました。問題は、私が削除しようとしていたレコードにまだ残っていることのようでした。

    Dim response As VbMsgBoxResult 
    Dim strSQL As String

    response = MsgBox("Are you sure you want to delete this record?", vbYesNo + vbQuestion, "Delete Record?")

    Select Case response
        Case vbYes
            strSQL = "DELETE FROM TABLENAME WHERE ID = " & Me.ID
            Forms("ParentForm").Form.Controls("TextBox1").SetFocus
            If ExecuteSQL(strSQL) = False Then MsgBox "There was an error deleting this record." & vbCrLf & vbCrLf & "If the problem persists, please contact your             System Administrator.", vbOKOnly + vbExclamation, "Error"
            Me.Requery
        Case vbNo

    End Select

Public Function ExecuteSQL(sSQL As String) As Boolean
On Error GoTo HandleError

    DoCmd.SetWarnings False
'    Debug.Print sSQL
    DoCmd.RunSQL sSQL

    ExecuteSQL = True

Exit_ExecuteSQL:
'    Debug.Print sSQL
    DoCmd.SetWarnings True
    Exit Function

HandleError:
    GeneralErrorHandler err.Number, err.Description, "modDatabaseCalls", "ExecuteSQL", True
    ExecuteSQL = False
    Resume Exit_ExecuteSQL

End Function
于 2015-10-28T15:17:07.690 に答える