プロが教えるわが家の防犯対策術!

質問のタイトルが正しいかどうかはわからないのですが、やりたいことは以下のとおりです。
初心者ですので、考え方自体間違っているかもしれません。ご教授ください。

アクセスにORDER DETAILというテーブルがあります。ここに、追加クエリを利用して、データを追加していけるようにしたいと思います。
その追加クエリは、ORDER DETAILに追加 という名前のテーブルからできており、このテーブルに入ったものがクエリを使うことでORDER DETAILに入るようになっています。

このとき、
1、ORDER DETAILに追加、という名前のテーブルの中身のデータは、エクセルからインポートします。何度も繰り返し使います(何度も追加する)ので、インポートのたびに、まず、テーブルの中身をすべて消してから、インポートするようにします。それから追加クエリを使って、ORDER DETAILに追加を行います。
2、このとき、エクセルのデータには、商品番号しか入っておりません。これをインポートしたとき、ORDER DETAILに追加 テーブルには、たくさんのフィールドがありますので、それを埋める必要があります。そこで、VLOOKのようなものを使用したいのです。アクセス内に、商品 という名前のテーブルがありますので、ORDER DETAILに追加 テーブルのフィールドである’DESC1'に、商品 テーブルの’Description1’を入れるようにしたいのです。このときサブクエリを使うのでしょうか?SQLでしょうか?単なるテーブルのリレーションシップで解決しないと思ったので、お尋ねしました。
詳しい方がいらっしゃいましたらどうぞお願いいたします。

A 回答 (8件)

No.2です。



> 私の書き方が悪かったな、と気づいたところがありましたので、ANo.3さんに対する
> 補足内容をご参照ください。

いえ、ami0607さんの意図は、きちんと伝わっています(恐らくMARU4812さんにも)。
「フィールドに値を入れたい」というご希望はわかった上で、「関数で値が特定できる
データは、テーブルにフィールドを用意しないのが、Access等での一般的な使用法
ですよ」とアドバイスをした、ということです。

・・・とはいえ、どうしても『ORDER DETAIL』テーブルに『DESC1』フィールドを設置
したいということでしたら、回答者からそれを強く推すのもおせっかいにしかなりません
ので(汗)、その方法をご説明します。

といっても、
> 双方の『商品番号』フィールドを結合させた選択クエリを作成するについてですが、
> これは私にでもすぐにできそうです。
とのことでしたら、そんなに難しい話ではありません。

1)デザインビューで、上記の通りの選択クエリを作成する
2)上記の選択クエリを追加クエリに変更し、追加先となるテーブルを指定
3)追加元と追加先で同名のフィールドの場合は、『レコードの追加』欄に自動で
 フィールド名が入るので、確認
 ※同じフィールドを複数回指定していると追加実行時にエラーとなるので注意※
4)追加元と追加先で名前が異なる場合は、空白になっている『レコードの追加』欄
 の右端をクリックして、そこのリストから、追加したいフィールドを指定
5)追加が必要なフィールドを全て指定したら、保存して閉じる


・・・以上です。
画像を添付しますので、併せて参考まで。
「アクセスのクエリに、VLOOKを設定した」の回答画像8
    • good
    • 0
この回答へのお礼

いつもありがとうございます。しかも、画像つき!(これのおかげで、理解するのに時間がかかりませんでした)

教えていただいたとおりにやったら、いとも簡単にできました!ありがとうございます。VLOOKのような式を書かないといけないと思っていたので、このようなやり方でできると知って、とても驚き&感激でした。

本当にありがとうございました。今、会社のシステムとかを昔さわっていた人がいなくなった&私が個人的に誰でも簡単に触れるシステムを作っておきたいため、いろいろ身の回りのことを便利にしているところですが、助けていただき本当に感謝しています。
またいろいろ質問することもあるかもしれませんが、どうぞ宜しくお願い致します。

お礼日時:2010/12/20 14:15

#6の続きとして、



追加クエリの作成方法は以下にあります。

http://office.microsoft.com/ja-jp/access-help/HA …

追加するテーブルと追加されるテーブルで
フィールド名が違っていてもフィールドの型が
同じならば追加できます。
    • good
    • 0

#4です。



