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

アクセス初心者です。
二つのテーブルがあります。
テーブル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は使ったことがないです。よろしくお願いします。

A 回答 (8件)

>実はテーブル1、2ともにIDをオートナンバーでつけています。


>それでよろしいでしょうか?
オートナンバーを時系列とみなせばいいわけですからそれでできます
ただし、Accessのクエリ(SQL)はレコードごとの操作はできませんので
VBAでやることになります

プログラムの流れは2重のループになります

外のループ:テーブル1から1レコード取り出し
 内のループ:テーブル2のチェック無しの先頭レコードから最後のレコードに向かって
 条件に合うものを探す、あればテーブル1、2のチェックをON、ループを出る
テーブル1の次のレコードで外のループ繰り返し

この回答への補足

CHRONOS_0さん回答ありがとうございます。
アクセスでVBAは使ったことがないのですが考え方は分かりました。
やはりVBAを学ばなければならないみたいですね。

こういう処理をするのに参考なるお勧め本があれば教えて下さい。
自分で探せよと言われそうですが。少し勉強してみます。解決するまで時間がかかりそうですがとりあえずお礼まで。

補足日時:2008/07/22 13:04
    • good
    • 0
この回答へのお礼

的確なアドバイスのおかげでなんとか目的に達しました。
VBAの勉強に時間がかかりお礼が遅くなりました。

付け焼刃のVBAなので動くいて目的通りになるのだけれども
試行錯誤でやっているので自分の書いたコードでもどう動作しているのか分かりませんが(^_^;)

これから解読していきます。どうもありがとうございました。

お礼日時:2008/07/29 16:21

#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));

貸し出しワークテーブルから貸し出し履歴テーブル書き込む場合は、二重貸し出しにならないようなチェック用のクエリーが必要でしょう。
    • good
    • 0
この回答へのお礼

丁寧な回答ありがとうございます。
質問の件は解決しました。fuuten_no_nekoさんには色々なアドバイス勉強になりました。ただ私のVBAの理解力がないため把握しきっていません。

これから知識がついていけばアドバイスを生かせることができるようになると思います。本当にありがとうございました。

お礼日時:2008/07/29 20:18

#1、#6です。


既にこのようにされている部分もあるかもしれませんがテーブルは
1.品物(?)台帳
品物ID、品名、料金、購入日、etc.
2.得意先台帳
得意先ID、会社名、電話、住所、etc.
3.貸し出し履歴
品物ID、得意先ID、数量、貸出日、返却日

このようにすれば、貸出日があり返却日がないものが貸し出し中とわかります。貸出先から別の得意先に転送された場合の処理もできるでしょう。さらに品物の貸し出し履歴や、得意先ごとの貸し出し日数、料金の計算など、色々役立つと思いますが。

この回答への補足

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

補足日時:2008/07/24 09:21
    • good
    • 0

#1です。

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

この回答への補足

回答ありがとうございます。
的確な説明できなくて申し訳ありません。
テーブル1は商品を得意先に貸出したものを入れています。
これをフォームに表示して返却されたものにチェックを付けていました。
次にフォームを表示したときチェックされたもの以外を表示することにより現在の貸出しているものを把握する為です。
商品は貸出先から直接返却されるときもあれば貸出先から別の得意先に転送されることもあるので返却してきた得意先と貸出先が違っている場合もあります。

貸出商品はバーコードをスキャナで読み取りそれをアクセスに取り込むことにしました。貸出先が別の得意先に転送した明細を知らせてきた場合は転送処理をしています。

一応以上の形で完成としていたのですがやはり商品数が多くなってくると目で確認しながチェックしていくのは効率が悪いと思い返却商品をテーブル2に取り込み自動に消しこみをしたいと考えました。それで得意先、品番、数量が同じものがあればチェックをつけるとしました。

テーブル1にチェックがついているものが返却されたもの。ついていないのが貸し出しているもの。
テーブル2でチェックがついてないものは返却されているが商品の数量や得意先が違っているため返却処理が出来ないものになります。

とりあえずここまでの処理をしようとして質問しました。

これから先はテーブル2でチェックがついていない品番を選択しテーブル1のチェックのついていない同品番を検索して数量違いなのか得意先違いなのか判断し数量が分散されて入力したものは返却処理、得意先の違うものは転送処理及び返却処理をしテーブル1に同品番がなければ貸出した商品以外のものが返却されたものと判断する。というのが最終目的なのですが一度に質問しても私が理解できないと思い最初の質問となりました。

テーブルの設計など最初から自動消し込みを考えていた訳でなくまず自分の分かる範囲で作りその後こうなったらいいなと継ぎ足していき分からないことを調べたり聞いたりして作っているので無駄なこともある設計になっているのかも知れませんが自分ではよく分からないのです。何度かこういったものを作っていくうちに理解できるようになればいいなと思っています。

今までの回答で自分のなかではスッキリしているのですが(実際に解決している訳ではありません。(^_^;))何か根本的に考え方の間違いや無駄な処理をしているのでしょうか?アクセスというよりデータベースのアプリは初めてで参考書やネットの独学なのでとんちんかんなことを質問しているかもしれませんがお許しを。

補足日時:2008/07/24 07:23
    • good
    • 0

それではテーブル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  レ

この回答への補足

すみません。理解度が足りなくてよく分かりません。
もう少し整理してみます。分かり易くする為日付を加えました。

まず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様の一意の意味は分かるのですがどうすればよいの分かりません。もう少し考えてみます。

補足日時:2008/07/22 01:26
    • good
    • 0

それぞれにオートナンバーなIDを付けても、テーブル1のレコードとテーブル2のレコードを一意にすることができませんよ。

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

この回答への補足

分かりました。元々テーブル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  レ

よろしくお願いします。

補足日時:2008/07/21 20:59
    • good
    • 0

消しこみというのは時系列に沿ってレコードをひとつずつ処理していく操作です


アップされたテーブルにはそのようなフィールドがありませんね
テーブルから作り直す必要があります

この回答への補足

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

補足日時:2008/07/21 12:22
    • good
    • 0

テーブル2の1レコード目から5レコード目までは、データーベース的に差違がありません。

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

この回答への補足

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

補足日時:2008/07/21 12:15
    • good
    • 0

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