アクセス初心者のための二つのテーブルの比較と更新クエリーの使い方

このQ&Aのポイント
  • アクセス初心者の方が二つのテーブルを比較して同じ品番、得意先、数量のデータにチェックボックスをTrueにする方法を教えてください。
  • 更新クエリーを使用してテーブル1は成功しましたが、テーブル2は全てのデータにチェックがついてしまいました。
  • VBAの経験がないため、より良い方法を教えてください。
回答を見る
  • ベストアンサー

アクセスで消し込みがしたい

アクセス初心者です。 二つのテーブルがあります。 テーブル1 品番 得意先 数量 チェック 111  A    1 111  A    1 111  A    2 111  B    1 222  A    1 テーブル2 品番 得意先 数量 チェック 111  A    1 111  A    1 111  A    1 111  A    1 111  A    1 222  A    1 この二つのテーブルを比較して品番、得意先、数量の同じものに チェックボックスをTrueにしたいのです。つまり テーブル1 品番 得意先 数量 チェック 111  A    1  レ 111  A    1  レ 111  A    2 111  B    1 222  A    1  レ テーブル2 品番 得意先 数量 チェック 111  A    1  レ 111  A    1  レ 111  A    1 111  A    1 111  A    1 222  A    1  レ の状態にしたいのです。更新クエリーを使って見ましたが テーブル1は希望通りですがテーブル2は全てにチェックが ついてしまいました。当たり前ですね。(^_^;) VBAは使ったことがないです。よろしくお願いします。

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

  • ベストアンサー
  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.5

>実はテーブル1、2ともにIDをオートナンバーでつけています。 >それでよろしいでしょうか? オートナンバーを時系列とみなせばいいわけですからそれでできます ただし、Accessのクエリ(SQL)はレコードごとの操作はできませんので VBAでやることになります プログラムの流れは2重のループになります 外のループ:テーブル1から1レコード取り出し  内のループ:テーブル2のチェック無しの先頭レコードから最後のレコードに向かって  条件に合うものを探す、あればテーブル1、2のチェックをON、ループを出る テーブル1の次のレコードで外のループ繰り返し

comikomi
質問者

お礼

的確なアドバイスのおかげでなんとか目的に達しました。 VBAの勉強に時間がかかりお礼が遅くなりました。 付け焼刃のVBAなので動くいて目的通りになるのだけれども 試行錯誤でやっているので自分の書いたコードでもどう動作しているのか分かりませんが(^_^;) これから解読していきます。どうもありがとうございました。

comikomi
質問者

補足

CHRONOS_0さん回答ありがとうございます。 アクセスでVBAは使ったことがないのですが考え方は分かりました。 やはりVBAを学ばなければならないみたいですね。 こういう処理をするのに参考なるお勧め本があれば教えて下さい。 自分で探せよと言われそうですが。少し勉強してみます。解決するまで時間がかかりそうですがとりあえずお礼まで。

その他の回答 (7)

noname#182251
noname#182251
回答No.8

#7です。貸出日や返却日の管理ができていれば、これ以上問題はないような気もしますが? 一応#6で提示したテーブル以外に「貸し出しワークテーブル」「返却ワークテーブル」があるとして、参考になりそうなSQLを。 ・貸し出しワークテーブル 品物ID、得意先ID、数量、貸出日、処理済み(yes/no型) ・返却ワークテーブル 品物ID、得意先ID、数量、返却日、処理済み(yes/no型) 1.返却ワークテーブルから貸し出し履歴テーブルに書き込み、処理済みをマークする更新クエリー UPDATE 貸し出し履歴 INNER JOIN 返却ワークテーブル ON ([貸し出し履歴].[得意先ID]=[返却ワークテーブル].[得意先ID]) AND ([貸し出し履歴].[品物ID]=[返却ワークテーブル].[品物ID]) SET 返却ワークテーブル.処理済み = True, 貸し出し履歴.返却日 = [返却ワークテーブル].[返却日] WHERE ((([返却ワークテーブル].[処理済み])=False) And (([貸し出し履歴].[返却日]) Is Null)); 2.貸し出し中のものを表示する選択クエリー SELECT [得意先台帳].[得意先名], [品物台帳].[品名], [貸し出し履歴].[貸出日], [貸し出し履歴].[返却日] FROM (貸し出し履歴 INNER JOIN 得意先台帳 ON [貸し出し履歴].[得意先ID]=[得意先台帳].[得意先ID]) INNER JOIN 品物台帳 ON [貸し出し履歴].[品物ID]=[品物台帳].[品物ID] WHERE ((([貸し出し履歴].[返却日]) Is Null)); 貸し出しワークテーブルから貸し出し履歴テーブル書き込む場合は、二重貸し出しにならないようなチェック用のクエリーが必要でしょう。

comikomi
質問者

お礼

丁寧な回答ありがとうございます。 質問の件は解決しました。fuuten_no_nekoさんには色々なアドバイス勉強になりました。ただ私のVBAの理解力がないため把握しきっていません。 これから知識がついていけばアドバイスを生かせることができるようになると思います。本当にありがとうございました。

noname#182251
noname#182251
回答No.7

#1、#6です。 既にこのようにされている部分もあるかもしれませんがテーブルは 1.品物(?)台帳 品物ID、品名、料金、購入日、etc. 2.得意先台帳 得意先ID、会社名、電話、住所、etc. 3.貸し出し履歴 品物ID、得意先ID、数量、貸出日、返却日 このようにすれば、貸出日があり返却日がないものが貸し出し中とわかります。貸出先から別の得意先に転送された場合の処理もできるでしょう。さらに品物の貸し出し履歴や、得意先ごとの貸し出し日数、料金の計算など、色々役立つと思いますが。

comikomi
質問者

補足

回答 ありがとうございます。 貸出日はスキャナで取り込んだ時につけています。返却日はチェックをいれたときに自動でつくようにしています。料金はこの段階では発生しないので必要はありません。得意先台帳は用意してありますが名前だけ分かれば十分なので関連づけしていません。名前はハンディスキャナに入れてあります。貸出履歴や貸出日数は分かれば便利ですね。次の段階で考えます。

noname#182251
noname#182251
回答No.6

#1です。一連の回答と補足を読んでいると、テーブル設計、あるいはそれ以前の業務分析(?)に問題や誤解があり、処理をいたずらに複雑化しているように感じられます。 ・どのようなデータを ・いかに処理し ・何を結果として求めたいのか 補足されては如何でしょうか?意外に簡単な処理で済むかもしれません。

comikomi
質問者

補足

回答ありがとうございます。 的確な説明できなくて申し訳ありません。 テーブル1は商品を得意先に貸出したものを入れています。 これをフォームに表示して返却されたものにチェックを付けていました。 次にフォームを表示したときチェックされたもの以外を表示することにより現在の貸出しているものを把握する為です。 商品は貸出先から直接返却されるときもあれば貸出先から別の得意先に転送されることもあるので返却してきた得意先と貸出先が違っている場合もあります。 貸出商品はバーコードをスキャナで読み取りそれをアクセスに取り込むことにしました。貸出先が別の得意先に転送した明細を知らせてきた場合は転送処理をしています。 一応以上の形で完成としていたのですがやはり商品数が多くなってくると目で確認しながチェックしていくのは効率が悪いと思い返却商品をテーブル2に取り込み自動に消しこみをしたいと考えました。それで得意先、品番、数量が同じものがあればチェックをつけるとしました。 テーブル1にチェックがついているものが返却されたもの。ついていないのが貸し出しているもの。 テーブル2でチェックがついてないものは返却されているが商品の数量や得意先が違っているため返却処理が出来ないものになります。 とりあえずここまでの処理をしようとして質問しました。 これから先はテーブル2でチェックがついていない品番を選択しテーブル1のチェックのついていない同品番を検索して数量違いなのか得意先違いなのか判断し数量が分散されて入力したものは返却処理、得意先の違うものは転送処理及び返却処理をしテーブル1に同品番がなければ貸出した商品以外のものが返却されたものと判断する。というのが最終目的なのですが一度に質問しても私が理解できないと思い最初の質問となりました。 テーブルの設計など最初から自動消し込みを考えていた訳でなくまず自分の分かる範囲で作りその後こうなったらいいなと継ぎ足していき分からないことを調べたり聞いたりして作っているので無駄なこともある設計になっているのかも知れませんが自分ではよく分からないのです。何度かこういったものを作っていくうちに理解できるようになればいいなと思っています。 今までの回答で自分のなかではスッキリしているのですが(実際に解決している訳ではありません。(^_^;))何か根本的に考え方の間違いや無駄な処理をしているのでしょうか?アクセスというよりデータベースのアプリは初めてで参考書やネットの独学なのでとんちんかんなことを質問しているかもしれませんがお許しを。

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.4

それではテーブル1のチェックを付けてもテーブル2のチェックに印をつけることができません。 オートナンバーを管理するテーブル0を追加するなら下のようになります。 このテーブルにあるIDが1である情報は品番が111で得意先がAです。 テーブル1とテーブル2にも同じものがありますよね。 品番が111で得意先がAであるレコードはたくさんありますがIDが1であるものはそれぞれのテーブルに1つずつしかありません。 こうやって特定のレコードを決めることができることを一意であるといいます。 更新クエリの条件に「AND ID = [チェックID]」を追記すれば解決すると思います。 テーブル0 ID 品番 得意先  1  111  A   2  111  A   3  111  A   4  111  B   5  222  A   6  111  A   7  111  A   8  111  A  テーブル1 ID 品番 得意先 数量 チェック  1  111  A    1  レ  2  111  A    1  レ  3  111  A    2  4  111  B    1  5  222  A    1  レ テーブル2 ID 品番 得意先 数量 チェック  1  111  A    1  レ  2  111  A    1  レ  6  111  A    1  7  111  A    1  8  111  A    1  5  222  A    1  レ

comikomi
質問者

補足

すみません。理解度が足りなくてよく分かりません。 もう少し整理してみます。分かり易くする為日付を加えました。 まず5月にテーブル0にデータが入ります。 オートNO 日付  品番 得意先 数量 チェック  1     5月   111  A    1    2     5月   111  A    1    3     5月   111  A    2  4     5月   111  B    1  5     5月   222  A    1   これをテーブル1に転記しています。 6月にテーブル0追加データが入ります。 オートNO 日付  品番 得意先 数量 チェック  1     5月   111  A    1    2     5月   111  A    1    3     5月   111  A    2  4     5月   111  B    1  5     5月   222  A    1    6     6月   111  A    1    7     6月   111  A    1    8     6月   111  A    1  9     6月   111  A    1 10     6月   111  A    1 11     6月   222  A    1  6月にテーブル0に追加されたものをテーブル2に転記しています。  5月のテーブル1と6月のテーブル2を比較してチェックをつけたいわけです。nfushi様の一意の意味は分かるのですがどうすればよいの分かりません。もう少し考えてみます。

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.3

それぞれにオートナンバーなIDを付けても、テーブル1のレコードとテーブル2のレコードを一意にすることができませんよ。見たところ購買のテーブルみたいなので伝票Noがあればフィールドに追加すればいいかもしれません。 伝票Noはもちろんそれのみで一意なフィールドです。 もしそういうのがないのなら別途作成します。 これはオートナンバーでかまいません。 テーブル1とテーブル2にそれぞれにオートナンバーを持たせるのではなく、両テーブル共通に使用するオートナンバーですね。

comikomi
質問者

補足

