• 締切済み

Accessでフォームからレコードの追加について

Access2016をWindows10で利用しています。 あるテーブルの単票形式のフォームをフォームウィザードから作成しました。 入力規則などがテーブルの各列の設定に沿って作成されていてとても便利なのですが、フォームにいくつか値を入れた時点でレコードが新規追加されてしまいます。 レコードの追加を、すべての入力が終わって「新規追加」ボタン(あとから自分で作成)を押してから行いたいです。 レコードウィザードを使わずにフォームを作成し、フォームの値とクエリを結び付けてボタン押下時にクエリを実行する、というフォームにすれば実現できると思うのですが、それはなかなか手間がかかってしまうので出来るだけ簡便に実現できたらと考えています。 細かい話なので参考ページ、あるいはヒントになる検索キーワードを教えていただけないでしょうか m(‗ ‗)m ?

みんなの回答

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.6

こんにちは フォームのデザインビューのプロパティ―シートの追加の許可を制御します キーワードは「AllowAdditions」です 初期値は 追加の許可をいいえにします。 フォーム上にラベルボックス【追加の許可】を配置しこのラベルのクリックイベントで追加許可はいを定義し、 何かのテキストボックス(金額)のイベントで追加許可いいえとします ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーOption Explicit Private Sub 追加の許可_Click() Me.AllowAdditions = True End Sub Private Sub 金額_LostFocus() Me.AllowAdditions = False End Sub

回答No.5

【おまけ】非連結フォームでもAccess流の完全再現がテーマ! 1、入力が終わったら[登録ボタン]はあり得ない。 2、レコード移動が発生したらレコードを更新する。 3、入力途中でも前レコードに移動したら更新する。 4、また、戻ったら途中までのデータを表示する。 これをやらないとユーザーから「なによ、これ!」は必定。で、中途終了等による不具合レコードは、フォームを閉じた時に自動削除する関数をコールする。で、質問者が、必死こいて非連結フォームに挑んでも、結局はAccess流に回帰するので無駄の無駄。質問者は、1~4の仕様に疑問を抱いているようですが、あれって非常に洗練されたそれですよ。そして、ユーザーはそれを受け入れています。ですから、Accessの仕様を十分に把握し使いこなすことが王道ですよ。と、回答1に戻ります。

yaminabekawori
質問者

お礼

非連結フォームなどを言葉を知らなかったので、とりあえずそこを調べてみます。 あとテーブルの更新履歴も残したかったので↓のページを参考にすることにしました。 https://hamachan.info/win7/Access/rireki1.html

回答No.4

【追加補足】フォームへの表示と書き込みは解決しても・・・ 《補足》で紹介した関数を利用すれば、フォームへの表示と書き込み問題は解決します。でも、まだまだ解決しなければならない問題があります。その代表が、レコード移動ボタンの自作です。《次に》《最後に》で、フォームオープン後に入力したデータを入力順に表示し更新する仕組みを追加する必要があります。また、レコード削除ボタンも用意しなければなりません。まあ、このレベルは、ちょい頑張ればクリアできるでしょう。が、その先に、どでかい崖が待っています。それは、サブフォームを持つ非連結フォームです。この辺りまで攻めるとなると、まあ、Visual Basic か C# で開発すべきかと思いますよ。

回答No.3

【補足 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

回答No.2

【補足 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

回答No.1

Q、すべての入力が終わってから「新規追加」ボタン・・・ A、そういう発想を否定すべき。  先ずは、Access の機能を使いこなすのが王道。なお、質問者の言う《非連結フォーム》だが、結局は、(それが機能するには)Accessが提供する全ての機能をクラスライブラリ等で再現することになる。が、それをやると《関数オーバーヘッド・エラー》が発生する。C#等でフロントエンドを開発するのならいざしらずAccessユーザーが挑むテーマではない。 と、思いますよ。

関連するQ&A