アクセス初心者です。
二つのテーブルがあります。
テーブル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は使ったことがないです。よろしくお願いします。
No.5ベストアンサー
- 回答日時:
>実はテーブル1、2ともにIDをオートナンバーでつけています。
>それでよろしいでしょうか?
オートナンバーを時系列とみなせばいいわけですからそれでできます
ただし、Accessのクエリ(SQL)はレコードごとの操作はできませんので
VBAでやることになります
プログラムの流れは2重のループになります
外のループ:テーブル1から1レコード取り出し
内のループ:テーブル2のチェック無しの先頭レコードから最後のレコードに向かって
条件に合うものを探す、あればテーブル1、2のチェックをON、ループを出る
テーブル1の次のレコードで外のループ繰り返し
この回答への補足
CHRONOS_0さん回答ありがとうございます。
アクセスでVBAは使ったことがないのですが考え方は分かりました。
やはりVBAを学ばなければならないみたいですね。
こういう処理をするのに参考なるお勧め本があれば教えて下さい。
自分で探せよと言われそうですが。少し勉強してみます。解決するまで時間がかかりそうですがとりあえずお礼まで。
的確なアドバイスのおかげでなんとか目的に達しました。
VBAの勉強に時間がかかりお礼が遅くなりました。
付け焼刃のVBAなので動くいて目的通りになるのだけれども
試行錯誤でやっているので自分の書いたコードでもどう動作しているのか分かりませんが(^_^;)
これから解読していきます。どうもありがとうございました。
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));
貸し出しワークテーブルから貸し出し履歴テーブル書き込む場合は、二重貸し出しにならないようなチェック用のクエリーが必要でしょう。
丁寧な回答ありがとうございます。
質問の件は解決しました。fuuten_no_nekoさんには色々なアドバイス勉強になりました。ただ私のVBAの理解力がないため把握しきっていません。
これから知識がついていけばアドバイスを生かせることができるようになると思います。本当にありがとうございました。
No.7
- 回答日時:
#1、#6です。
既にこのようにされている部分もあるかもしれませんがテーブルは
1.品物(?)台帳
品物ID、品名、料金、購入日、etc.
2.得意先台帳
得意先ID、会社名、電話、住所、etc.
3.貸し出し履歴
品物ID、得意先ID、数量、貸出日、返却日
このようにすれば、貸出日があり返却日がないものが貸し出し中とわかります。貸出先から別の得意先に転送された場合の処理もできるでしょう。さらに品物の貸し出し履歴や、得意先ごとの貸し出し日数、料金の計算など、色々役立つと思いますが。
この回答への補足
回答 ありがとうございます。
貸出日はスキャナで取り込んだ時につけています。返却日はチェックをいれたときに自動でつくようにしています。料金はこの段階では発生しないので必要はありません。得意先台帳は用意してありますが名前だけ分かれば十分なので関連づけしていません。名前はハンディスキャナに入れてあります。貸出履歴や貸出日数は分かれば便利ですね。次の段階で考えます。
No.6
- 回答日時:
#1です。
一連の回答と補足を読んでいると、テーブル設計、あるいはそれ以前の業務分析(?)に問題や誤解があり、処理をいたずらに複雑化しているように感じられます。・どのようなデータを
・いかに処理し
・何を結果として求めたいのか
補足されては如何でしょうか?意外に簡単な処理で済むかもしれません。
この回答への補足
回答ありがとうございます。
的確な説明できなくて申し訳ありません。
テーブル1は商品を得意先に貸出したものを入れています。
これをフォームに表示して返却されたものにチェックを付けていました。
次にフォームを表示したときチェックされたもの以外を表示することにより現在の貸出しているものを把握する為です。
商品は貸出先から直接返却されるときもあれば貸出先から別の得意先に転送されることもあるので返却してきた得意先と貸出先が違っている場合もあります。
貸出商品はバーコードをスキャナで読み取りそれをアクセスに取り込むことにしました。貸出先が別の得意先に転送した明細を知らせてきた場合は転送処理をしています。
一応以上の形で完成としていたのですがやはり商品数が多くなってくると目で確認しながチェックしていくのは効率が悪いと思い返却商品をテーブル2に取り込み自動に消しこみをしたいと考えました。それで得意先、品番、数量が同じものがあればチェックをつけるとしました。
テーブル1にチェックがついているものが返却されたもの。ついていないのが貸し出しているもの。
テーブル2でチェックがついてないものは返却されているが商品の数量や得意先が違っているため返却処理が出来ないものになります。
とりあえずここまでの処理をしようとして質問しました。
これから先はテーブル2でチェックがついていない品番を選択しテーブル1のチェックのついていない同品番を検索して数量違いなのか得意先違いなのか判断し数量が分散されて入力したものは返却処理、得意先の違うものは転送処理及び返却処理をしテーブル1に同品番がなければ貸出した商品以外のものが返却されたものと判断する。というのが最終目的なのですが一度に質問しても私が理解できないと思い最初の質問となりました。
テーブルの設計など最初から自動消し込みを考えていた訳でなくまず自分の分かる範囲で作りその後こうなったらいいなと継ぎ足していき分からないことを調べたり聞いたりして作っているので無駄なこともある設計になっているのかも知れませんが自分ではよく分からないのです。何度かこういったものを作っていくうちに理解できるようになればいいなと思っています。
今までの回答で自分のなかではスッキリしているのですが(実際に解決している訳ではありません。(^_^;))何か根本的に考え方の間違いや無駄な処理をしているのでしょうか?アクセスというよりデータベースのアプリは初めてで参考書やネットの独学なのでとんちんかんなことを質問しているかもしれませんがお許しを。
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 レ
この回答への補足
すみません。理解度が足りなくてよく分かりません。
もう少し整理してみます。分かり易くする為日付を加えました。
まず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様の一意の意味は分かるのですがどうすればよいの分かりません。もう少し考えてみます。
No.3
- 回答日時:
それぞれにオートナンバーな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 レ
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- その他(データベース) Microsoft Accessについて 1 2022/06/06 16:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- JavaScript テーブルの中のセレクトボックスの値が0のとき、非表示にしたい 3 2022/05/29 10:13
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessクエリでの、LIKE条件
-
ACCESSに同時アクセス(編集)を...
-
Accessの追加クエリで既存のテ...
-
パススルークエリをテーブル作...
-
時間の足し算
-
デザインビューで、連結式 を...
-
2つのテーブルを比較して一致し...
-
INSERT時にデータ登録とmaxの発...
-
ツリー構造をRDBで表現するには?
-
Accessでvlookupみたいなことは...
-
テーブルを、たとえそれが存在...
-
Accessレコードの追加や変更が...
-
3つの表を1つに縦に連結する
-
SQLで条件指定結合をしたいがNU...
-
SQLで日付を条件に削除したい
-
リンクテーブルを CopyObject ...
-
フォームの計算がテーブルに反...
-
ACCESSで同じテーブルに...
-
ACCESS2000での円グラフ作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessレコードの追加や変更が...
-
ACCESSに同時アクセス(編集)を...
-
access テーブル内のレコード...
-
3つの表を1つに縦に連結する
-
Accessでvlookupみたいなことは...
-
Accessの追加クエリで既存のテ...
-
Accessクエリでの、LIKE条件
-
Accessでテーブルからテーブル...
-
ツリー構造をRDBで表現するには?
-
デザインビューで、連結式 を...
-
ACCESSで指定されたテーブルか...
-
2つのテーブルを比較して一致し...
-
リンクテーブルを CopyObject ...
-
SQLで日付を条件に削除したい
-
SQLで条件指定結合をしたいがNU...
-
時間の足し算
-
パススルークエリをテーブル作...
-
ODBCで接続するとDBに変更/追加...
-
INSERT時にデータ登録とmaxの発...
おすすめ情報