こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

Access2016をWindows10で利用しています。
あるテーブルの単票形式のフォームをフォームウィザードから作成しました。
入力規則などがテーブルの各列の設定に沿って作成されていてとても便利なのですが、フォームにいくつか値を入れた時点でレコードが新規追加されてしまいます。
レコードの追加を、すべての入力が終わって「新規追加」ボタン(あとから自分で作成)を押してから行いたいです。

レコードウィザードを使わずにフォームを作成し、フォームの値とクエリを結び付けてボタン押下時にクエリを実行する、というフォームにすれば実現できると思うのですが、それはなかなか手間がかかってしまうので出来るだけ簡便に実現できたらと考えています。

細かい話なので参考ページ、あるいはヒントになる検索キーワードを教えていただけないでしょうか m(‗ ‗)m ?

投稿日時 - 2018-06-09 08:26:55

QNo.9506546

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

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

投稿日時 - 2018-06-13 17:06:04

ANo.5

【おまけ】非連結フォームでもAccess流の完全再現がテーマ!

1、入力が終わったら[登録ボタン]はあり得ない。
2、レコード移動が発生したらレコードを更新する。
3、入力途中でも前レコードに移動したら更新する。
4、また、戻ったら途中までのデータを表示する。

これをやらないとユーザーから「なによ、これ!」は必定。で、中途終了等による不具合レコードは、フォームを閉じた時に自動削除する関数をコールする。で、質問者が、必死こいて非連結フォームに挑んでも、結局はAccess流に回帰するので無駄の無駄。質問者は、1~4の仕様に疑問を抱いているようですが、あれって非常に洗練されたそれですよ。そして、ユーザーはそれを受け入れています。ですから、Accessの仕様を十分に把握し使いこなすことが王道ですよ。と、回答1に戻ります。

投稿日時 - 2018-06-09 22:41:42

お礼

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

投稿日時 - 2018-06-10 12:05:47

ANo.4

【追加補足】フォームへの表示と書き込みは解決しても・・・

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

投稿日時 - 2018-06-09 22:16:30

ANo.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

投稿日時 - 2018-06-09 21:59:10

ANo.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

投稿日時 - 2018-06-09 21:54:42

ANo.1

Q、すべての入力が終わってから「新規追加」ボタン・・・
A、そういう発想を否定すべき。

 先ずは、Access の機能を使いこなすのが王道。なお、質問者の言う《非連結フォーム》だが、結局は、(それが機能するには)Accessが提供する全ての機能をクラスライブラリ等で再現することになる。が、それをやると《関数オーバーヘッド・エラー》が発生する。C#等でフロントエンドを開発するのならいざしらずAccessユーザーが挑むテーマではない。

と、思いますよ。

投稿日時 - 2018-06-09 11:56:02

あなたにオススメの質問