• ベストアンサー

お知恵をお貸しください。

お知恵をお貸しください。 access2010を使用しています。(2000バージョンでも可) 基本製品マスタテーブルがあり、中の1つの製品レコードを複製し、別のテーブルに追加させたいのですが、方法がわかりません。 フォーム上でコマンドボタンを使って、基本ウィザードでレコードの複製は簡単にできたのですが、別のテーブル上に作る方法を教えて頂けますでしょうか。 access初級者ですので、できれば簡単なVBAなどあれば助かります。 SQLは全くわかりません。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.9

#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があったならば追加を中止するということも できますが、どうしましょうか。 少し回答が入り組んできましたが、以上です。 上記のテーブルのフィールドの追加、あるいはクエリで対応できるのか 結果を教えてください。 なお、他の方の捕捉でのべられているような

t-seisan1
質問者

お礼

piroin654さん。 大変お世話になりました。 基本的な考えから、応用まで教えて頂き大変勉強になり、助かりました。 結局、特別製品マスタテーブルに初期製品IDフィールドを作成し、元のデータが何であるのかをわかる様になってしまいました。 追加先のテーブルに主キーがあれば、必ず先に書いたエラーが発生してしまい、オートナンバー型から、数値型に変更しても同じでした。 よって、製品ID(オートナンバー型)、初期製品ID(数値型)で元のデータの製品IDをそのままコピー、製品名・・・となりました。 出来れば、書かれている様に 重複する製品IDがあったならば追加を中止する でも良かったのですが、メリットがあまりなかったので、上記の内容になりました。 あとは、フォーム上でコピーボタンを作成し、上記クエリを実行させて終了です。 勉強中の身ですが、業務がゆっくりさせてくれないので、またお世話になるかもしれませんが、宜しくお願い致します。

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

その他の回答 (10)

noname#182251
noname#182251
回答No.11

#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 とします これでこのフォームを実行し、適当なレコードを選択後にボタンを押せば、そのレコードが「特別製品仕様書マスタ」に追加されるはずです。一応当方ではサンプルを実行し、この追加を確認しています。

t-seisan1
質問者

お礼

fuuten_no_neko さん、お忙しい中、色々と細かく教えて頂き大変感謝しております。 具体的な物まで作って頂き、大変勉強になりました。 自分も早く皆様の様に、使いこなせる様頑張りたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.10

途中で文章が切れてしまいました。 なお、他の方の捕捉でのべられているような よって、基本製品仕様書マスタテーブルに基本情報を入力し、 特別製品仕様書マスタに複製しそれを、任意の仕様に書き換える と言う事です。 だとすれば、「基本製品マスタテーブル」の製品IDは 追加先のテーブルでは確認用でもいいのではと思います。

全文を見る
すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.8

#6です。複製が必要な意味が判りました。追加クエリで良いでしょうが、特定に1レコードだけを複製しなければならないようです。SQL文は INSERT INTO 特別製品仕様書マスタ SELECT 基本製品マスタテーブル.* FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.id)=xx)); みたいなものでしょうか。xx のところで特定レコードを指定します。具体的なイメージとしては、フォームで「基本製品マスタテーブル」を一覧し、特定レコードを選択し、ボタンを押したらそのレコードの複製が「特別製品仕様書マスタ」に追加されると云ったものでしょうか。 サンプルを提示したいですが、ちょっと時間が取れません。

t-seisan1
質問者

補足

内容は合っています。 追加クエリを作成し、SQLビューの最後にWHERE (((基本製品マスタテーブル.id)=xx));を入力すれば宜しいのでしょうか? 基本製品マスタの主キーは製品No(オートナンバー型)なので、id → 製品No で宜しいのでしょうか。 また、xxは何が入るのでしょうか? 基本的な事ばかりで申し訳ございませんが、お願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • layy
  • ベストアンサー率23% (292/1222)
回答No.7

