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でレコードセットを使ったやりかたも
あります。ご所望ならばコードを提示します。
No.3
- 回答日時:
#2です。
4つのSQL文の二番目が張り付けたときに形がくずれたので、張り付けなおします。
SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格
FROM 基本製品マスタテーブル
WHERE (((基本製品マスタテーブル.製品ID)=[製品IDを入れる]));
No.4
- 回答日時:
すみません。
よくみたら4番目のSQL文もくずれていました。INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 )
SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格
FROM 基本製品マスタテーブル
WHERE (((基本製品マスタテーブル.製品名)=[製品名を入れる]));
この回答への補足
何度もご丁寧にありがとうございます。
データが、手元にないので明日教えて頂いたようにやってみます。
また、分からなければお願いします。
No.5
- 回答日時:
たびたびすみません。
#3が追加クエリになっていませんでした。
INSERT INTO 他の製品テーブル ( 製品ID, 製品名, 価格 )
SELECT 基本製品マスタテーブル.製品ID, 基本製品マスタテーブル.製品名, 基本製品マスタテーブル.価格
FROM 基本製品マスタテーブル
WHERE (((基本製品マスタテーブル.製品ID)=[製品IDを入れる]));
この回答への補足
piroin654さん、大変失礼致しました。
別の方に、同じ内容をお聞きしてしまいました。
製品IDの所に何を入力すれば良いのか、再度考えてみると下記になりました。
WHERE (((ta基本仕様書マスタ.製品ID)=[Forms]![fo仕様書一覧]![製品ID]));
これを実行してみると、
(型変換エラーの為、0個のフィールドをNULLに設定しました。また、1件のレコードキー違反でレコードの追加が出来ませんでした)
主キー(製品ID)が重複されているせいなのでしょうか?
追加クエリのSQL文を開き、製品IDを消してみたのですが、同じでした。
もう少し教えて頂けますでしょうか。
No.6
- 回答日時:
「複製を別のテーブル上に作る」のは既に回答が出ているように、追加クエリで良いと思います。
しかしRDBでは「複製」を作ると弊害が出る場合も多々あります。例えば元レコードあるいは複製レコードに修正が施された場合に二つのデータ間に矛盾を生ずるような場合です。よろしければ「複製」を作る必要性を補足願えないでしょうか?
この回答への補足
fuuten no nekoさんもご協力ありがとうございます。
複製の理由についてですが、基本となる製品仕様書データがあり、そのデータを基に顧客別、若干仕様の異なるデータ(一部の数値のみが異なる製品)、仕様は同じだが色の違う製品など、基本データを基に簡単に製品仕様書を作成したいのです。
よって、基本製品仕様書マスタテーブルに基本情報を入力し、特別製品仕様書マスタに複製しそれを、任意の仕様に書き換える と言う事です。
この考え方で矛盾や、弊害などあるようでしたら、ご指摘をお願い致します。
No.7
- 回答日時:
クエリをまず学習してみると良いです。
種類がいくつかあり、テーブル作成クエリ、選択クエリ、追加クエリ、は良くつかいます。
これらの特徴を理解すれば、
基本製品マスタテーブルからどういう具合にデータを抽出したらいいのか、
追加させたいテーブルにどういう具合にデータを追加するのか、
見えてくると思います。
クエリの特徴を知らずしてこの問題を対処するのは
取りかかる順番が間違っているように思います。
VBAについてもそうです。
VBAを扱うには不具合が出たらどう対処するか、誤りをどう見つけるか、
こういうのもマスターしておかないといけません。
>基本ウィザードでレコードの複製は簡単にできた
基本製品マスタテーブルにそのまま残すレコード
と
別のテーブルに追加したいレコード
と
いう意味で(1件を2件に)複製したのではないでしょうか?。
それなら考え方、手順を変えた方がよさそうです。
アクセスはテーブル間のレコードの操作は段階踏んで行うようになりますから、
元テーブルから移動対象レコードの抽出、
追加先テーブルへレコードの追加、
元テーブルから移動対象レコードの削除、(←移動かコピーに依存)
となります。
SQL文、VBAよりは
まずはクエリデザインでクエリ作成を学習、かと思います。
layyさん、ご協力ありがとうございます。
言われるとおり、基本的な勉強をしてから取りかかるのが一般的とは思うのですが、どうも取り掛かりが、accessのサイトから勉強しながら作り込んで勉強する方法を取ってしまい、色々と作って行く内に、当然壁にぶち当たってしまいます。色々と本を買ってきては出来るだけ理解しようとはしているのですが、途中で基本的なことか、限りなく中級から上級レベルなのかよく分からなくなってしまいます。
とは言っても、地道に頑張るしかないので、覚える順番を見直し、コツコツと覚えたいと思います。
ありがとうございました。
No.8
- 回答日時:
#6です。
複製が必要な意味が判りました。追加クエリで良いでしょうが、特定に1レコードだけを複製しなければならないようです。SQL文はINSERT INTO 特別製品仕様書マスタ
SELECT 基本製品マスタテーブル.*
FROM 基本製品マスタテーブル
WHERE (((基本製品マスタテーブル.id)=xx));
みたいなものでしょうか。xx のところで特定レコードを指定します。具体的なイメージとしては、フォームで「基本製品マスタテーブル」を一覧し、特定レコードを選択し、ボタンを押したらそのレコードの複製が「特別製品仕様書マスタ」に追加されると云ったものでしょうか。
サンプルを提示したいですが、ちょっと時間が取れません。
この回答への補足
内容は合っています。
追加クエリを作成し、SQLビューの最後にWHERE (((基本製品マスタテーブル.id)=xx));を入力すれば宜しいのでしょうか?
基本製品マスタの主キーは製品No(オートナンバー型)なので、id → 製品No で宜しいのでしょうか。
また、xxは何が入るのでしょうか?
基本的な事ばかりで申し訳ございませんが、お願い致します。
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があったならば追加を中止するということも
できますが、どうしましょうか。
少し回答が入り組んできましたが、以上です。
上記のテーブルのフィールドの追加、あるいはクエリで対応できるのか
結果を教えてください。
なお、他の方の捕捉でのべられているような
piroin654さん。
大変お世話になりました。
基本的な考えから、応用まで教えて頂き大変勉強になり、助かりました。
結局、特別製品マスタテーブルに初期製品IDフィールドを作成し、元のデータが何であるのかをわかる様になってしまいました。
追加先のテーブルに主キーがあれば、必ず先に書いたエラーが発生してしまい、オートナンバー型から、数値型に変更しても同じでした。
よって、製品ID(オートナンバー型)、初期製品ID(数値型)で元のデータの製品IDをそのままコピー、製品名・・・となりました。
出来れば、書かれている様に 重複する製品IDがあったならば追加を中止する でも良かったのですが、メリットがあまりなかったので、上記の内容になりました。
あとは、フォーム上でコピーボタンを作成し、上記クエリを実行させて終了です。
勉強中の身ですが、業務がゆっくりさせてくれないので、またお世話になるかもしれませんが、宜しくお願い致します。
No.10
- 回答日時:
途中で文章が切れてしまいました。
なお、他の方の捕捉でのべられているような
よって、基本製品仕様書マスタテーブルに基本情報を入力し、
特別製品仕様書マスタに複製しそれを、任意の仕様に書き換える
と言う事です。
だとすれば、「基本製品マスタテーブル」の製品IDは
追加先のテーブルでは確認用でもいいのではと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- MySQL データベースの複製の仕方(mysql) 2 2023/05/30 18:24
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- Access(アクセス) Accessにインポートした複数のテーブルを表示させる方法が分かりません。 1 2023/01/30 20:22
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Excel(エクセル) エクセルでフィルタ後の列の重複を回避したい 6 2022/10/13 12:50
- Access(アクセス) Access2016でフォーム内にExcelの複数シートを 表示させるイメージで複数テーブルの デー 1 2022/11/25 15:30
- その他(Microsoft Office) Microsoft OneDriveのofficeについて 1 2022/09/03 11:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Access】外部結合を行う前に...
-
AccessのInsertクエリのあとつ...
-
Access レコードを追加できませ...
-
特定のスキーマのテーブルを一...
-
GROUP BY で列名は指定できない...
-
Viewにインデックスは張れ...
-
ORA-00959: 表領域'****'は...
-
DBで第1正規形と第2正規形の...
-
SQLServerにおける、排他制御に...
-
異なるスキーマからビュー作成
-
Oracleの欠点
-
CLOB型へのINSERT
-
Oracle テーブルの列削除
-
select for updateのロック
-
Oracleでの登録するユーザーと...
-
データファイルの縮小
-
Oracle Databaseのインデックス...
-
PostgressからMySQL(MariaDB)...
-
Select時に取得行番号を指定す...
-
ACCESS テーブルに2行目から取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS 複数テーブル・複数フィ...
-
Access レコードを追加できませ...
-
検索結果の列数を動的に変更したい
-
【Access】外部結合を行う前に...
-
AccessのInsertクエリのあとつ...
-
INSERT文で発行したオートナン...
-
Accessで、マスター情報を参照...
-
複数あるAccessのテーブルを一...
-
AS/400のDBについて
-
ACCESSでの文字列の比較
-
データベースの正規化について
-
複数テーブルをひとつのテーブ...
-
Access2002 マスタテーブル変更...
-
データを削除しても表領域の使...
-
Viewにインデックスは張れ...
-
異なるスキーマからデータを抽...
-
CLOB型へのINSERT
-
datapumpの実行方法について
-
Data Pump で大量データインポ...
-
DELETE文でFROM句を省略した場合
おすすめ情報