- ベストアンサー
アクセス2003で、分岐処理ができないのですが…
(マイクロソフト ACCESS2003) アクセス初心者です。 テーブルAから新しいテーブルXを作成します。 このとき、テーブルAの会員NOで、テーブルBの会員NOを参照して テーブルBの会員NOのニックネームを設定しますが、 テーブルBに会員NOがないときは、「ゲスト」と設定します。 上記の処理が、うまくできません。 VBAの知識がないとできないのでしょうか? どなたか、教えていただけませんか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
まず、基本的な発想を切り替えた方がよいと思われます。 データベースにおいては、 ・必要な最低限のデータをテーブルに保存する。 ・テーブルのデータを組み合わせたり計算したり集計したりというのは、全部クエリーで構成する。 というのが、基本です。 例えば、商品に単価があり、注文に数量がある。データベースの世界では、注文票の合計金額はテーブルに保存しません。 これには、理由があります。もし、各注文票の合計金額も計算してテーブルに保管したとします。もし、商品の単価表が改訂されたら・・・もし、注文票の数量が訂正されたら・・・もちろん、合計金額も訂正する必要があります。訂正を忘れたら・・・当然、困りますね。間違った注文票が出力されることになります。 これをデータの整合性と言います。データベースの世界では一番重要視される項目の一つです。これを維持することを目標にいろいろな仕掛けが用意されているのです。 基本的には、「何かのデータを更新しようとすると、それに連動して他のフィールドやテーブルのデータも修正しないといけない」という事態は嫌われます。 (あくまで、基本です。実際には、処理能力が追いつかないとか、いろいろな理由で基本を外れることは往々にしてあります。) さて、これをあなたの質問に適用してみましょう。 なぜ、Xテーブルを作ろうとするのですか?AテーブルとBテーブルのデータがあれば、演算だけで、Xテーブルは作成できるんですよね? 基本としては、Xテーブルは作るべきではありません。 この様なときのために、クエリーという機構が存在します。 新しいクエリーを作成し、テーブルAとテーブルBを会員No.で結合します。このとき、Aテーブルのデータはすべて出力する用に、結合関係を設定してください。 この状態だと、結果のクエリーで、Bテーブルに存在しない会員のニックネームは、NULLとなっているはずです。 ニックネームの欄のフィールドには、次の式を入力します。 IIf(IsNull([ニックネーム]),"ゲスト",[ニックネーム]) これで、このクエリーを実行すれば、ご要望の表は出力できます。ちなみに、このクエリーですが、テーブルにできることは、大概のことは実行することができます。このクエリーをテーブルに見立てて、クエリーの一部として検索条件を設定することもできますし、レポートの出力の基礎とすることもできます。 また、テーブルAの更新もこのクエリーから実行できます。 残念ながらテーブルBの更新だけはできません。これを許すとデータが矛盾するからです。 データのエクスポートもできますし、エクセルなどからもテーブルと同じようにインポートすることもできます。 これで、いかがでしょうか。 クエリーの機能は、実に多彩で、これを使いこなせば、データ処理の大半においては、ほとんどVBAのお世話になることはないレベルまでの処理が可能です。VBAに手を出す前に、まずこの機能をちょっと勉強してみてください。
その他の回答 (1)
- CHRONOS_0
- ベストアンサー率54% (457/838)
どうしてテーブルにする必要があるのですか? クエリで十分だと思いますけど それに分岐処理ってVBAでやろうとしているの? >テーブルAの会員NOで、テーブルBの会員NOを参照して こういう関係のテーブルがあるとき 会員として会員テーブルに登録するまでも無い人を登録したいというケースがあるのなら 特殊な会員Noで[ゲスト]というのを登録しておきます これでテーブルのリレーションシップ、参照整合性なども問題なく設定できるようになります
お礼
説明、ありがとうございます。 テーブルXを作る理由は、システムがAccess→Oracleに移行するために 新システムのテーブルにデータを加工しなければいけなくて、 何かいい方法はないかなと思って質問させていただきました。 とにかく移行プログラム(クエリ)を作らなければならないので、 CHRONOS_0さんの方法で試してみます。 ありがとうございました。
お礼
ていねいな説明、ありがとうございます。 テーブルXを作る理由は、システムがAccess→Oracleに移行するために 新システムのテーブルにデータを加工しなければいけなくて、 何かいい方法はないかなと思って質問させていただきました。 とにかく移行プログラム(クエリ)を作らなければならないので、 mitonekoさんの方法で試してみます。 ありがとうございました。