できます。「ORDER DETAILに追加」テーブルの
「DESC1」も「ORDER DETAIL」に追加するとして
「ORDER DETAIL」にも同じ名前の「DESC1」という
フィールドがあるとすると、以下のように
なります。

INSERT INTO ORDER DETAIL ( [CATALOG#], DESC1 )
SELECT ORDER DETAILに追加.商品番号, ORDER DETAILに追加.DESC1
FROM ORDER DETAILに追加;


もし、「DESC1」の名前が違っていても追加する
フィールド名をクエリのデザインビューで
「レコードの追加」のところで指定すれば
指定したフィールドにデータが追加されます。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。そのようなやり方でできるのですね。
とても参考になりました。
SQLがあまり得意でないため、今回は、別の方に教えていただいたデザイン画面を使ってやる方法で私はさせていただきました。

また今後も機会があればご教授お願いいたします。

お礼日時:2010/12/20 13:55

#4です。


>#1でのクエリは一応、Excel側のセルの先頭には「商品番号」を
>いれているものとしています。
というのは、この「商品番号」がフィールド名に
なるからです。
    • good
    • 0

Sheet1というのはExcelのSheetの名称で、Excelを


開いたときに下に表示されています。普通は
初期値はSheet1、Sheet2のようになっています。
リンクするとこのSheet名がAccessでのテーブル名
として登録されます。

リンク方法は以下にあります。
http://office.microsoft.com/ja-jp/access-help/HA …

テーブルのリンクを選択し、ファイルの種類を
Excelに変更し、フォルダに移動後、Excelファイルを
選択するとウィザードが表示されます。

#1でのクエリは一応、Excel側のセルの先頭には「商品番号」を
いれているものとしています。
    • good
    • 0
この回答へのお礼

ありがとうございます。Sheet1は、この場合、テーブルの名前(通常)ということですよね。わかりました。
今回は、”ORDER DETAILに追加” テーブルのフィールドである’DESC1'に、”商品” テーブルの’Description1’を入れるようにしたい、(商品番号でlookupを行い、値をひっぱる)
ということをしたいのですが、今になってまたひとつ面倒なことがわかりました。ふたつのテーブルで、’商品番号’は一致するのですが、フィールドの名前が違うことがわかりました。
ORDER DETAIL のテーブルのほうでは、CATALOG#というフィールド名になっております。
商品番号と、CATALOG#というように、フィールド名はちがいますが、参照して値はひっぱれるのでしょうか。

お礼日時:2010/12/17 16:41

私も


> たくさんのフィールドがありますので、それを埋める必要があります。
すべきではないと思います。

VLOOK はあくまでもキーが一致する情報を参照するだけですので、
テーブルのリレーションの機能がそのものだと思います。

一般に、共通するデータはマスタ(今回の場合は商品テーブル)に
まとめて、実績データのテーブルには商品番号しか記録しません。
わざわざ処理時点のマスタの情報をコピーする必要があるのは、
出荷伝票など、その時点の確定データを履歴管理するときなどです。

VLOOK の検索機能ではなく、完全にその時点の情報を記録する
目的があるなら、そのように質問を修正する必要があるかと
思います。

VLOOK の機能という質問であれば、
> たくさんのフィールド
を削除してリレーションすべきだと思います。

この回答への補足

すみません。たぶん、私のこの文章の書き方が悪かったのだと思います。
今回の件は、追加元のテーブルにはあくまで商品番号のみが入っています。その詳細(商品の名前や価格など)をすべて記入してから追加元に追加する必要があるので、それを、なんとかアクセス内で処理できないかな、と思ったのです。

最悪、エクセルからアクセスにデータを取り込む前に、エクセル内でVLOOKを使って完全なデータにしてから取り込みすればいい話なのですが、商品名や価格などは、アクセスに入っているデータが常に最新なので、アクセス内で値を参照しひっぱってこれるようにしたいという質問です。

補足日時:2010/12/17 11:47
    • good
    • 0

> VLOOKのようなものを使用したいのです。



Accessの関数で、ExcelのVLookup関数に近いことが行えるもの
としては、DLookup関数があります。
(大雑把には
  VLookup(検索値, 参照範囲, 参照列(番号))
  DLookup(参照列(名前), 参照テーブル, 検索条件)
 といった感じ:詳しくはヘルプを参照下さい(汗))

ただ、
> たくさんのフィールドがありますので、それを埋める必要があります。
とのことですが、これで「テーブルのフィールド」を埋めてしまうと、値が
固定されてしまいます。
(Excelの動作で例えるなら、「VLookupで表示させた値をコピーした
後、『形式を選択して貼り付け』を使用して、『値』を貼り付け」した
のと同じことになってしまう、と)

Excelで関数を残したままにしておく(=参照先のデータを更新したら
自動計算で反映される)のと同じ状態にするためには、選択クエリと
してそれらのデータを表示させるようにする必要があります。
(→Accessなどの「リレーショナル データベース」と呼ばれるもので
 通常採られる方法でもあります)
※ここで言っているのは、あくまで「他のテーブルを参照すれば値を
  特定できるデータ」だけです。それ以外の個別の情報は、当然
  ながらフィールドに記録する必要があります。

ですので、本来なら、『ORDER DETAIL』『ORDER DETAILに追加』
のどちらにも、『DESC1』フィールドは作成しない方がベターです。
(勿論、式を残したままのExcelと同様に、値を記録していない方が
 動作は遅くなるため、そういう値を記録する場合もあります)

この状態で、『DESC1』の情報を表示するには、
 a)『ORDER DETAIL』と『商品』の2つのテーブルから、双方の『商品
  番号』フィールドを結合させた選択クエリを作成する
 b)『ORDER DETAIL』テーブルのみから選択クエリを作成し、
  『DESC1』に相当するフィールドは、DLookup関数を使用するか、
  『商品番号』フィールドをコンボボックス表示する
  (コンボボックスの『値集合ソース』プロパティに、『商品』テーブルを
  使用)