クエリをまず学習してみると良いです。 種類がいくつかあり、テーブル作成クエリ、選択クエリ、追加クエリ、は良くつかいます。 これらの特徴を理解すれば、 基本製品マスタテーブルからどういう具合にデータを抽出したらいいのか、 追加させたいテーブルにどういう具合にデータを追加するのか、 見えてくると思います。 クエリの特徴を知らずしてこの問題を対処するのは 取りかかる順番が間違っているように思います。 VBAについてもそうです。 VBAを扱うには不具合が出たらどう対処するか、誤りをどう見つけるか、 こういうのもマスターしておかないといけません。 >基本ウィザードでレコードの複製は簡単にできた 基本製品マスタテーブルにそのまま残すレコード と 別のテーブルに追加したいレコード と いう意味で(1件を2件に)複製したのではないでしょうか?。 それなら考え方、手順を変えた方がよさそうです。 アクセスはテーブル間のレコードの操作は段階踏んで行うようになりますから、 元テーブルから移動対象レコードの抽出、 追加先テーブルへレコードの追加、 元テーブルから移動対象レコードの削除、(←移動かコピーに依存) となります。 SQL文、VBAよりは まずはクエリデザインでクエリ作成を学習、かと思います。

t-seisan1
質問者

お礼

layyさん、ご協力ありがとうございます。 言われるとおり、基本的な勉強をしてから取りかかるのが一般的とは思うのですが、どうも取り掛かりが、accessのサイトから勉強しながら作り込んで勉強する方法を取ってしまい、色々と作って行く内に、当然壁にぶち当たってしまいます。色々と本を買ってきては出来るだけ理解しようとはしているのですが、途中で基本的なことか、限りなく中級から上級レベルなのかよく分からなくなってしまいます。 とは言っても、地道に頑張るしかないので、覚える順番を見直し、コツコツと覚えたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.6

「複製を別のテーブル上に作る」のは既に回答が出ているように、追加クエリで良いと思います。しかしRDBでは「複製」を作ると弊害が出る場合も多々あります。例えば元レコードあるいは複製レコードに修正が施された場合に二つのデータ間に矛盾を生ずるような場合です。 よろしければ「複製」を作る必要性を補足願えないでしょうか?

t-seisan1
質問者

補足

fuuten no nekoさんもご協力ありがとうございます。 複製の理由についてですが、基本となる製品仕様書データがあり、そのデータを基に顧客別、若干仕様の異なるデータ(一部の数値のみが異なる製品)、仕様は同じだが色の違う製品など、基本データを基に簡単に製品仕様書を作成したいのです。 よって、基本製品仕様書マスタテーブルに基本情報を入力し、特別製品仕様書マスタに複製しそれを、任意の仕様に書き換える と言う事です。 この考え方で矛盾や、弊害などあるようでしたら、ご指摘をお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

たびたびすみません。#3が追加クエリに なっていませんでした。 INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[製品IDを入れる]));

t-seisan1
質問者

補足

piroin654さん、大変失礼致しました。 別の方に、同じ内容をお聞きしてしまいました。 製品IDの所に何を入力すれば良いのか、再度考えてみると下記になりました。 WHERE (((ta基本仕様書マスタ.製品ID)=[Forms]![fo仕様書一覧]![製品ID])); これを実行してみると、 (型変換エラーの為、0個のフィールドをNULLに設定しました。また、1件のレコードキー違反でレコードの追加が出来ませんでした) 主キー(製品ID)が重複されているせいなのでしょうか? 追加クエリのSQL文を開き、製品IDを消してみたのですが、同じでした。 もう少し教えて頂けますでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

すみません。よくみたら4番目のSQL文もくずれていました。 INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 ) SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品名)=[製品名を入れる]));

t-seisan1
質問者

補足

何度もご丁寧にありがとうございます。 データが、手元にないので明日教えて頂いたようにやってみます。 また、分からなければお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

#2です。4つのSQL文の二番目が張り付けたときに形が くずれたので、張り付けなおします。 SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格 FROM 基本製品マスタテーブル WHERE (((基本製品マスタテーブル.製品ID)=[製品IDを入れる]));

