• 締切済み

ACCESS:フォームの全項目入力後に書込

フォームでフィールド毎のデータ書込/更新ではなく、全フィールド入力完了後に「登録」ボタン押下で一括書込させたいのですが、どんな機能を使ってよいのか、キーワードでもかまいませんので教えてください。やりたいことなのですが例えば、顧客管理とかのイメージですが1画面で基本情報と、家族構成と、購入品目とかを目一杯表示させておいてこれを入力/修正画面とします。入力時にはフィールド毎に都度書込みはせず、全フィールド入力完了後に「登録ボタン」押下で一括書込みさせたいんです。修正の場合も同じです。 環境は、少々古いのですがWin98でAccess97です。 よろしくお願いします。

みんなの回答

  • gadd3
  • ベストアンサー率46% (211/451)
回答No.2

当方Access2000+Win98無印です。 Access2000での事しかわからないのですが、また、maruru01さんの補足になってしまいますが…、例えばAccess2000の場合では、maruru01さんのコメントされた、 >ところで、テーブルに連結したフォームなら、フィールド毎にはテーブルには >書き込まれないと思うのですが。 のとおりです。 フォームからの入力データの完全保存・反映は、フォームを閉じたとき、または、次の(前の)レコードへカーソルが移動した時しかされませんので、その時点まではフォームのテキストボックスにはデータは表示されていますが、まだ完全に書き込み・更新(反映)はされていません。すべての入力データについてです。 (単票フォームなら次(前)ページへ、帳票フォームなら次(前)の行へカーソルが移動するまで、データは書き換え・反映されません。) その証拠に、テーブルを開きながら、連結フォーム(単票形式)にすべてのデータを入力すると、フォームから入力したと思っていたデータがテーブルにはまったく入力されません。次ページ、または前ページへカーソルが移動するといっせいにレコードが表示(または書き換え)されます。 フォームに全データ入力したあと、次ページまたは前ページへ移動する前にテーブルを開いても同じです。 また、フォームで入力したばかりのデータはレコード移動しないと、例えばレポート印刷するときにそのデータの分はすべて空になって印刷されます。 もし、レコード移動する前(またはフォームを閉じる前)にフォームの入力内容をテーブルに反映したかったら、フォームをアクティブにしてから「レコード」メニューの「更新」を押さなければなりません。要はこの「更新」が、pyo123さんのおっしゃる「登録ボタン」に相当するのではないかと思います。 VBAでは Me!Refresh などのコードが「更新」に相当します。 ただ、レコード移動した時や「更新」をクリックした時はいいのですが、前述のようにフォームを閉じた時にもフォーム上の入力データは必ず保存されてしまいます。ですので、フォームを閉じたときにすべての入力が破棄されるようにしたい場合は、DAO(DataAccessObjectだったかな…)を使うと良いかもしれません。 ただ、かなり面倒くさいです。 例えばフォーム上のテキストボックスのすべて(または主キーと連結したテキストボックス以外のすべて)を「非連結」にして、いちいちデータを表示、更新、追加等しなければなりません。 詳細は、DAO(ADOは97で使えましたっけ…?)のことについて書いてあるWebページや参考書をあたってください。 データ表示にはDAOでレコードセット(テーブルやクエリ)を開いてテキストボックスへ表示する方法などがあります。(表示に関してだけはDAOだけではなく、DLookup関数も使えるみたいですが、動作スピードについてはわかりません。) 書き換えに関しては Editメソッド、Updateメソッド、 新規レコードの追加には AddNewメソッド、Updateメソッド、 レコードセット内でのカレントレコード移動には、MoveNextや、MovePrevious、などを使います。 ご参考になるかどうかわかりませんが、例えばフォーム上に表示された主キーのレコードのみを開いて、それをフォーム上に表示するには以降のようなコードを書きます。(フォームのレコード移動時イベントなどに) 状況は、連結フォームで、主キーのテキストボックスのみがテーブルの主キーフィールドと連結し、あとはすべて非連結の場合です。その他は以下です。 ・フォーム上のテキストボックス名はtxt01とtxt02の2つしか無い。 ・ソースとなる連結テーブル名が「テーブル01」 ・主キーフィールド名が「主キー01」 ・「主キー01」と連結する、フォーム上のテキストボックス名が「主キーtxtbox」 ********************* Dim db As DAO.Database Dim rs As Recordset Dim sqlstr As String ' レコードの抽出条件を格納する変数 Set db = CurrentDb sqlstr = "SELECT * FROM テーブル01 WHERE 主キー01 = " & Me!主キーtxtbox Set rs = db.OpenRecordset(sqlstr) ' 抽出条件にあてはまるレコードセットを開く Me!txt01 = rs!フィールド名01 ' フィールド名01 はtxt01に表示したいフィールド名 Me!txt02 = rs!フィールド名02 ' フィールド名02 はtxt02に表示したいフィールド名 Set rs = Nothing Set db = Nothing 以上ご参考になれば…。(乱文でわかりにくかったり、見当違いでしたらごめんなさい。)

すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 例えば、フォームモジュールの宣言部に、 Private flgSave As Boolean などとフラグを宣言しておいて、 登録ボタンのクリックイベント内でのみ、 flgSave = True となるようにしておき、(それ以外の場合は常にFalseのまま) フォームの更新前処理イベントで、 If flgSave = Flase Then   MsgBox "登録ボタンで保存して下さい。"   Exit Sub End If のように判定してはどうですか。 ちなみに、登録ボタンのクリックイベントでの更新処理後には、再びFalseをセットしておきます。 ところで、テーブルに連結したフォームなら、フィールド毎にはテーブルには書き込まれないと思うのですが。

すると、全ての回答が全文表示されます。

関連するQ&A