5

簡潔で賢明な解決策を期待して、ここで簡単な質問をします。

純粋にデータ入力用にバインドされたフォームがあります (レコードを参照できず、挿入のみできます)。めちゃくちゃになるユーザーがたくさんいるでしょう。汚いデータを避けるために、レコードを送信する前にフォームが正しいことを確認してほしい.

問題は、フォームに何かを入力するとすぐに、アクセスがレコードを作成して保存することです。

ユーザーが「送信」をクリックした場合にのみ、レコードを保存してコミットしたい。アプリケーションを閉じるか終了する場合、部分的に完了したレコードをデータベースに残したくありません。

バインドされていないフォームを使用せずに挿入関数を呼び出さないで、簡単な解決策はありますか?

4

3 に答える 3

6

自動採番は、連続したものではなく、一意であるためのものです。連番が必要な場合は、自動採番を使用しないでください。自動採番はユーザーに表示されません。それは決してユニークであることに頼ることはできません。

Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.AText = "Invalid" Then
    Me.Undo
    Cancel = True
End If
End Sub

サブフォームからメイン フォームへの変更、またはその逆の変更時にレコードがコミットされ、すべてが非常に複雑になるため、サブフォームを含むフォームは元に戻すことができない場合があることに注意してください。

于 2013-01-03T20:41:29.843 に答える
3

ユーザーがエラーを起こし、フォーム全体をクリアして最初からやり直したい場合に備えて、次のコードを使用してクリア ボタンを作成できます。

Private Sub btnClear_Click() 
  If Me.Dirty = True Then
    DoCmd.RunCommand acCmdUndo
    Exit Sub
  End If
End Sub`

before_update イベントの動作がおかしくなることがあるので、通常はプロパティで閉じる (x) ボタンを無効にし、ユーザーが画面上のデータを破棄するかどうかを確認する独自の閉じるボタンを追加します。

Private Sub close_Click()
 Dim Answer As Integer
 If Me.Dirty = True Then
    Dim Response As Integer
    ' Displays a message box with the yes and no options.
    Response = MsgBox(Prompt:="Do you wish to discard data?", Buttons:=vbYesNo)
    ' If statement to check if the yes button was selected.
    If Response = vbYes Then
        DoCmd.RunCommand acCmdUndo
        DoCmd.Close
        Else
        Me.Clear.SetFocus
    End If
 Else
    ' The no button was selected.
    DoCmd.Close
  End If
End Sub
于 2014-01-24T17:00:53.777 に答える
3

Remou の方法は間違いなく最速です。これは私のコメントに基づいた別の方法です ;)

Option Explicit

Private blnGood As Boolean

Private Sub cmdSubmit_Click()
    blnGood = True
    Call DoCmd.RunCommand(acCmdSaveRecord)
    blnGood = False
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Not blnGood Then
        Cancel = True
        Call MsgBox(Prompt:="click submit to save the record", Title:="Before Update")
    End If
End Sub
于 2013-01-03T20:44:43.417 に答える