• 締切済み

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テーブル(複数)のリレーションを組むところに使っておるのですが、 きちんとプログラムが動いてくれずに悩んでおります。 どのようなプログラムを組んだほうがいいでしょうか? (私が組んだプログラムは追記させて頂きます。)

  • pep1
  • お礼率22% (2/9)

みんなの回答

  • 11n_kacie
  • ベストアンサー率42% (21/50)
回答No.3

やはり、DBの構造がおかしいと思います。 何を目的としたDBかわからないので、ベストな構造かどうかはわかりませ んが、例として以下の構造が考えられます。 まずCテーブルが複数あるのは変です。「営業所」は1つのエンティティ として考えられますが、各営業所それぞれがエンティティとはなりません。 「営業所」テーブルを作成し、1レコードで1営業所にすべきでしょう。 またA、Bテーブルですがこれは1対1の関係なので、「住所」テー ブルとして1つにします。 Dテーブルは「都道府県」テーブルとします。 各テーブル間のリレーションは以下の通りです    「営業所」→「住所」←「都道府県」 だいたいこんな感じになるんじゃないかと思います。 ただしこれではマスタだけのDBになるので、参照するだけですけど。 また、クエリも1つで十分です。抽出条件だけ変えればいいので。

  • 11n_kacie
  • ベストアンサー率42% (21/50)
回答No.2

申し訳ありません、やっぱりわかりません……。 どのようなDBで、何を行いたいのかいまひとつはっきり見えません。 失礼ですが、ER図あるいは概念データモデルはご存知でしょうか? できればそのような形で、テーブル名を「A」「B」等ではなく、 エンティティ名で表現していただけるとわかりやすいのですが……。 また、このVBAサブルーチンはどのような場面で呼び出されるもの なのでしょうか?そしてどのような不具合が発生しますか? わざわざ再度のご説明をいただいたにもかかわらず、 このような返答になりまして、大変申し訳ございません。

pep1
質問者

補足

説明が足らずに申し分けございません。 【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) お手数おかけし申し訳ございませんが、宜しくお願い致します。

  • 11n_kacie
  • ベストアンサー率42% (21/50)
回答No.1

まず最初にデータベース設計を見直すべきではないでしょうか。 ご質問を拝見しましても、当方の解釈が間違っているのか、 どのような構造なのかよく把握できませんでした。 とりあえず「テーブルA:テーブルB:テーブルC=1:1:n」と仰られているのに、 テーブルA、B間にリレーションが存在するというのはおかしいように思えます。 また、ご記載のテーブルCのフィールド構成ではテーブルA及びBに対して1対多には ならないと思われます。

pep1
質問者

補足

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 何回も申し訳ございませんが、宜しくお願い致します。

