- 締切済み
Accessでフォームからレコードの追加について
Access2016をWindows10で利用しています。 あるテーブルの単票形式のフォームをフォームウィザードから作成しました。 入力規則などがテーブルの各列の設定に沿って作成されていてとても便利なのですが、フォームにいくつか値を入れた時点でレコードが新規追加されてしまいます。 レコードの追加を、すべての入力が終わって「新規追加」ボタン(あとから自分で作成)を押してから行いたいです。 レコードウィザードを使わずにフォームを作成し、フォームの値とクエリを結び付けてボタン押下時にクエリを実行する、というフォームにすれば実現できると思うのですが、それはなかなか手間がかかってしまうので出来るだけ簡便に実現できたらと考えています。 細かい話なので参考ページ、あるいはヒントになる検索キーワードを教えていただけないでしょうか m(‗ ‗)m ?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- chayamati
- ベストアンサー率41% (260/624)
こんにちは フォームのデザインビューのプロパティ―シートの追加の許可を制御します キーワードは「AllowAdditions」です 初期値は 追加の許可をいいえにします。 フォーム上にラベルボックス【追加の許可】を配置しこのラベルのクリックイベントで追加許可はいを定義し、 何かのテキストボックス(金額)のイベントで追加許可いいえとします ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーOption Explicit Private Sub 追加の許可_Click() Me.AllowAdditions = True End Sub Private Sub 金額_LostFocus() Me.AllowAdditions = False End Sub
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【おまけ】非連結フォームでもAccess流の完全再現がテーマ! 1、入力が終わったら[登録ボタン]はあり得ない。 2、レコード移動が発生したらレコードを更新する。 3、入力途中でも前レコードに移動したら更新する。 4、また、戻ったら途中までのデータを表示する。 これをやらないとユーザーから「なによ、これ!」は必定。で、中途終了等による不具合レコードは、フォームを閉じた時に自動削除する関数をコールする。で、質問者が、必死こいて非連結フォームに挑んでも、結局はAccess流に回帰するので無駄の無駄。質問者は、1~4の仕様に疑問を抱いているようですが、あれって非常に洗練されたそれですよ。そして、ユーザーはそれを受け入れています。ですから、Accessの仕様を十分に把握し使いこなすことが王道ですよ。と、回答1に戻ります。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【追加補足】フォームへの表示と書き込みは解決しても・・・ 《補足》で紹介した関数を利用すれば、フォームへの表示と書き込み問題は解決します。でも、まだまだ解決しなければならない問題があります。その代表が、レコード移動ボタンの自作です。《次に》《最後に》で、フォームオープン後に入力したデータを入力順に表示し更新する仕組みを追加する必要があります。また、レコード削除ボタンも用意しなければなりません。まあ、このレベルは、ちょい頑張ればクリアできるでしょう。が、その先に、どでかい崖が待っています。それは、サブフォームを持つ非連結フォームです。この辺りまで攻めるとなると、まあ、Visual Basic か C# で開発すべきかと思いますよ。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足 2-2】 ================================== 513: UpdateRecord関数: フォームのデータをデータベースに書き込む ================================== StopNow = Not UpdateRecord(Me, "SELECT * FROM id管理表 WHERE id_name='Test'") UpdateRecord関数は、いわゆる非連結フォームに入力されたデータをデータベースに書き込む関数です。書き込む表の列とフォームに配置したコントロールとの対応関係は、DisplayRecord関数と同じようにコントロールの名前で判断します。 Public Function UpdateRecord(ByVal frm As Form, _ ByVal strSQL As String, _ Optional ByVal Echo As Boolean = False) _As Boolean On Error GoTo Err_UpdateRecord Dim isOK As Boolean Dim I As Integer Dim N As Integer Dim fldName AS String Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim fld As ADODB.Field isOK = True Set cnn = CurrentProject.Connection ' ================= ' Begin with: cnn ' ----------------- .Errors.Clear .BeginTrans ' ---------------- ' Recordset Open ' ---------------- Set rst = New ADODB.Recordset rst.Open strSQL, _ cnn, _ adOpenStatic, _ adLockOptimistic ' ================= ' Begin With: rst ' ----------------- With rst IF Not .BOF Then N = frm.Controls.Count - 1 For Each fld In .Fields For I = 0 To N fldName = frm.Controls(I).Name If Left$(fldName, 6) = "field_" Then If Mid$(fldName, 7) = fld.Name Then fld.Value = frm.Controls(I).Value Exit For End If End If Next I Next fld .Update End If End With ' --------------- ' End With: rst ' =============== .CommitTrans ' --------------- ' End With: cnn ' =============== If Echo Then MsgBox " 1件のレコードを更新または保存しました。", vbInformation, " お知らせ" End If Exit_UpdateRecord: On Error Resume Next rst.Close Set rst = Nothing UpdateRecord = isOK Exit Function Err_UpdateRecord: isOK = False If cnn.Errors.Count > 0 Then ErrMessage cnn.Errors(0), strSQL cnn.RollbackTrans Else MsgBox "プログラムエラーが発生しました。(UpdateRecord)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " 関数エラーメッセージ" End If Resume Exit_UpdateRecord End Function Private Sub cmdUpdateRecord_Click() Dim StopNow As Boolean StopNow = Not UpdateRecord(Me, "SELECT * FROM id管理表 WHERE id_name='Test'") If Not StopNow Then Message "[id管理表] を更新しました。" End If End Sub
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足 2-1】 「止めといたがいい」という否定だけではと思って、ちょいと補足しておきます。紹介するのは、フォームオープン時にデータを表示する関数と入力データを書き込む関数。非連結フォームを志向すると、この手の関数が必須になります。 ============================== 512: DisplayRecord関数: データベース情報をフォームに表示 ============================== DisplayRecord(Me, "SELECT * FROM id管理表 WHERE id_name='Test'") DisplayRecord関数は、いわゆる非連結フォームにデータベース情報を表示する関数です。読み込んだ列情報とフォームに配置したテキストコントロール等との対応関係は、コントロールの名前で判断します。コントロール名は、<'field_' + 列名>で命名しなければなりません。このような約束事が守られる限り、DisplayRecord関数はフォームにデータを正しく表示します。 ' ------------------------------------------------------------------------------- ' フォームに読み込んだ列情報を表示します。 ' ' 【要件】 ファームのフィールド名が、<"??????" + 列名>であること。 ' ------------------------------------------------------------------------------- Public Function DisplayRecord(ByVal frm As Form, _ ByVal strQuerySQL As String) As Boolean On Error GoTo Err_DisplayRecord Dim isOK As Boolean Dim I As Integer Dim N As Integer Dim rst As ADODB.Recordset Dim fld As ADODB.Field isOK = True Set rst = New ADODB.Recordset rst.Open strQuerySQL, _ CurrentProject.Connection, _ adOpenStatic, _ adLockReadOnly If Not rst.BOF Then ' ================= ' Begin With: frm ' ----------------- With frm N = .Controls.Count - 1 For Each fld In rst.Fields For I = 0 To N If Mid$(.Controls(I).Name, 7) = fld.Name Then .Controls(I).Value = fld.Value Exit For End If Next I Next fld End With ' --------------- ' End With: frm ' =============== Else MsgBox " フォームに表示する情報はありません。(DisplayRecord)", _ vbInformation, _ " お知らせ" End If Exit_DisplayRecord: On Error Resume Next rst.Close Set rst = Nothing DisplayRecord = isOK Exit Function Err_DisplayRecord: isOK = False MsgBox "実行時エラーが発生しました。(DisplayRecord)" & Chr$(13) & Chr$(13) & _ "・Err.Description=" & Err.Description & Chr$(13) & _ "・SQL Text=" & strQuerySQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_DisplayRecord End Function フォーム<id管理表>のテストのためのコードは次のようです。 Private Sub Form_Load() Dim StopNow As Boolean StopNow = Not DisplayRecord(Me, "SELECT * FROM id管理表 WHERE id_name='Test'") If Not StopNow Then Message "フォームが正常に表示されました。" End If End Sub
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Q、すべての入力が終わってから「新規追加」ボタン・・・ A、そういう発想を否定すべき。 先ずは、Access の機能を使いこなすのが王道。なお、質問者の言う《非連結フォーム》だが、結局は、(それが機能するには)Accessが提供する全ての機能をクラスライブラリ等で再現することになる。が、それをやると《関数オーバーヘッド・エラー》が発生する。C#等でフロントエンドを開発するのならいざしらずAccessユーザーが挑むテーマではない。 と、思いますよ。
お礼
非連結フォームなどを言葉を知らなかったので、とりあえずそこを調べてみます。 あとテーブルの更新履歴も残したかったので↓のページを参考にすることにしました。 https://hamachan.info/win7/Access/rireki1.html