お世話になっております。
フォームに表示されている値をテーブルに追加したいのですが、テーブルの表示が一切ない追加クエリが出来ました。フォームのレコードソースや造りに問題があるでしょうか。
詳細
F_在庫品作成依頼というフォームを作りました。
レコードソースは00品番と00作成というテーブルを品番で繋げたものです。
機能
①txb_品名コードの更新後処理で、品名コードでフィルターし、その製品の詳細と作成依頼の履歴(サブフォームで、レコードソースはF_在庫品作成依頼と同一)を表示する
②txb_現在庫数に、現在の在庫数を入力する
③btn_作成手配ボタンを押して、F_在庫品作成依頼のテキストボックスに表示されている値・今日の日付を00作成という作成履歴を保存するレコードに追加する
以上が主な機能と使い方です。
00作成には、受注日フィールドに今日の日付を、品番フィールドにtxb_品名コードの値を、現在庫数にtxb_現在庫数の値を、受注品フィールド(YesNo型)にはNoを追加したいと思い、
INSERT INTO 00作成 ( 受注品, 品番, 手配日, 現在庫数 )
SELECT No AS 受注品, Q_在庫品作成依頼.品番コード, Date() AS 手配日, [Forms]![F_在庫品作成依頼]![txb_現在庫数] AS 現在庫数
FROM Q_在庫品作成依頼
WHERE (((Q_在庫品作成依頼.品番コード)=[Forms]![F_在庫品作成依頼]![txb_品名コード]));
以上のようなクエリを作成しました。ところがこれだとこれまでの作成履歴のレコード数分追加されることになってしまうため、
INSERT INTO 00作成 ( 受注品, 手配日, 現在庫数, 品番 )
SELECT No AS 受注品, Date() AS 手配日, [Forms]![F_在庫品作成依頼]![txb_現在庫数] AS 現在庫数, [Forms]![F_在庫品作成依頼]![txb_品名コード] AS 品番;
というクエリに作り替えました。
今までテーブルの表示のないクエリを作成した経験がないため、こういうのは一般的なのか、それともフォームやレコードソース用のクエリの構成が良くないために、このようなクエリでしか追加できなくなってしまっているのか分かりません。
皆様のご意見を頂ければと思います、よろしくお願い致します。
別スレを見ていて思ったのですが、テーブル構造(主キーなど)の提示、フォームのスクリーンショットの提示が必要ではないかしら?
「各フィールドに出力する値(リテラルや式の結果)をリストで指定して
任意のテーブルに 1 件のレコードを追加する操作」という自体は、
データベースシステムにおいてごくありふれた操作です。
多くの場合は INSERT INTO ... VALUES ... ステートメントを使用します。
Access の場合は SQL ビューでこのステートメントを用いた追加クエリを
作成することができますが、デザインビューに切り替えてクエリを上書き保存すると
INSERT INTO ... SELECT ... ステートメントに置き換わってしまいます。
ここで問題となるのは、[txb_品名コード]と[txb_現在庫数]が
連結テキストボックスであるか、それとも非連結テキストボックスであるか、
ということです。
[txb_品名コード]のコントロールソースがテーブル[00作成]のフィールド[品番]、
[txb_現在庫数]のコントロールソースがテーブル[00作成]のフィールド[現在庫数]
であるならば、それらのテキストボックスに対して値を入力する操作は
そのままコントロールソースであるフィールドに対しての入力となります。
その際のフォームのカレントレコードが新規レコードなのであれば、
カレントレコードが保存された段階でそのレコードはテーブル[00作成]に
追加されます。
カレントレコードが既存のレコードなのであれば、参照中のレコードが
更新(上書き)されます。
「連結フォームのカレントレコードに対する入力操作」によって
テーブル[00作成]のレコードの追加/更新が成されているのであれば、
それとは別に(独自に)「追加クエリを用いたレコードの追加」という操作を
実行する必要はありません。
後者の操作を行う必要があるとすれば、それは[F_在庫品作成依頼]が
非連結フォーム(どのテーブルとも連結していない)である場合か、
「連結フォームのカレントレコードに対する入力操作」とは別に
何か特殊なレコードの追加処理を実行しなければならないような場合
ぐらいでしょう。
ごくありふれた操作なのですね。初めてだったので安心しました。
txb_品名コード、txb_現在庫数ともに非連結のテキストボックスです。
ならば[F_在庫品作成依頼]が連結フォームである必要はないのではないでしょうか。
いわゆる CRUD 機能を Access の非連結フォームに実装する場合、
「新規レコードの追加」を行う手法については、大別して次の 3 種類の方法が挙げられます。
保存済みの追加クエリを実行するマクロまたはプロシージャを呼び出す。
任意の SQL 文(この場合は INSERT INTO ... ステートメント)を実行するマクロまたはプロシージャを呼び出す。
DAO または ADO の Recordset オブジェクトによって任意のテーブルを参照し、AddNew メソッドを呼び出して新規レコードを作成し、そのレコードの各フィールドの値を編集し、Update メソッドを呼び出してそのレコードをテーブルに保存する――という一連の操作を実行するプロシージャを呼び出す。
挙げられた方法は上記 1 に該当します。