全文を見る
すると、全ての回答が全文表示されます。
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>基本製品マスタテーブルがあり、中の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)
回答No.1

「基本ウィザードでレコードの複製は簡単にできた」 この結果を抽出し、 新たなテーブルへ作成することはできますか?。 クエリの「テーブル作成クエリ」はどうですか。

t-seisan1
質問者

補足

ご協力ありがとうございます。 1.結果を抽出方法がよく分かりません。 2.追加クエリとかになるのでしょうか?基本的な使い方でしたら、調べて何とかなると思うのですが・・・初心者なもので、よく言われている事が理解できません。もう少し、具体的に教えて頂けますでしょうか。 すみませんが、宜しくお願いいたします。

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

関連するQ&A

  • テーブル内のレコードを別のテーブルに移す良い方法を教えてください

    SQLサーバー7.0(ADO)とAccess97のVBAでアプリケーションの開発を行っております。SQLサーバー7.0(サーバー側)にあるテーブルの中身(レコード全件)をAccess97(ローカル)にあるテーブル(テーブル名とその中のフィールド名は全く同じだが中身はからっぽ)にまとめて移しかえる良い方法があれば教えてください。いま私はフォームオープンイベントでフィールドとレコードをループでまわして移しかえているのですが、テーブル数も多いため記述も長くなりますし、何よりもパフォーマンスが良くありません。テーブル単位で中身を別のテーブルに移す方法などがあれば是非教えてください。 (例) SQLサーバー(ホスト側)---テーブル名「T_社員マスター」フィールド数100項目、レコード数500件 ↓ ↓ フォームオープン時にそのまま移しかえたい ↓ ↓ Access97(端末側)-------テーブル名「T_社員マスター」フィールド数100項目、レコード数0件 よろしくお願いします。

  • VBAがわからない!

    いつもお世話になってます…。 Accessでいろいろとがんばってるんですが、VBAに関してはほとんど無知に近いので、やりたいように動かすことができません! フォームから削除ボタン押下後にA、Bと2つのテーブルから同じIDのレコードを削除したいんです。 フォームの構成はAが親フォーム、Bが子フォームになります。 AのテーブルはIDが主キーに設定してあります。 とりあえずSQLをきって削除させようとしたんですが、Aのテーブルの全レコードが削除されてしまいました^^; VBAで2つのテーブルを同時に削除するSQLを発行する方法を教えてください! お願いします。

  • ACCESSで、新規か更新かの判断

    Accessを学び始めてまもないです。 質問内容、ことば等にに不備がありましたら申し訳ありません。 やりたいことは以下のとおりです。 フォームをあるテーブルと連結(レコードソースにテーブルを指定)して、 登録、削除、検索を行おうとしています。 (ウィザードで作成されたようなインタフェースは使いません) 基本的には新規登録状態で、 削除、検索の場合は別(サブ)フォームを開いてレコードを指定し、メインのフォームに戻って作業します。 お聞きしたいことは、 VBAで、メインのフォームが新規登録状態か更新状態かを知るにはどうしたらいいのでしょうか? (いわゆる、ウィザードで作成した単票形式で自動的に作成される、移動ボタン、新規登録ボタンのそのときの状態です) いまいち、私はAccessの仕組みが分かっていないようで、 ご迷惑をおかけしますが、よろしくお願いいたします。

  • アクセスのVBAについて

    アクセスのVBAでテーブルからウィザードでフォームを作成したのですが、その表示内容を昇順でソートしたいのですがどうすればよいのでしょうか?勝手に主キーでソートされてしまいます。違う値でソートしたいのですが・・・一応フォームLoadのイベントでSQLでテーブル内容をソートして値を代入していったのですがうまくいきません。 よろしくお願いいたします。

  • アクセスでフォームに入力したレコードの複製について教えてください

    アクセスでフォームに入力したレコードの複製したいのですが、何か方法はありますか? テーブルをコピペしようとしたらオートナンバーを含んだフィールドを入れているせいか、ペストができません。

  • ACCESS2000であるレコードまで進んだら別フォームに

    ACCESS2000を使って簡単占いソフトを作りました。 あるテーブル(質問集)から単票フォームを作成しました。次のレコード(質問)へはマクロボタンを割付し進むようになっています。 この場合最終レコード(最後の質問)でそのマクロボタンを押すと、別のフォーム(別の質問集)に切り替えるにはどう記述したらよいでしょうか? レコードの数は変わることはありません。 ACCESSは初歩的なことはわかり自分で作成もしますが、モジュールは全くわかりません。基本的なSQLの知識はありますが実践したことはありません。 わかりづらい点があれば、補足質問をお願いします。 宜しくお願いします。

  • お知恵をお貸しください。

    accessで、製品テーブルを作成(製品番号(主キーの為に作成)、製品コード、製品名、入数)し、1つの製品として取り扱いします。メインテーブルとして発注書テーブルを作り、上記内容をルックアップウィザードで選択出来るようにしています。 発注書クエリを作成し、製品を選択し、ケース数を入力すると、数量が算出できるようにしましたが、これを入力フォーム上で行うと、製品を選択し、ケース数を入力すると、製品番号を入数と勘違いし、数量計算が間違って出力されてしまいます。 フォーム上で製品を選択し、ケース数を入力したら、数量が自動的に変更になるにはどうしたら宜しいでしょうか? 例) 製品番号 001 製品コード 0005 製品名 Tキャップ 入数 3000 これに ケース数 20 と入力するとクエリ上では数量60000と計算してくれますが、フォーム上では数量3000になってしまいます。 すみませんが、お知恵をお貸し頂けますか。 宜しくお願い致します。

  • Accessでのフォーム入力エラー

    顧客管理を 顧客マスタ 受注明細 入金明細のテーブルを作成し、リレーションシップの設定をしてあります。テーブルには、この形で入力できるのですが、フォームをウィザードを使って作成(サブフォームのリンクされたフォーム)しました。 新規入力することができません。「テーブル’顧客マスタ’にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更をおこなうことはできません。」のメッセージが出ます。 どうしていいのか、わかりません。教えてください。

  • Access VBAで、Accessフォーム上に表示されたレコードを選

    Access VBAで、Accessフォーム上に表示されたレコードを選択・印刷するには? Access VBA (Access 2003 SP3) SQL Server 2000 の組合せでプログラムを書いています。 フォーム上に表示された複数のレコードを一括印刷するのでなく、 ユーザが、印刷したいレコードだけにチェックを入れて、 チェックの入ったレコードだけを印刷できるようにするには、 どう書いたらよいでしょうか? たとえば、ユーザが外注先の一覧画面で、 選択した外注先だけの宛名ラベルを 印刷できるようにしたいです。 使用するテーブル:T_Gaichusaki 使用するフォーム:F_SearchGaichusaki 使用するレポート:R_GaichusakiLabel フォーム上で、チェックが入っているかどうかを VBAから参照するにはどうしたらよいのか、というところから わかりません。。 VBAのRecordsetオブジェクトを使うのでしょうか? よろしくご教示下さい!!

  • フォーム内のデータをすべて更新したい

    フォーム内のデータをすべて更新したい ACCESSでデータ入力ができるようにフォームを作成しました。 わりと頻繁に同じ様な内容のデータを入力することがあり、レコードのコピーをボタンウィザードのレコードの複製を使わず、選択しているレコードで必要な部分のみをコピー用に用意したテーブルに追加して、追加したテーブルから元のテーブルに追加するというマクロを作成しました。 テーブルにはデータは追加されているのですが、フォーム上には「F5キー」やメニューの「すべて更新」ボタンをクリックしないとフォーム上に現れません、マクロ「再クエリ」や「コマンドの実行」-「最新の情報に更新」を入れてみましたが、「F5キー」やメニューの「すべて更新」ボタンをクリックした時のような動作はしてくれませんでした。 どういったマクロを作ればよいかご教示いただけないでしょうか。 緒ろしくお願いいたします。 ACCESS 2007を使っています