2017-11-27 7 views
1

私のクラスデータベースの最後の質問があります。ユーザーがデータを表示できる特定のフォームでは、フォームを閉じることができるようにし、変更を加えなかった場合はプロンプトを表示しないようにします。しかし、フォームのデータを変更したり、レコードを編集したりする場合は、変更を保存するかどうかをユーザーに尋ねるポップアップボックスを表示するようにしてください。 「はい」を選択すると、古いレコードは上書きされ、変更はレコードに保存されますが、「いいえ」を選択した場合はレコードがまったく変更されず、フォームが閉じます。ユーザーにフォームの保存を促す

どうすればいいですか?私はAccess 2016を使用しています。これまでに試したことがエラーになります。ここでは、VBAのBeforeUpdateイベントのフォームで試した2つのメソッドを示します。

方法1:

Private Sub Form_BeforeUpdate(Cancel As Integer) 

    Dim strMsg As String 
    Dim iResponse As Integer 

    ' Specify the message to display. 
    strMsg = "Do you wish to save the changes?" & Chr(10) 
    strMsg = strMsg & "Click Yes to Save or No to Discard changes." 

    ' Display the message box. 
    iResponse = MsgBox(strMsg, vbQuestion + vbYesNo, "Save Record?") 

    ' Check the user's response. 
    If iResponse = vbNo Then 

     ' Undo the change. 
     DoCmd.RunCommand acCmdUndo 

     ' Cancel the update. 
     Cancel = True 
    End If 
End Sub 

Error - "The expression Before Update you entered as the event property setting produced the following error: A problem occured while Microsoft Access was communicated with the OLE server or ActiveX Control."

方法2:

Private Sub Form_BeforeUpdate(Cancel As Integer) 

'Provide the user with the option to save/undo 
'changes made to the record in the form 

    If MsgBox("Changes have been made to this record." _ 
     & vbCrLf & vbCrLf & "Do you want to save these changes?" _ 
     , vbYesNo, "Changes Made...") = vbYes Then 
      DoCmd.Save 
     Else 
      DoCmd.RunCommand acCmdUndo 
    End If 
End Sub 

エラー - 上記と同じです。

ご協力いただきありがとうございます。

ありがとうございます!

答えて

0

この問題は、非ユニコードプログラムの言語設定が、作成されたコンピュータ上で、実行中のコンピュータ上で、または言語設定の変更によって異なることが原因で発生する可能性があります。それでも解決しない場合は

レビューthis Microsoft support page

、あなたもthis answerを確認することができます。それは非常に徹底的で、いくつかのステップはあなたには当てはまらないかもしれませんが、逆コンパイルと再コンパイルの両方がこのエラーを修正するかもしれません。

メモ:あなたのコードは、あなたが思うものではありません。現在のレコードを保存するには、DoCmd.RunCommand acCmdSaveRecordを使用します。 DoCmd.Saveは、レコードではなくフォームオブジェクトに加えられた変更をすべて保存します。しかし、BeforeUpdateイベントでレコードを保存する必要はありません.

+0

おかげサブExit_BeforeUpdate エンドを再開 。 Accessについてもっと勉強しなければならないことが分かります。 – Adam

0

DoCmdメソッドはまったく意味がありません。 さらに、返信が「いいえ」であるかどうかを確認するだけで済みます。これを試してみてください :ユーザーがデータを表示することができ、特定のフォームの場合

If Me.Dirty Then 'has existing data been changed? 
    If MsgBox("Changes have been made to this record." _ 
     & vbCrLf & vbCrLf & "Do you want to save these changes?", _ 
     vbYesNo, "Changes Made...") = vbNo Then 
     Cancel = True 
     Me.Undo 
    End If 
End If 
+0

ルネありがとう、私はこれらのコード例をオンラインで見つけたので、意味が分からなかった。あなたの例としては、どこにコードを挿入すればよいですか? BeforeUpdateまたはOnDirty?更新前には何もしません。 – Adam

0
  1. を、私は彼らが、彼らは何も変更をしなかった場合はプロンプトが表示され、フォームを閉じていないことができるようにしたいです。 **これはアクセス標準の動作です。何もする必要はありません。

  2. ただし、フォーム内のデータを変更したり、レコードを編集したりする場合は、ポップアップボックスを表示させますユーザーが変更を保存したい場合 **これは標準ではなく、一般的に推奨コンセプトではありません。このトリガーのための正確な時点と、多くのフィールドを持つ画面/フォームの正確な時点を判断する必要があります。これは、クローズまたはレコードの変更時にのみ行うことができます。この場合、Dirtyの場合はメッセージボックスがトリガーされます)

  3. 「はい」を選択すると、古いレコードは上書きされ、変更はレコードに保存されますが、「いいえ」を選択した場合はレコードがまったく変更されず、フォームが閉じます。 **元に戻す方法

**を見上げるが、一般的には、製品の標準設計は、あなたが任意のプロンプトを表示せずに行くようにすべてが保存されていることです。これがそうするべき方法です。プロンプトを保存するときにデータ入力中にエラーが発生する確率が同じであるという点で、プロンプトの保存に実際の価値はありません。

0

このコードは、マイクロソフトのウェブサイトで見つかりました。意図しないエラーで動作します。

プライベートサブForm_BeforeUpdate(整数としてキャンセル)

変更「この手順は、チェックは、フォーム上のデータが を有しているかどうかを確認します」。データが変更された場合は、 'ユーザーに保存操作を続行するかキャンセルするかを尋ねるプロンプトが表示されます。 Then 'BeforeUpdateイベントをトリガしたアクションが完了しました。レコードが変更された場合はエラー後藤Err_BeforeUpdate

上のコントロール

として

薄暗いCTLは「ダーティプロパティはTrueです。 Me.Dirty Then '保存操作を確認するプロンプトが表示されます。 のMsgBox( "保存したいですか?"、vbYesNo + vbQuestion、_ "保存記録")= vbNo次に Me.Undo エンド END IF

Exit_BeforeUpdateもしあれば: 出口サブ

Err_BeforeUpdate: のMsgBox Err.Numberに& "" & Err.Descriptionは

関連する問題