教えて! goo のコンテンツに対する取り組みについて

Accessでデータベースのレコード追加を行うフォームを作成しています。

コマンドボタン(1)をクリック→新しいレコードの追加
コマンドボタン(2)をクリック→フォームを閉じる
としています。(ウィザードを使用して、埋め込みマクロ?を設定しています。)

コマンドボタン(1)でレコードが追加されるのは問題ないのですが、
コマンドボタン(2)をクリックした場合も、レコードが追加されていることに気がつきました。

一般的に入力する人は、
データを追加しようと思って入力していたけれど、
途中でやめてフォームを閉じることってありますよね?
そういう場合にレコードが追加されてしまったら問題だと思ったのです。

ですが、どうしたらレコードの追加をせずにフォームを閉じられるかがわかりません。
それって可能でしょうか?

Access初心者です。難しいVBAとかはまだよくわかりません。
何か方法、アドバイス等ありましたら
よろしくお願いします。

gooドクター

A 回答 (2件)

フォームを閉じたときに保存されるのは仕様です


それ以外にAccessを終了したとき、レコードを移動したときにも保存されます

これらを完全にカバーするには、非連結のフォームにし
ボタンクリックでデータをテーブルに書き込むようにするか

作業用のテーブルから作ったフォームで入力し
ボタンクリックで本テーブルに転記するようにします

どちらにしてVBAが必要ですね、しかもへんなレコードを書き込もうとすると
コードが止まってしまいますから
転記前にデータの整合性を完全にチェックする必要があります

という訳でかなりきちんとしたコードが書けるスキルが必要ですね
    • good
    • 0
この回答へのお礼

お礼がおそくなりました。
Accessがそういうものだということで、
入力する人に周知しておくのがいいような気がしてきました。
ありがとうございました。

お礼日時:2007/09/18 16:45

完全な対策はVBAでないと不可能です。


全く、VBA を書かないとすれば、コマンドボタンを増やすという手があります。
もちろん、{ESC}を2度押すようにしてもいいです。

Private Sub コマンド_フォームを閉じる_Click()
On Error Resume Next
  DoCmd.Close
End Sub

Private Sub コマンド_レコードを復元_Click()
On Error Resume Next
  DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
End Sub

Private Sub コマンド_レコードを保存_Click()
On Error Resume Next
  DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
End Sub

これらのコマンドボタンをウィザードで生成すればいいです。
ただ、上の例では冗長なコードを消しているだけです。

これを応用して、

Private Sub コマンド_最後に編集したレコードを保存しないでフォームを閉じる_Click()
On Error Resume Next
  DoCmd.DoMenuItem acFormBar, acEditMenu, acUndo, , acMenuVer70
  DoCmd.Close
End Sub

しかし、これもレコード移動されていたんじゃどうしようもないです。

<tbl1>
ID___fld1___fld2
1____aaa1___bbbb
2____aaa2___null

しかし、こういうnull値を持つレコードの発生を完全に阻止するには、チェックして削除するしかないです。

Private Sub Form_Close()
On Error Resume Next
  DoCmd.RunSQL "DELETE FROM tab1 WHERE LEN(fld2 & '')=0"
End Sub

VBと言っても、SQLの DELETE文を書くだけです
    • good
    • 0
この回答へのお礼

お礼がおそくなりました。
やはり簡単にはいきそうにないですね。
ありがとうございました。

お礼日時:2007/09/18 16:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング