質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

1293閲覧

入力必須項目が未入力でフォームから移動した際、レコードがテーブルに保存されないようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2023/04/17 01:38

実現したいこと

売上情報を入力するフォームにメニューに戻るボタンがあり、入力必須項目が未入力の状態でメニューに戻るボタンを押したら入力内容を破棄してもよいかの確認メッセージを表示し、OKを押すとレコードをデータ保存用のテーブルに書き込まずにメニューに戻るようにしたいです。
要は、必須項目が全て入力されている場合のみレコードが保存されるようにしたいのです。

前提

売上情報を入力するフォームを作成しています。
日付・店舗番号・利用者番号を入力するメインフォームと、製品番号・数量を入力するサブフォームがあります。

発生している問題・エラーメッセージ

例えば日付が抜けたままサブフォームに移動した時や、入力を中断してフォームを閉じた時に入力途中の内容がテーブルに書き込まれてしまいます。

試したこと

①本テーブルと同じフィールドを持ったデータ仮置きテーブル・仮置きテーブルを本テーブルに書き込む追加クエリ・仮置きテーブルのレコードを削除するクエリを作成
②仮置きテーブルを入力フォームのレコードソースにして、入力確定時は追加クエリと削除クエリを、入力内容を破棄する時は削除クエリを実行する

この方法で実現も出来ると思うのですが、1つのフォームに対して本テーブル・仮置きテーブル・追加・削除クエリとオブジェクトが多くなって複雑になってしまう気がします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

日付・店舗番号・利用者番号を入力するメインフォームと、製品番号・数量を入力するサブフォームがあります。

売上情報を入力するフォームにメニューに戻るボタンがあり、入力必須項目が未入力の状態でメニューに戻るボタンを押したら入力内容を破棄してもよいかの確認メッセージを表示し、OKを押すとレコードをデータ保存用のテーブルに書き込まずにメニューに戻るようにしたい

メインフォーム側で上記の処理を行ないたいのであれば、例えばメインフォームのフォームモジュールに次のようなコードを記述なさればよろしいのではないかと。

vba

1Option Compare Database 2Option Explicit 3 4'フォームの[レコード移動時]イベント 5Private Sub Form_Current() 6 7 '[売上日付]にフォーカスを移す 8 Me![売上日付].SetFocus 9 10 'カレントレコードが新規レコードである場合 11 If Me.NewRecord = True Then 12 'サブフォームコントロールの[編集ロック]プロパティを「はい」に 13 Me![売上明細サブフォーム].Locked = True 14 Else 15 'サブフォームコントロールの[編集ロック]プロパティを「いいえ」に 16 Me![売上明細サブフォーム].Locked = False 17 End If 18 19End Sub 20 21'フォームの[更新前処理]イベント 22Private Sub Form_BeforeUpdate(Cancel As Integer) 23 24 With Me 25 26 '[売上日付]の値が日時データとして扱えない値である場合 27 If IsDate(![売上日付].Value) = False Then 28 'このイベントをキャンセルする 29 Cancel = True 30 '警告メッセージの表示 31 MsgBox "売上日付を入力して下さい!", vbExclamation, "入力エラー" 32 '[売上日付]にフォーカスを移す 33 ![売上日付].SetFocus 34 'プロシージャを抜ける 35 Exit Sub 36 End If 37 38 '[店舗番号]の値が Null または空文字列である場合 39 If Nz(![店舗番号].Value, "") = "" Then 40 'このイベントをキャンセルする 41 Cancel = True 42 '警告メッセージの表示 43 MsgBox "店舗番号を入力して下さい!", vbExclamation, "入力エラー" 44 '[店舗番号]にフォーカスを移す 45 ![店舗番号].SetFocus 46 'プロシージャを抜ける 47 Exit Sub 48 End If 49 50 '[利用者番号]の値が Null または空文字列である場合 51 If Nz(![利用者番号].Value, "") = "" Then 52 'このイベントをキャンセルする 53 Cancel = True 54 '警告メッセージの表示 55 MsgBox "利用者番号を入力して下さい!", vbExclamation, "入力エラー" 56 '[利用者番号]にフォーカスを移す 57 ![利用者番号].SetFocus 58 'プロシージャを抜ける 59 Exit Sub 60 End If 61 62 End With 63 64End Sub 65 66'フォームの[更新後処理]イベント 67Private Sub Form_AfterUpdate() 68 69 'サブフォームコントロールの[編集ロック]プロパティを「いいえ」に 70 Me![売上明細サブフォーム].Locked = False 71 72End Sub 73 74'コマンドボタン[メニューに戻るコマンド]の[クリック時]イベント 75Private Sub メニューに戻るコマンド_Click() 76 77 'カレントレコードが編集中ではない場合 78 If Me.Dirty = False Then 79 'このフォームを閉じる 80 DoCmd.Close acForm, Me.Name, acSaveNo 81 'プロシージャを抜ける 82 Exit Sub 83 End If 84 85 Dim lngAnswer As Long 86 87 '確認ダイアログを表示し、[OK]ボタンと[キャンセル]ボタンのどちらがクリックされたかを取得 88 lngAnswer = MsgBox("カレントレコードの編集内容を破棄してフォームを閉じますか?", _ 89 vbQuestion + vbOKCancel + vbDefaultButton2, _ 90 "カレントレコードの編集中です") 91 92 '[キャンセル]ボタンがクリックされた場合 93 If lngAnswer = vbCancel Then 94 Exit Sub 95 End If 96 97 'カレントレコードに対する変更を取り消す 98 Me.Undo 99 'このフォームを閉じる 100 DoCmd.Close acForm, Me.Name, acSaveNo 101 102End Sub

各コントロールの名前は適当に書き換えて下さい。

投稿2023/04/17 05:29

編集2023/04/17 05:32
sk.exe

総合スコア744

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

 連結フォームのヘッダーに複数の非連結テキストボックスとOKボタンを追加して、諸々入力後、OKボタンを押して、追加クエリを呼び出すのはどうでしょう?詳細エリアの連結テキストボックスを直接編集しない、それは見る専用とするのです。

投稿2023/04/17 04:26

編集2023/04/17 04:40
logres_Fan

総合スコア164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問