- 締切済み
ACCESS2000でSQLのループがうまくいかない
ACCESS2000のVBAを使ってプログラムを組んでおります。 テーブル・クエリの構成等は以下のようになることが目的です。 【テーブルA】:全国営業所住所情報 1.新住所コード(数値) 2.都道府県名(テキスト) 3.漢字市区町村名(テキスト) 4.営業所が管轄している代理店名(テキスト):列名「代理店名」 【テーブルB】:営業所設立情報 1.新住所コード(数値) 2.都道府県名(テキスト) 3.漢字市区町村名(テキスト) 4.営業所設立年月(テキスト) 【テーブルC】:各営業所売上情報 1.新住所コード(数値) 2.営業所番号(テキスト) 3.商品の売上個数(数値) 【テーブルD】:メンテ用~上記、ABCを使ったクエリをVBAで作成するときにプログラムの中で参照するテーブル。 1都道府県名(テキスト) 2都道府県名グループ番号(テキスト):列名は「式1」でグループ番号は1から9まで 3各営業所名(テキスト) *テーブルの関係は テーブルA:テーブルB:テーブルC=1:1:n。 各テーブルには「新住所コード」という共通のKEYを持っており、下記のようなリレーションシップがあります。 ●Aテーブル→Bテーブル→Cテーブル →C'テーブル →C''テーブル (→は「LEFT JOIN」の意) ループは、BテーブルとCテーブル(複数)のリレーションを組むところに使っておるのですが、 きちんとプログラムが動いてくれずに悩んでおります。 どのようなプログラムを組んだほうがいいでしょうか? (私が組んだプログラムは追記させて頂きます。)
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 11n_kacie
- ベストアンサー率42% (21/50)
やはり、DBの構造がおかしいと思います。 何を目的としたDBかわからないので、ベストな構造かどうかはわかりませ んが、例として以下の構造が考えられます。 まずCテーブルが複数あるのは変です。「営業所」は1つのエンティティ として考えられますが、各営業所それぞれがエンティティとはなりません。 「営業所」テーブルを作成し、1レコードで1営業所にすべきでしょう。 またA、Bテーブルですがこれは1対1の関係なので、「住所」テー ブルとして1つにします。 Dテーブルは「都道府県」テーブルとします。 各テーブル間のリレーションは以下の通りです 「営業所」→「住所」←「都道府県」 だいたいこんな感じになるんじゃないかと思います。 ただしこれではマスタだけのDBになるので、参照するだけですけど。 また、クエリも1つで十分です。抽出条件だけ変えればいいので。
- 11n_kacie
- ベストアンサー率42% (21/50)
申し訳ありません、やっぱりわかりません……。 どのようなDBで、何を行いたいのかいまひとつはっきり見えません。 失礼ですが、ER図あるいは概念データモデルはご存知でしょうか? できればそのような形で、テーブル名を「A」「B」等ではなく、 エンティティ名で表現していただけるとわかりやすいのですが……。 また、このVBAサブルーチンはどのような場面で呼び出されるもの なのでしょうか?そしてどのような不具合が発生しますか? わざわざ再度のご説明をいただいたにもかかわらず、 このような返答になりまして、大変申し訳ございません。
- 11n_kacie
- ベストアンサー率42% (21/50)
まず最初にデータベース設計を見直すべきではないでしょうか。 ご質問を拝見しましても、当方の解釈が間違っているのか、 どのような構造なのかよく把握できませんでした。 とりあえず「テーブルA:テーブルB:テーブルC=1:1:n」と仰られているのに、 テーブルA、B間にリレーションが存在するというのはおかしいように思えます。 また、ご記載のテーブルCのフィールド構成ではテーブルA及びBに対して1対多には ならないと思われます。
補足
11n_kacie様のおっしゃる通りです。違うデータベースを見ながら書いてしまっていたことによる 私の表現の間違いです。大変申し訳ございませんでした。 正しくは・・ 【Aテーブル】:現在の首都圏の住所コード(郵便番号のようなコード)に対する、各営業所の売上の商圏範囲の設定。 【Bテーブル】:現在の住所コードの正式名称とその名称に変わった年月の設定。 (たとえば、さいたま市→2003/05施行のような事柄。) 【Cテーブル】:営業所の店番号とその新住所コード、営業店での商品の売上数 でございます。 私はちなみにこのようなロジックを組んだのですが・・。 Sub GroupQuery() Dim myDB As Database, myQdf As QueryDef Dim mySQL As String Dim myRS As DAO.Recordset Dim i As String Dim j As String Dim myQryName As Variant Dim max As String On Error GoTo QueryDeL Set myRS = CurrentDb.OpenRecordset("メンテ用") myRS.MoveFirst i = myRS!式1 Do mySQL = "SELECT Aテーブル.新住所コード, Aテーブル.漢字都道府県名, Aテーブル.漢字市区郡町村名, Aテーブル.商圏1" & _ " FROM (Aテーブル LEFT JOIN Bテーブル ON Aテーブル.新住所コード = Bテーブル.新住所コード)" & _ " LEFT JOIN myRS!商圏1 ON 首都圏住所一覧.新住所コード = myRS!商圏1.町字住所コード" myRS.MoveNext Loop Until myRS!式1 = 2 Set myDB = CurrentDb myRS.MovePrevious Set myQryName = myRS!漢字都道府県名 Set myQdf = myDB.CreateQueryDef(myQryName, mySQL) Exit Sub QueryDeL: DoCmd.DeleteObject acQuery, myQryName Resume End Sub 何回も申し訳ございませんが、宜しくお願い致します。
補足
説明が足らずに申し分けございません。 【ER図・・のようなもの】 Aテーブル・・日本全国の住所コード(当社規定)に対する当社の担当営業所の割り振り(EX.さいたま市大宮駅周辺のコードはさいたま営業所担当・・といった感じ) Bテーブル・・住所コードの正式な住所の名称とその住所が施行された年月(EX.さいたま市大宮区は2003年5月施行などの情報) C1テーブル~Cnテーブル・・各営業所の情報(EX.これは営業所ごとに1テーブルとなっているので、Cテーブルは複数あります) Dテーブル・・これは「メンテ用」テーブルで、クエリを作るときにプログラムが見にいくテーブル。 たとえば、「埼玉県」のクエリをつくるときに、Cテーブルにはどの営業所をもってくるかという情報を見にいくようにしています。 → C1テーブル ● Aテーブル → Bテーブル → C2テーブル *矢印はすべてリレーションで「LEFT JOIN」をあらわしています。 → ・・ → Cnテーブル またDテーブルの中身は以下のようなものです。 都道府県名 グループ番号 営業所名 埼玉県 1 大宮 埼玉県 1 草加 埼玉県 1 蕨 : : : 東京都 2 目黒 東京都 2 新宿 東京都 2 市谷 : : : このサブルーチンは、「都道府県別のクエリを一括で作成する」為に呼び出すものになります。 たとえば、埼玉県に含まれる営業所がすべて上記「Cテーブル」になりますので、 Aテーブル → Bテーブル → 大宮 → 草加 → 蕨 : : となります。 どうやら、下記の部分でプログラムがストップしてしまっているようなのです。 Set myQdf = myDB.CreateQueryDef(myQryName, mySQL) お手数おかけし申し訳ございませんが、宜しくお願い致します。