2

テーブルを開いてデータを取得するフォームがあります。そしてそれをテキストボックスに入れます。このフォームには、「CustomerInfoBackBtn」という名前のボタンがあります。

内部にある動作しないコードは次のとおりです (テキスト ボックスを編集すると、Access が自動的にデータを保存するだけかもしれません)。

Private Sub CustomerInfoBackBtn_Click()
Dim LResponse As Integer

LResponse = MsgBox("Would you like to save?", vbYesNo, "Save?")

If LResponse = vbYes Then
   DoCmd.RunCommand acCmdSaveRecord
   DoCmd.Close
   DoCmd.OpenForm "CustomerListF"
Else
   DoCmd.Close
   DoCmd.OpenForm "CustomerListF"
End If
End Sub

保存するかどうかを尋ねるメッセージボックスをポップアップ表示するにはどうすればよいですか。はいを押すと保存され、サブフォームが更新されて前のフォーム (CustomerListF) が開き、いいえを押すと保存されません。 、情報を以前のものに戻し、以前のフォームを開きますか? 本当に必要なのは、アクセスがデータの変更を自動的に保存しないようにする方法だけだと思いますが、よくわかりません。

答えを編集:

そのエラーを表示するボタンのコード:

Dim TempSaveRecord As Boolean

Private Sub CustomerNotesBackBtn_Click()
  If MsgBox("Do you want to save your changes?", vbInformation + vbYesNo, [Warning! Some data may be lost.]) = vbNo Then
    TempSaveRecord = False
  Else
    TempSaveRecord = True
  End If

  DoCmd.Close
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
  If (TempSaveRecord) Then
    DoCmd.Save
  Else
    DoCmd.RunCommand acCmdUndo
  End If
End Sub
4

2 に答える 2

1

フォームにバインドされた DAO.Recordset は、ユーザーの操作なしで DAO エンジンによって自動的に保存されます。あなたの場合、警告なしに、または[戻る]または[閉じる]ボタンをクリックする前に、いつでも変更を保存できます。

transaction here または ADO を使用して、次のように回避できます。

Option Compare Database
Option Explicit

Private boolFrmDirty As Boolean
Private boolFrmSaved As Boolean

Private Sub Form_AfterDelConfirm(Status As Integer)
    If Me.Saved = False Then Me.Saved = (Status = acDeleteOK)
End Sub

Private Sub Form_AfterUpdate()
    Me.Saved = True
End Sub

Private Sub Form_Delete(Cancel As Integer)
    If Me.Dirtied = False Then DBEngine.BeginTrans
    Me.Dirtied = True
End Sub

Private Sub Form_Dirty(Cancel As Integer)
    If Me.Dirtied = False Then DBEngine.BeginTrans
    Me.Dirtied = True
End Sub

Private Sub Form_Open(Cancel As Integer)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT * FROM Customers", dbOpenDynaset)
    Set Me.Recordset = rs
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Dim msg As Integer
    If Me.Saved Then
        msg = MsgBox("Do you want to commit all changes?", vbYesNoCancel)
        Select Case msg
            Case vbYes
                DBEngine.CommitTrans
            Case vbNo
                DBEngine.Rollback
            Case vbCancel
                Cancel = True
        End Select
    Else
        If Me.Dirtied Then DBEngine.Rollback
    End If
End Sub

Public Property Get Dirtied() As Boolean
    Dirtied = boolFrmDirty
End Property

Public Property Let Dirtied(boolFrmDirtyIn As Boolean)
    boolFrmDirty = boolFrmDirtyIn
End Property

Public Property Get Saved() As Boolean
    Saved = boolFrmSaved
End Property

Public Property Let Saved(boolFrmSavedIn As Boolean)
    boolFrmSaved = boolFrmSavedIn
End Property

ADODB.Recordset を form.Recordset として使用すると、

Dim rst As ADODB.Recordset
'
'... Create it by querying a remote db.
'
Set Me.Recordset = rst

したがって、ユーザーの変更の保存または破棄を制御できます。ADO ドライバーはデータベース自体に保存できないため... より複雑です。

参照からのコード

于 2013-10-29T15:44:22.117 に答える