- ベストアンサー
Access VBA 抽出したレコードをフィールドを増やして別テーブルに追加する方法
2つのクエリーで抽出したレコードを結合し、そのレコードにID番号をつけて別のテーブルに追加することはできないでしょうか? 1枚のガラスの値段表を作りたいと考えています。 使用するテーブルは、1つ目がサイズ表でサイズ番号と2つの辺の長さの3つのフィールドからできています。2つ目はガラスの種類表で種類番号と種類名の2つのフィールドでできています。3つ目は値段表で上の2つの表の5つのフィールドにID番号と値段の2つのフィールドがあり全部で7つのフィールドです。 いま、フォームにサイズ表と種類表のサブフォームをつくり、それぞれ結合したいレコードを表示させています。そこからフォームに値段を入力し登録ボタンをクリックすると値段表に新しいレコードを追加するような登録ボタンを作りたいです。 簡単な例でも構いません。 VBAがわかる方、教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ウーン!チクッと無駄で複雑な仕組みを作り上げようとしています。 例えば、 <Table1> ID Data1 1 A 2 B <table2> ID Table1_ID Table3_ID Data1 1 1 1 XX 2 1 1 YY <Table3> ID Price 1 \1,000 2 \2,000 という設計であれば、ノープログラミングで目的を達成できます。 <クエリ1> ID Table1.Data1 Table2.Data1 Price 1 A XX \1,000 2 A YY \1,000 SELECT Table2.ID, Table1.Data1, Table2.Data1, Table3.Price FROM Table1 RIGHT JOIN (Table2 LEFT JOIN Table3 ON Table2.Table3_ID = Table3.ID) ON Table1.ID = Table2.Table1_ID; 正に、この<クエリ1>が「1枚のガラスの値段表」です。 **************************************************************** なお、質問に即答すれば、 Private Sub コマンド0_Click() Dim strInsertSQL As String strInsertSQL = "INSERT INTO Table3 (ID,Price) Values (3,3000)" CnnExecute(strInsertSQL) End Sub と、SQLのINSERT文を作成し実行すれば可能です。 CnnExecute()については、要求があれば示します。
その他の回答 (1)
> 3つ目は値段表で上の2つの表の5つのフィールドにID番号と値段の2つのフィールドがあり全部で7つのフィールドです。 この値段表テーブルの作り方がマズイです。 Accessに限らずリレーショナルデータベースでは、他のテーブルにあるデータを重複して持つことを極力避けます。 ご質問の例の値段表テーブルは、 1.商品ID(型番など、商品を一意に特定できる番号) 2.価格 3.サイズID(サイズ表テーブルのサイズ番号) 4.種類ID(種類表テーブルの種類番号) この4フィールドにすべきです。 値段表テーブルに他のテーブルのデータを書き込むテーブル構成にしてしまうと、種類やサイズに変更があったとき、種類テーブルやサイズテーブルだけでなく、値段表テーブル上にあるデータも訂正しなければならなくなります。 他のテーブルのデータを参照したいときは、これら別テーブルのIDでリンクさせたクエリーを使うのがセオリーです。 従って、ご質問のフォームでは、ザブフォームからは2つのサブフォームからそれぞれのIDだけを取り出し、値段表テーブルに追加すれば良いのです。 ただ、サブフォーム方式を採用することが良いかどうかは別の話です。 サイズテーブルや種類テーブルのレコード数が多い場合、絞り込みを行える様にするなど、エンドユーザーの負担を軽減させる工夫も必要です
お礼
ありがとうございました。 4つの主キーにしぼる話はNo1さんの回答を理解する助けにもなりました。番号の組合せと値段だけでは何のガラスかわからなくなってしまわないか不安はありましたが、必要に応じてリレーションシップからクエリなどで参照すればいいですよね。 値段表はフィールドを2つにするか4つするかまだ決めてませんが、フォームは新規のガラスを登録するときに既存のサイズと種類があるか確認しやすいものをつくりたいと考えています。
お礼
大変ありがとうございました。 回答を読んでコードの全体像がとてもシンプルになりました。 SQL文の結合は情報処理の勉強で、SELECT・・・From・・・Where A = B AND ・・・のようなものしかやりませんでしたが、これも勉強になりました。 CnnExecute()は某Webサイトで調べました。オートナンバーは自動的にふってくれるし、あとは何とかできそうです。