分かりました。元々テーブル1も2も別の同じテーブル0から転記したものですのでテーブル1も2もIDはオートナンバー型から数値型に変更します。 テーブル0のオートナンバーをテーブル1、2のIDに転記します。これで一意のレコードになります。よね。(^_^;) テーブル1 ID 品番 得意先 数量 チェック  1  111  A    1  レ  2  111  A    1  レ  3  111  A    2  4  111  B    1  5  222  A    1  レ テーブル2 ID 品番 得意先 数量 チェック  6  111  A    1  レ  7  111  A    1  レ  8  111  A    1  9  111  A    1 10  111  A    1 11 222  A    1  レ よろしくお願いします。

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

消しこみというのは時系列に沿ってレコードをひとつずつ処理していく操作です アップされたテーブルにはそのようなフィールドがありませんね テーブルから作り直す必要があります

comikomi
質問者

補足

すばやい回答ありがとうございます。 たしかにそうですね。 実はテーブル1、2ともにIDをオートナンバーでつけています。 それでよろしいでしょうか?

noname#182251
noname#182251
回答No.1

テーブル2の1レコード目から5レコード目までは、データーベース的に差違がありません。これでチェックを付けたり付けなかったりするのは無理です。 逆に言えば差違(シリアルナンバー)などを利用すれば、ご希望のことができるでしょう。 具体的方法は質問内容だけでは提示できません。

comikomi
質問者

補足

こんなに早い回答ありがとうございます。 実はテーブル1、2ともにIDをオートナンバーでつけています。 それでよろしいでしょうか?

