- ベストアンサー
お知恵をお貸しください。
お知恵をお貸しください。 access2010を使用しています。(2000バージョンでも可) 基本製品マスタテーブルがあり、中の1つの製品レコードを複製し、別のテーブルに追加させたいのですが、方法がわかりません。 フォーム上でコマンドボタンを使って、基本ウィザードでレコードの複製は簡単にできたのですが、別のテーブル上に作る方法を教えて頂けますでしょうか。 access初級者ですので、できれば簡単なVBAなどあれば助かります。 SQLは全くわかりません。 宜しくお願い致します。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
#2の中ほどにも説明で、 なお、最初のクエリは製品IDは追加されません。もし、 追加先の「他の製品テーブル」の製品IDがオートナンバー だとIDが重複してエラーが起こる可能性があるので このようにしています。 としているように、保存先のテーブルに製品IDがあった場合、 オートナンバーあるいは主キーが設定してあって、レコードを 追加したときに同じ製品IDが存在すると捕捉で述べられておられる ようなエラーがでます。 もし、「基本製品マスタテーブル」の製品IDが保存先のテーブルで 確認用として必要ならば、保存先のテーブルに適当な名前でたとえば 「製品ID確認」のような名前でフィールドを作り、そこに 「基本製品マスタテーブル」の製品IDを追加するようにすればいいのでは と思います。その場合フィールドの型は数値型あるいは文字型になると 思いますが。したがって、 INSERT INTO 他の製品テーブル ( 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[Forms]![fo仕様書一覧]![製品ID])); だと「基本製品マスタテーブル」の製品IDは追加されませんが、 INSERT INTO 他の製品テーブル ( 製品ID確認, 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[Forms]![fo仕様書一覧]![製品ID])); のようにすれば製品IDが追加されます。ただし、この場合は保存先の テーブルに主キーとしている製品IDには基本製品マスタテーブル」の製品ID はデータが追加されません。 では、どうするかといえば、追加先のテーブルの製品IDの主キーの設定を 無くす、あるいは保存先の製品IDの型がオートナンバーならば、、数値型 にするとすればどうでしょう。 もし、追加先のテーブルの製品IDが数値型で、主キーが必要 でないならば主キーをはずせばいのですが、設計上必要ならば、 VBAで、もし重複する製品IDがあったならば追加を中止するということも できますが、どうしましょうか。 少し回答が入り組んできましたが、以上です。 上記のテーブルのフィールドの追加、あるいはクエリで対応できるのか 結果を教えてください。 なお、他の方の捕捉でのべられているような
その他の回答 (10)
#6、#8です。多少時間が取れたので、簡単なサンプルを 1.「基本製品マスタテーブル」を一覧するフォーム「特別製品仕様書マスタ追加フォーム」を作成します。 2.テキストボックスとして少なくとも一つ「id」を貼り付けます 3.追加クエリ「特別製品仕様書マスタ追加クエリ」を作成し、SQL文は INSERT INTO 特別製品仕様書マスタ SELECT 基本製品マスタテーブル.* FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.id)=[Forms]![特別製品仕様書マスタ追加フォーム]![id])); とします 4.フッタを表示しボタンを一つ貼り付けます 5.ウィザードなどをし良し、ボタンのイベントを Dim stDocName As String stDocName = "特別製品仕様書マスタ追加クエリ" DoCmd.OpenQuery stDocName, acNormal, acEdit とします これでこのフォームを実行し、適当なレコードを選択後にボタンを押せば、そのレコードが「特別製品仕様書マスタ」に追加されるはずです。一応当方ではサンプルを実行し、この追加を確認しています。
お礼
fuuten_no_neko さん、お忙しい中、色々と細かく教えて頂き大変感謝しております。 具体的な物まで作って頂き、大変勉強になりました。 自分も早く皆様の様に、使いこなせる様頑張りたいと思います。 ありがとうございました。
- piroin654
- ベストアンサー率75% (692/917)
途中で文章が切れてしまいました。 なお、他の方の捕捉でのべられているような よって、基本製品仕様書マスタテーブルに基本情報を入力し、 特別製品仕様書マスタに複製しそれを、任意の仕様に書き換える と言う事です。 だとすれば、「基本製品マスタテーブル」の製品IDは 追加先のテーブルでは確認用でもいいのではと思います。
#6です。複製が必要な意味が判りました。追加クエリで良いでしょうが、特定に1レコードだけを複製しなければならないようです。SQL文は INSERT INTO 特別製品仕様書マスタ SELECT 基本製品マスタテーブル.* FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.id)=xx)); みたいなものでしょうか。xx のところで特定レコードを指定します。具体的なイメージとしては、フォームで「基本製品マスタテーブル」を一覧し、特定レコードを選択し、ボタンを押したらそのレコードの複製が「特別製品仕様書マスタ」に追加されると云ったものでしょうか。 サンプルを提示したいですが、ちょっと時間が取れません。
補足
内容は合っています。 追加クエリを作成し、SQLビューの最後にWHERE (((基本製品マスタテーブル.id)=xx));を入力すれば宜しいのでしょうか? 基本製品マスタの主キーは製品No(オートナンバー型)なので、id → 製品No で宜しいのでしょうか。 また、xxは何が入るのでしょうか? 基本的な事ばかりで申し訳ございませんが、お願い致します。
- layy
- ベストアンサー率23% (292/1222)
クエリをまず学習してみると良いです。 種類がいくつかあり、テーブル作成クエリ、選択クエリ、追加クエリ、は良くつかいます。 これらの特徴を理解すれば、 基本製品マスタテーブルからどういう具合にデータを抽出したらいいのか、 追加させたいテーブルにどういう具合にデータを追加するのか、 見えてくると思います。 クエリの特徴を知らずしてこの問題を対処するのは 取りかかる順番が間違っているように思います。 VBAについてもそうです。 VBAを扱うには不具合が出たらどう対処するか、誤りをどう見つけるか、 こういうのもマスターしておかないといけません。 >基本ウィザードでレコードの複製は簡単にできた 基本製品マスタテーブルにそのまま残すレコード と 別のテーブルに追加したいレコード と いう意味で(1件を2件に)複製したのではないでしょうか?。 それなら考え方、手順を変えた方がよさそうです。 アクセスはテーブル間のレコードの操作は段階踏んで行うようになりますから、 元テーブルから移動対象レコードの抽出、 追加先テーブルへレコードの追加、 元テーブルから移動対象レコードの削除、(←移動かコピーに依存) となります。 SQL文、VBAよりは まずはクエリデザインでクエリ作成を学習、かと思います。
お礼
layyさん、ご協力ありがとうございます。 言われるとおり、基本的な勉強をしてから取りかかるのが一般的とは思うのですが、どうも取り掛かりが、accessのサイトから勉強しながら作り込んで勉強する方法を取ってしまい、色々と作って行く内に、当然壁にぶち当たってしまいます。色々と本を買ってきては出来るだけ理解しようとはしているのですが、途中で基本的なことか、限りなく中級から上級レベルなのかよく分からなくなってしまいます。 とは言っても、地道に頑張るしかないので、覚える順番を見直し、コツコツと覚えたいと思います。 ありがとうございました。
「複製を別のテーブル上に作る」のは既に回答が出ているように、追加クエリで良いと思います。しかしRDBでは「複製」を作ると弊害が出る場合も多々あります。例えば元レコードあるいは複製レコードに修正が施された場合に二つのデータ間に矛盾を生ずるような場合です。 よろしければ「複製」を作る必要性を補足願えないでしょうか?
補足
fuuten no nekoさんもご協力ありがとうございます。 複製の理由についてですが、基本となる製品仕様書データがあり、そのデータを基に顧客別、若干仕様の異なるデータ(一部の数値のみが異なる製品)、仕様は同じだが色の違う製品など、基本データを基に簡単に製品仕様書を作成したいのです。 よって、基本製品仕様書マスタテーブルに基本情報を入力し、特別製品仕様書マスタに複製しそれを、任意の仕様に書き換える と言う事です。 この考え方で矛盾や、弊害などあるようでしたら、ご指摘をお願い致します。
- piroin654
- ベストアンサー率75% (692/917)
たびたびすみません。#3が追加クエリに なっていませんでした。 INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[製品IDを入れる]));
補足
piroin654さん、大変失礼致しました。 別の方に、同じ内容をお聞きしてしまいました。 製品IDの所に何を入力すれば良いのか、再度考えてみると下記になりました。 WHERE (((ta基本仕様書マスタ.製品ID)=[Forms]![fo仕様書一覧]![製品ID])); これを実行してみると、 (型変換エラーの為、0個のフィールドをNULLに設定しました。また、1件のレコードキー違反でレコードの追加が出来ませんでした) 主キー(製品ID)が重複されているせいなのでしょうか? 追加クエリのSQL文を開き、製品IDを消してみたのですが、同じでした。 もう少し教えて頂けますでしょうか。
- piroin654
- ベストアンサー率75% (692/917)
すみません。よくみたら4番目のSQL文もくずれていました。 INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品名)=[製品名を入れる]));
補足
何度もご丁寧にありがとうございます。 データが、手元にないので明日教えて頂いたようにやってみます。 また、分からなければお願いします。
- piroin654
- ベストアンサー率75% (692/917)
#2です。4つのSQL文の二番目が張り付けたときに形が くずれたので、張り付けなおします。 SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[製品IDを入れる]));
- piroin654
- ベストアンサー率75% (692/917)
>基本製品マスタテーブルがあり、中の1つの製品レコードを複製し、 >別のテーブルに追加させたいのですが、方法がわかりません。 上記の文章は、 基本製品マスタテーブルがあり、その中の1つの製品のレコードを 別のテーブルに追加させたいのですが、方法がわかりません。 のように解釈してよろしいのですか。そうであるならば、 2.追加クエリとかになるのでしょうか? と補足で述べられているように追加クエリを作る方法 でもいいです。たとえば、 基本製品マスタテーブル: 製品ID 製品名 価格 他の製品テーブル: 製品ID 製品名 価格 のような二つのテーブルがあり、「基本製品マスタテーブル」のある製品の レコードを「他の製品テーブル」に追加する場合、以下のような クエリを作ります。 INSERT INTO 他の製品テーブル ( 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[IDを入れる])); あるいは、 INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテ ーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[IDを入れる])); この二つの場合はクエリを実行するとパラメータが表示 され、製品IDを入力するようになります。あるいは 最初から、たとえば製品IDが3の製品を追加するのならば、 [IDを入れる]を3とすれば製品IDが3のレコードが追加 されます。 なお、最初のクエリは製品IDは追加されません。もし、 追加先の「他の製品テーブル」の製品IDがオートナンバー だとIDが重複してエラーが起こる可能性があるので このようにしています。そうでないならば二番目の クエリは製品IDが一緒に追加されます。 このまま、クエリをクリックして実行してもいいのですが、 フォームのボタンクリックからだと、いづれかのクエリの 名前をQ追加のようにした場合、 Private Sub コマンド0_Click() Docmd.OpenQuery("Q追加") End Sub で、実行されます。また、製品IDではなく製品名ならば、 INSERT INTO 他の製品テーブル ( 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品名)=[製品名を入れる])); あるいは、 INSERT INTO 他の製品テーブル ( 製品ID, 価格, 製品名 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.価格, 基本製品マスタテー ブル.製品名 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品名)=[製品名を入れる])); のような感じです。 そのほかに、VBAでレコードセットを使ったやりかたも あります。ご所望ならばコードを提示します。
- layy
- ベストアンサー率23% (292/1222)
「基本ウィザードでレコードの複製は簡単にできた」 この結果を抽出し、 新たなテーブルへ作成することはできますか?。 クエリの「テーブル作成クエリ」はどうですか。
補足
ご協力ありがとうございます。 1.結果を抽出方法がよく分かりません。 2.追加クエリとかになるのでしょうか?基本的な使い方でしたら、調べて何とかなると思うのですが・・・初心者なもので、よく言われている事が理解できません。もう少し、具体的に教えて頂けますでしょうか。 すみませんが、宜しくお願いいたします。
お礼
piroin654さん。 大変お世話になりました。 基本的な考えから、応用まで教えて頂き大変勉強になり、助かりました。 結局、特別製品マスタテーブルに初期製品IDフィールドを作成し、元のデータが何であるのかをわかる様になってしまいました。 追加先のテーブルに主キーがあれば、必ず先に書いたエラーが発生してしまい、オートナンバー型から、数値型に変更しても同じでした。 よって、製品ID(オートナンバー型)、初期製品ID(数値型)で元のデータの製品IDをそのままコピー、製品名・・・となりました。 出来れば、書かれている様に 重複する製品IDがあったならば追加を中止する でも良かったのですが、メリットがあまりなかったので、上記の内容になりました。 あとは、フォーム上でコピーボタンを作成し、上記クエリを実行させて終了です。 勉強中の身ですが、業務がゆっくりさせてくれないので、またお世話になるかもしれませんが、宜しくお願い致します。