といった手段を採ります。
(aの場合は、テーブルの主キーの設定などによってはクエリ上での
 追加/更新などが制限される場合があります。
bの場合は、『ORDER DETAIL』テーブルへの追加/更新には
 制限は発生しませんが(『商品』テーブルは参照のみ)、aに比べて
 動作が遅くなります)


・・・以上、とりあえず、今回は概要ということで(汗)

この回答への補足

すみません。ひとつ、私の書き方が悪かったな、と気づいたところがありましたので、ANo.3さんに対する補足内容をご参照ください。
丁寧に説明していただきありがとうございます。

今回は、”ORDER DETAILに追加” テーブルのフィールドである’DESC1'に、”商品” テーブルの’Description1’を入れるようにしたい、(商品番号でlookupを行い、値をひっぱる)という希望ですが、価格やそのほか、 ”商品”テーブルから3フィールド分はひっぱってこようと思っているのですが、、 これは思い作業になりそうでしょうか?

また、回答の>a)『ORDER DETAIL』と『商品』の2つのテーブルから、双方の『商品番号』フィールドを結合させた選択クエリを作成する
についてですが、これは私にでもすぐにできそうです。しかしこれを作ったあと、どうしたらいいのでしょうか。教えていただけますでしょうか。
たしかにこれで、このクエリ内で商品番号からDESC1とDescription1がひっぱってこれますが、私の希望は”ORDER DETAILに追加”テーブルを商品番号のみのエクセルデータから作成したとき、このテーブルのフィールドであるDESC1に”商品”テーブルから ’商品番号’をもとにDescription1の値をひっぱることです。そして、”ORDER DETAILに追加”テーブルに常に値が表示されるようにすることです。
以上、どうぞ宜しくお願いいたします。

補足日時:2010/12/17 11:58
    • good
    • 0

一応、Excelのシートをリンクして使う


ものとして、以下のようなことでしょうか。
追加クエリです。

INSERT INTO ORDER DETAILに追加 ( 商品番号, DESC1 )
SELECT Sheet1.商品番号, 商品.Description1
FROM Sheet1 INNER JOIN 商品 ON Sheet1.商品番号 = 商品.商品番号;

この回答への補足

リンクってできたんですね。便利ですね。ありがとうございます。エクセルを更新したら、アクセスのテーブルもそれにつられるってことですよね。

ではリンクテーブルを作って、その名前を ORDER DETAILに追加 にすることにします。
このSheet1は何と理解したらよろしいでしょうか。

補足日時:2010/12/17 11:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!