関連するQ&A

  • Access 2つのテーブルで数量の比較をしたい

    Access2007を使用しています。 2つのテーブルに品番と数量がそれぞれ登録されています。 【テーブルA】 品番  / 数量 あ001/ 4 い001/ 5 あ001/ 1 【テーブルB】 品番  / 数量 う000/ 10 あ001/ 1 い001/ 4 い001/ 1 この2つのテーブルから、品番ごとの数量を比較して、異なるデータの品番と差異を取り出したいのです。 【結果】 あ001/ 4(←A-B=4) う000/ 10 A,Bのテーブルで品番ごとに集計した結果から、数量が不一致のものを取り出す方法がわかりません。 どうぞよろしくお願いいたします。

  • access vbaでクエリデータの中にNULLがあるときにメッセージを表示する方法

    access vbaでデータベースの商品マスタテーブル(リンクしたもの)と手動で取り込んだ受注テーブルを比較してマスタに登録のない品番をNULLとして表示するクエリを作ったのですが、vbaを使って「品番チェック」というボタンを押しただけで受注テーブルにNULLがあるか否かをMsgboxで表示させたいんですが、詳しい書き方がわかりません。 どなたか教えていただけないでしょうか。 出来ればNULLになった品番がメッセージボックスにでればベストなんですが・・・ よろしくおねがいします。

  • Access2つのテーブルの差額を出すピボット

    Access2007を使用しています。 以下のような2つのテーブルがあります。 <テーブルA> 区分 品番 金額  数量 A  001 10000  10 A  S12 5000   5 A  002 8000   8 A  001 6000   6 <テーブルB> 区分 品番 金額  数量 B  001 2000  2  B  S12 3000  3 このデータを元に、以下のような結果をピボットで表示したいと思っています。       区分       A  |  B   |合計 品番  数量 金額|数量 金額 |数量 金額 差額(A-B) 001 16 16000| 2 2000 | 18 18000 14000 002 8 8000 |      | 8  8000  8000 S12 5 5000 | 3 3000 | 8  8000  2000 テーブルAとBをユニオンクエリでまとめ、ピボットを作って みたのですが、差額の部分が出せず・・・ どうぞよろしくお願いします。

  • フォームで入力した内容をクエリに反映させる方法

    Accessについて教えていただければと思います。 会社のシステムのデータベースにリンクし、Accessのツールを作っています。 複数のテーブルでクエリを作り、フォームに条件指定し表示させるところまで進んでいます。(DLookUpを使っています。) このフォームに、非連結のテキストボックスを追加し、条件入力で表示された内容に、テキストボックスで入力した内容を合わせ、テーブルもしくは、クエリに保存しておきたいのですが、うまくいきません。 構成は、 Aテーブル:伝票番号、得意先 Bテーブル:伝票番号、枝番、数量 ABクエリ:伝票番号、枝番、数量、得意先 Cフォーム:伝票番号+枝番を入力し、数量、得意先を表示      配送個口数をテキストボックスに入力 Cフォームのすべての項目をのちに呼び出せるように保存しておきたいのです。 配送個口数を入力すると、枝番に関係なく、同じ伝票番号〈複数〉に登録。という形は(一時)できたのですが、枝番で絞り込めず困っています。 VBAもあまり得意ではないので、わかりやすくご指導いただければと思います。 どれだけの情報が必要かも分からないので、とりあえず、この状態で投稿いたします。 長くなりましたが、よろしくお願いいたします。

  • Accessでフィールドを比較したいのですが

    初心者です。 仕様が同じ2つのテーブルの同名フィールドを比較して、 データが同じ時、チェックボックスをTrueとしたいのですが、 比較したいフィールドが2つあり、 Aテーブルのコード1とBテーブルのコード1 Aテーブルのコード2とBテーブルのコード2 テーブルにはそれぞれ、コード1とコード2のチェックボックスを 設けています。 Select caseかIfを使うことはわかるのですが、関数が思いつきません。 よろしくお願いいたします。

  • Access2003にて・・・

     こんにちは。Accessにて、詰まってしまいまして、お知恵をお借りできればと思っています。よろしくお願いします。 Access2003 にて テーブルAには、 品番、品名、単価の3つのフィールドがあります。 このテーブルをもとにして、フォームAを単票形式で作成しました。 このフォームを、品番を登録したりするためではなく、品名や単価の確認用として使用したいと考えています。そこで、「品番」コントロールに品番を入力すると、あとの2つのコントロールに自動でデータが表示されるようにできればいいな、と思いました。  「品番」コントロールはコンボボックスに変更し、テーブルAの品番から値を取得するよう設定し、ここを入力したあと更新後処理であとの2つのコントロールに値を表示するような設定をするのかな、というところまで至って、はてここにどのような処理を書き込めばいいのかで詰まってしまいました。  このやり方がそもそも間違っているのかもしれません。テーブルをもとにするのではなく先にクエリを作っておくのがいいのかもしれませんが、自分なりにいろいろ試してみたのですが、なかなかうまくいかなくて…  何か方法はありますでしょうか?他にここへ組み込むサブフォームやら、別のフォームを表示させるボタン等考えているのですが、上記の方法ができるかできないかでフォームAのつくりを変えようと思っているので、とりあえずは必要と思われることだけ書きました。言っていただければどんどん補足させていただきますので、何か方法がございましたらご教授お願いいたします。 (ちなみに、私のAccessレベルは初心者でございます…)

  • Access2003 異なるテーブルを1つのテーブルにくっつける

    こんにちは。 Access2003で、以下の2つのテーブルがあります。 テーブルA  得意先 売上高  あああ 100  いいい 200 テーブルB  得意先 仕入高  ううう 300  えええ 400  おおお 500 上記のようにフィールドが異なり、関連するID等のキーも持っていない別々のテーブルを、クエリなどで  得意先  売上高  得意先  仕入高  あああ  100    ううう  300  いいい  200    えええ  400            おおお  500 のようにテーブルAとテーブルBを横並び(?)にくっつける事は出来るのでしょうか? 得意先も別々なので、連結とかする事ができません。。 いろいろインターネットで調べたのですが、どうしても解らないので質問させて頂きました。 宜しくお願いしますm(__)m

  • Access「レコードが削除されました」のエラー

    お世話になります。 あるデータベースを作成し、クエリで条件抽出しています。 そのクエリを実行しても、「レコードが削除されています」という エラーが出てしまうようになりました。 どうしてなのか、どうしたらいいのか教えていただけませんでしょうか。 テーブル3つをリレーションしています。 テーブルAは、テーブルBとCにつながっています。 クエリA:テーブルAのチェックボックスAでYesの人だけを選択し、 それに連動するテーブルAのデータを選択したいと思っています。 カテゴリーごとに抽出できるようパラメータをいれ、 抽出条件に「yes」を入れてあるのですが、 実行するとエラーになります。 同じ条件で作成しているクエリBは、同様にテーブルBの チェックボックスBのYesの人だけを選択するようにしているのですが、 実行しても問題がありません。 同じ設定をしている2つのクエリなので、 あとは元のテーブルデータがおかしいのかと思っているのですが 情報はちゃんと入力されています。 情報の閲覧が出来ないので非常に困っています。 復活するときもあるのですが、不安定です。 どうかチェックする部分を教えてください。 なぜこういうことが起きるのかも教えていただければと思います。 私は素人なので、VB等は組めません。 クエリ上で行ないたいのですが、 どうしたら宜しいでしょうか。 Access2000、複数人で入力しています。 宜しくお願い致します。

  • アクセスのクエリについて(前当期比較させたい)

    現在、アクセス2010を勉強中の超初心者です。 アクセスを用いて、前期と当期の商品売上数量比較表(得意先ごとの)を作成できないか考えております。  ■さっそくですが、以下の4つのテーブルがあったと仮定します。 テーブル(1)(商品マスター)           テーブル(2)(得意先マスター) 品コード | 品名                  店コード |  店名   1    | ○○                       A  |  あか   2    | ××                       B  |  いき   3    | △△                       C  |  うす テーブル(3)(前期売上データ)          テーブル(4)(当期売上データ) 店コード | 品コード | 売上数量         店コード | 品コード | 売上数量  A     |   1    |  10               A      |   3     |  20     A     |    3     |  15             A      |    4     |  25     B     |    1     |  17              B     |    2    |  27     :     |    :    |  :               :     |    :     |  :     ■以下のようなデータ抽出できないかを検討しています。 店コード | 品コード | 前期売上数量 | 当期売上数量   A    |    1     |     10       |     0   A    |    3      |     15       |     20   A    |   4      |     0       |     25  ◆自身で検討してみましたが、「前期に売上実績があるが、当期に売上実績がないケース」、及び「その逆のケース」についてうまく抽出できません。(上記例で言いますと、A店に対する売上で品コード1 と 品コード3 の商品売上数量比較ができませんでした。)  解決方法わかる方、ご教授のほどよろしくお願い致します。

  • 更新クエリが実行できず、困っています。

    以前こちらで、更新クエリについて教えて頂きましたが、 実行できず、困っています。 在庫クエリで計算した在庫数を、部品マスタの現在庫に代入する 更新クエリを実行すると、 「更新可能なクエリでなければなりません」とエラー表示されます。 UPDATE T_部品マスタ AS A INNER JOIN Q_在庫 AS B ON A.部品品番=B.部品品番 SET A.現在庫 = B.在庫数; と作成しました。 以下に、作成したデータベースを書き出してみます。 どこが悪いのか、ご指摘頂ければ幸いです。 よろしくお願いします。 部品分類テーブル 部品分類ID(主キー) 部品分類名 保管場所テーブル 保管場所ID(主キー) 保管場所 部品マスタテーブル(T_部品マスタ) 部品品番(主キー) 部品分類ID 保管場所ID 部品名 現在庫 入出庫テーブル 入出庫ID(オートナンバー) 日付 部品品番 入庫数量 出庫数量 入出庫テーブルを元にクエリを作る 入庫クエリ 部品品番 入庫数量の合計 出庫クエリ 部品品番 出庫数量の合計 在庫クエリ(Q_在庫) 部品品番(部品テーブル) 部品名(部品テーブル) 入庫数量の合計(入庫クエリ) 出庫数量の合計(出庫クエリ) 在庫数(nz([入庫数量の合計])-nz([出庫数量の合計])