関連するQ&A

  • Access2002のリレーションについて。

    販売管理のデータベースを作成しています。 『販売店マスターテーブル』 販売店コード(主キー) 販売店名 郵便番号 住所 電話番号 営業担当者コード 『営業担当者テーブル』 営業担当者コード(主キー) 営業担当者名 『販売伝票テーブル』 伝票番号(主キー) 売上日 販売店コード この中で、『販売店マスターテーブル』から、販売店コード,販売店名,郵便番号,住所,電話番号,営業担当者コードを、 『営業担当者テーブル』から、営業担当者名を使って、新しいクエリを作成しました。 そのクエリを基にフォームを作成しましたが、フォームに新規レコードを入力できません。 念のため、販売店コードを『販売伝票テーブル』からとってきたら、新規レコードが入力できるようになりました。 これは、何か主キーの関係で入力できないんでしょうか。 もし、『販売伝票テーブル』から販売店コードをとらなくちゃいけないとしたら、それはナゼでしょうか・・。 初歩的なことで申し訳ありませんが、とても困っています。 どなたかお分かりになる方、教えて下さい。 よろしくお願いします。

  • エクセルマクロで住所を比較しコードを代入したい

    エクセル2003を使っています。 シート1に  A列にコード  B列に都道府県名  C列に市区町村名 の表があります。 シート2は  B列に住所 が入っています。 このシート2の住所とシート1の都道府県名と市区町村名をマッチングさせて シート1のコードをシート2のC列に代入したいのですが マクロを使ってやりたいのですがどうしたらよいでしょうか? よろしくお願いします。

  • 【Access】住所を分割して抽出したい

    Accessで住所から都道府県と市区町村を抽出 はじめまして、Access初心者です。 右も左もわかっていないので 質問がおかしかったら申し訳ございません。 Accessのクエリを使って 住所録テーブルのデータにある住所から 都道府県、市区町村、それ以降 で分けて表示したいと思っています。 元のデータは、都道府県名が入っていないものや、都道府県名から始まっていない物、そもそも入力されていないものもあります。 都道府県一覧のテーブル(テーブル名: T_都道府県)と 市区町村一覧のテーブル(テーブル名: T_市区町村) は準備しました。 色々調べたのですが、Access不慣れな為 正しい式が書けておりません。 現在はサブクエリに 都道府県:(select[都道府県名] from T_都道府県 where [住所] like [都道府県名]&"*") 市区町村:(select[市区町村名] from T_市区町村 where [住所] like "*"& [市区町村名]&"*") それ以降:Replace (Nz([住所]," "),Nz([都道府県]," "),Nz([市区町村]," ")," ") と入力して実行したら このサブクエリでは1つのレコードしか返せません。 のエラーが出てしまいました。 (ですよね、、、) 都道府県と市区町村のテーブルを利用して どう直せば、うまく表示ができるのか わかる方教えていただけると幸いです。 どうか、よろしくお願いいたします。

  • アクセスのクエリについて

    アクセスのクエリにおいて   店コード、店名  変更日付  備考 1     A店  2004/1/1   2      B店  2004/2/1 3      C店  2004/5/1 1      A店  2005/12/17 2      B店  2005/11/1 3      C店  2005/10/1 上記のようなクエリで店名A店B店C店それぞれの最新の日付を抽出したいのですがわかりません。 ご回答よろしくお願い致します。

  • Access #エラーについて

    Access初心者です。 よろしくお願いいたします。 [前提]  テーブルA のIDに紐づけてクエリBの数値をクエリCで反映させたい。  〈詳細データ〉   ・テーブルA    [ID] [名称]       1   あ     2   い     3   う     4   え     5   お   ・クエリB    [ID] [数値]     2   10     3   20     5   40   ・クエリC    [ID]  [名称] [数値]     1    あ  #エラー     2    い   10     3    う    20     4    え  #エラー     5    お   40   ・”テーブルAの[ID]”の全レコードと”クエリBの[ID]”の同じ結合フィールドだけを含めてリレーションを行っている。    ・クエリCの算式: IIf(IsError([クエリB].[数値]),0,[クエリB].[数値])  [質問]    ・クエリCの『#エラー』部分を0にしたいのですが、何か良い方法はございませんでしょうか。   ・そもそも上記のロジックは無理がありますでしょうか。    アクセスはあまりいじったことがございません。ご回答いただけますと幸いです。   よろしくお願いいたします。

  • Accessの入力設定を自動にしたい

    Access97を使っています。 テーブルA 店舗ID 店舗名(全て、閉店した店も含む) テーブルB 店舗ID 店舗名(全て、閉店した店も含む) 商品番号 商品名 クエリC(選択クエリ) 店舗ID 店舗名(営業している店のみ) 商品番号 商品名 フォームD 店舗ID 店舗名 商品番号 商品名  フォームDから新しくオープンするお店の入力を行いたいのですが、店舗IDを入れるとテーブルAから自動的に店名がフォームDに入力され、入力した内容はクエリCに反映するような設定はどうなるのでしょうか?  テーブルBからクエリCを抽出しています。今日一日考えているのですが、頭がパニックって来ました。 よろしくお願いします。

  • ACCESSのテーブル結合に関して

    初歩的な事で申し訳ありませんが、教えて下さい。 以下のように3つのテーブルが存在し、検索条件をBテーブルの仕入先コードが"AAA"と 指定した際に、 発注番号、発注日付、仕入先コード、仕入先名 という形でOUTPUTしようと考えています。 その場合、クエリではどのように結合すれば良いでしょうか。。。 Aテーブルの発注番号とBテーブルの発注番号、Bテーブルの仕入先コードとCテーブルの 仕入先名という結合の形では、条件の"AAA"が1件しかないにもかかわらず、複数件出力されて しまうかと思われます。 《テーブル内容》 Aテーブル 発注番号 発注日付 Bテーブル 発注番号 仕入先コード Cテーブル 仕入先コード 仕入先名 ※ Bテーブル、Cテーブルの仕入先コード"AAA"は、それぞれ1件ずつしかない。 教えて頂きたいと思います。

  • アクセス テーブル、クエリーについて

     アクセスでソフト作成中です。そこで教えてほしいことがあります。 たとえば下記のように2つのテーブルがあります。 テーブル1   テーブル2   フィールドA    フィールドB  a1       10  b1       20  c1       30          テーブル1の数値は固定します。そこで下記のようなクエリーを作成したいのです。 クエリー1 フィールドA フィールドB a1 10 b1 20 c1 30 テーブル2に数字を入れていくと テーブル1   テーブル2   フィールドA    フィールドB  a1       10  b1       20  c1       30           40 クエリー1 フィールドA フィールドB a1 40 b1 20 c1 30 このように数字が上書きされていくようなクエリーは作成できないでしょうか。(あくまでテーブル1の数値は固定、フィールドAとフィールドBにリレーションシップは設定されていない。) よろしくおねがいします。

  • アクセスについて

     *テーブルB    *テーブルA      店番←------販売店番号       店名       商品番号                 販売金額    *テーブルC             商品番号----→商品番号            詳細       商品名            販売日      手数料 リレションシップをしております。 クエリA 店名-商品番号-販売金額-商品名-詳細-手数料金額-販売日 といったクエリをつくりました。 ---------OKウェーブさんからの回答--------------- 「商品」テーブルに 店名 - 商品 - 金額 A店 - 宝石 - 1000 B店 - 時計 - 2000 A店 - 宝石 - 3000 B店 - バック - 4000 ・・・ と格納されているとします で、これらを集計する為に使用するものは、選択クエリ(集計)を使用します 下記にクエリのSQL文を記述します SELECT 商品.店名, Sum(IIf([商品名]="宝石",[金額],0)) AS 宝石合計, Sum(IIf([商品名]="その他",[金額],0)) AS その他合計, Sum(商品.金額) AS 合計, Sum(IIf([商品名]="バック",[金額],IIf([商品名]="時計",[金額],0))) AS 合計A, Sum(IIf([商品名]="その他",[金額],IIf([商品名]="宝石",[金額],0))) AS 合計B FROM 商品 GROUP BY 商品.店名 ORDER BY 商品.店名; ------------------------------------------------- どこの画面でSQL文を記述すえばよろしいのでしょうか。 どこかわかりやすいHPはないでしょうか お願いします。

  • アクセスでの組み合わせ

    テーブルAには学校名、学校コードが入っていて、都道府県名を挿入したいと思っています。 学校コード5桁のうち3桁目、4桁目で都道府県を識別しています。 この場合、どのようにして都道府県名を挿入すると簡単にできるのでしょうか。 [学校名]  [学校コード] 〇×高校   311001 ▲□高校   512003 ◎◎◎高校  611130 ◇◆高校   011222 *11**は東京都、*12**は神奈川県・・・といった具合です。 都道府県名の横に、*11**や、*12**を入力したテーブルは作ってみたのですが・・・。 クエリで上手に組み合わせる方法を教えて下さい。

専門家に質問してみよう