DataAdapterのSELECT句に変数を使いたい

このQ&Aのポイント
  • Access2000とVB.NET2003で作ったアプリを手直ししています。アクセスのテーブルから読み込んでいたデータをアクセスクエリーで作ったビューから読み込むようにしたいと思っています。
  • データアダプタのSELECT文で日付の比較をするため、日付を変数に格納して対処したいと考えています。しかし、式1で変数を扱うことができず、エラーが起こる状況です。
  • VB.NETのバージョンに関わらず同じエラーが発生しているため、解決策を模索しています。どのように対処すれば良いかヒントを頂けませんか?
回答を見る
  • ベストアンサー

DataAdapterのSELECT句に変数を使いたい

いつもお世話になっています。 Access2000とVB.NET2003で作ったアプリを今手直ししています。 これまでアクセスのテーブルから読み込んでいたものを、アクセスクエリーで作ったビューから 読み込むようにしたいと思っています。 データアダプタのSELECT文は   SELECT 項目A, 項目B, 式1, 式2, 式3 FROM  ビュー という感じです。 この式には 1日~10日・・式1 11日~21日・・式2  21日~末日・・式3 という風に アクセスの中では明示的に #2008/10/01# とか書いています。 しかし月が替わったりすると毎回書き換えなければなりません。 このため日付を変数に格納して対処したいと思っているのですが、SELECT 式1 では変数で 扱いようがなく、式1の本文を強制的に書いてやっても、日付の比較のところでエラーが起こって しまいます。(>等を理解できていない内容のエラー) VBは2003,2005,2008でそれぞれトライ中ですが、今のところ結果は皆同じでNGです。 こういう場合、どういう風に考えればいいのでしょうか? ヒントをよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • _rainman
  • ベストアンサー率84% (11/13)
回答No.2

SQLの問題なのでしょうか? そうであれば参考にしてください。(但し、SQLはSQLServerです) もう少し具体的な内容がわかれば又助言させて頂きます。 ■データ テーブル名[テーブル] [店舗コード] [売上日付] [売上金額] 001     2008-09-01 1000 001     2008-09-10 2000 001     2008-09-11 3000 001     2008-09-20 4000 001     2008-09-21 5000 001     2008-09-30 6000 001     2008-10-01 7000 001     2008-10-10 8000 001     2008-10-11 9000 001     2008-10-20 10000 001     2008-10-21 11000 001     2008-10-31 12000 ■SQL文 SELECT 店舗コード, 売上年月, SUM(DAY01_10) AS [1日~10日], SUM(DAY11_20) AS [11日~20日], SUM(DAY21_31) AS [21日~末日] FROM (     SELECT     店舗コード,     (年 + '/' + 月) AS 売上年月,     CASE WHEN 日 BETWEEN 1 AND 10 THEN 売上金額 END AS DAY01_10,     CASE WHEN 日 BETWEEN 11 AND 20 THEN 売上金額 END AS DAY11_20,     CASE WHEN 日 BETWEEN 21 AND 31 THEN 売上金額 END AS DAY21_31     FROM (         SELECT         店舗コード,         DATENAME(year,売上日付) AS 年,         DATENAME(month,売上日付) AS 月,         CONVERT(int,DATENAME(day,売上日付)) AS 日,         売上金額         FROM テーブル     ) AS T ) AS T1 GROUP BY 店舗コード,売上年月 ■結果 [店舗コード] [売上年月] [1日~10日] [11日~20日] [21日~末日] 001     2008/09  3000     7000    11000 001     2008/10  15000    19000    23000

danchor
質問者

お礼

ご回答有り難うございます。 まとめレスで失礼します。 以下の日付の部分を変数化すべく悩んでいたのですが、自己解決しました。 SELECT (前略  セレクト項目たくさんあり) SUM(IIf(([入出庫データ].[IODATE] >= #10/1/2008# AND [入出庫データ].[IODATE] < #11/1/2008#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[KOSUU] * Val([入出庫データ].[IOKUBUN_ID]), 0)) AS 入庫個数, round(SUM(IIf(([入出庫データ].[IODATE] >= #10/1/2008# AND [入出庫データ].[IODATE] < #11/1/2008#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[WEIGHT] * Val([入出庫データ].[IOKUBUN_ID]), 0) * 10), 0) / 10 AS 入庫数量,  (後略) 要はクエリビルダ内のペインでのみエラーが起こり、SQLのせいではなかった ことがわかり以下のように記述後正常に動作しています。 (セレクトコマンドテキストに記述してある箇所なのでダブルクォーテーションは無視してください) いろいろ説明不足のところご教示いただきまして有り難うございました。 SELECT (前略) SUM(IIf(([入出庫データ].[IODATE] >= #" & datestart & "# AND [入出庫データ].[IODATE] < #" & datenext & "#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[KOSUU] * Val([入出庫データ].[IOKUBUN_ID]), 0)) AS 入庫個数, round(SUM(IIf(([入出庫データ].[IODATE] >= #" & datestart & "# AND [入出庫データ].[IODATE] < #" & datenext & "#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[WEIGHT] * Val([入出庫データ].[IOKUBUN_ID]), 0) * 10), 0) / 10 AS 入庫数量, (後略) もっと簡単な方法等があれば、あるいはこのやり方に不適切なところがあれば引き続きご指摘 いただけないでしょうか。 よろしくお願いいたします。

その他の回答 (2)

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.3

>これまでアクセスのテーブルから読み込んでいたものを、アクセスクエリーで作ったビューから読み込むようにしたいと思っています。 何のためにvbを使っているのでしょうか? ADOなどを使ってMDBにSQLにて取得したほうが良いと思います。

danchor
質問者

お礼

ご回答有り難うございます。 まとめレスで失礼します。 以下の日付の部分を変数化すべく悩んでいたのですが、自己解決しました。 SELECT (前略  セレクト項目たくさんあり) SUM(IIf(([入出庫データ].[IODATE] >= #10/1/2008# AND [入出庫データ].[IODATE] < #11/1/2008#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[KOSUU] * Val([入出庫データ].[IOKUBUN_ID]), 0)) AS 入庫個数, round(SUM(IIf(([入出庫データ].[IODATE] >= #10/1/2008# AND [入出庫データ].[IODATE] < #11/1/2008#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[WEIGHT] * Val([入出庫データ].[IOKUBUN_ID]), 0) * 10), 0) / 10 AS 入庫数量,  (後略) 要はクエリビルダ内のペインでのみエラーが起こり、SQLのせいではなかった ことがわかり以下のように記述後正常に動作しています。 (セレクトコマンドテキストに記述してある箇所なのでダブルクォーテーションは無視してください) いろいろ説明不足のところご教示いただきまして有り難うございました。 SELECT (前略) SUM(IIf(([入出庫データ].[IODATE] >= #" & datestart & "# AND [入出庫データ].[IODATE] < #" & datenext & "#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[KOSUU] * Val([入出庫データ].[IOKUBUN_ID]), 0)) AS 入庫個数, round(SUM(IIf(([入出庫データ].[IODATE] >= #" & datestart & "# AND [入出庫データ].[IODATE] < #" & datenext & "#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[WEIGHT] * Val([入出庫データ].[IOKUBUN_ID]), 0) * 10), 0) / 10 AS 入庫数量, (後略) もっと簡単な方法等があれば、あるいはこのやり方に不適切なところがあれば引き続きご指摘 いただけないでしょうか。 よろしくお願いいたします。

  • miyuyu
  • ベストアンサー率61% (30/49)
回答No.1

こんにちは 式1~3はフィールドの別名を表示したいのでしょうか。 でしたら As を使えばよいと思います。 が、月によって表示が変わるのであれば 表示側(Form)のタイトルだけ変更して、データはフィールド名そのままで持ってくるのもアリかと思います。 >この式には 1日~10日・・式1 11日~21日・・式2  21日~末日・・式3 という風に >アクセスの中では明示的に #2008/10/01# とか書いています。 この辺の意味が、よく判りません。 WHERE句が、#2008/10/01# と言う事でしょうか。 もう少し説明がほしいところです。

danchor
質問者

お礼

ご回答有り難うございます。 まとめレスで失礼します。 以下の日付の部分を変数化すべく悩んでいたのですが、自己解決しました。 SELECT (前略  セレクト項目たくさんあり) SUM(IIf(([入出庫データ].[IODATE] >= #10/1/2008# AND [入出庫データ].[IODATE] < #11/1/2008#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[KOSUU] * Val([入出庫データ].[IOKUBUN_ID]), 0)) AS 入庫個数, round(SUM(IIf(([入出庫データ].[IODATE] >= #10/1/2008# AND [入出庫データ].[IODATE] < #11/1/2008#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[WEIGHT] * Val([入出庫データ].[IOKUBUN_ID]), 0) * 10), 0) / 10 AS 入庫数量,  (後略) 要はクエリビルダ内のペインでのみエラーが起こり、SQLのせいではなかった ことがわかり以下のように記述後正常に動作しています。 (セレクトコマンドテキストに記述してある箇所なのでダブルクォーテーションは無視してください) いろいろ説明不足のところご教示いただきまして有り難うございました。 SELECT (前略) SUM(IIf(([入出庫データ].[IODATE] >= #" & datestart & "# AND [入出庫データ].[IODATE] < #" & datenext & "#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[KOSUU] * Val([入出庫データ].[IOKUBUN_ID]), 0)) AS 入庫個数, round(SUM(IIf(([入出庫データ].[IODATE] >= #" & datestart & "# AND [入出庫データ].[IODATE] < #" & datenext & "#) AND [入出庫データ].[IOKUBUN_ID] = '1', [入出庫データ].[WEIGHT] * Val([入出庫データ].[IOKUBUN_ID]), 0) * 10), 0) / 10 AS 入庫数量, (後略) もっと簡単な方法等があれば、あるいはこのやり方に不適切なところがあれば引き続きご指摘 いただけないでしょうか。 よろしくお願いいたします。

関連するQ&A

  • select文の戻り値を変数に格納したい。

    select文の戻り値を変数に格納したい。 アクセスの選択クエリで以下の様なクエリをつくる。 select count(管理no) from 割り当てテーブル where 管理no = formのテキストボックスに書かれた値; doCmd.openQueryで実行させると画面が開きクエリの結果が表示される。 この値は必ず一つになるはずでその値を変数に取り込み次の処理を行いたい。 現在はクエリを実行後、フォームを開きなおし別の要素にクエリの結果を 表示させその値を取っている。なるべくならフォームを開きなす事をした くないので最初の実行時に変数として取り込みたい。

  • アクセスでコンパイルエラーが表示されます

    日付型で作成している「outdate」という項目(2006/07/11のように格納されています)の年だけを抽出しようとクエリーを作成し、式1:Year([outdate])としています。 実行すると「クエリ式’Year([outdate])’のコンパイルエラー」と表示されます。 同じく、テキスト型の項目から式2:Left([color],5)というような関数を使用したクエリーを作成して実行しても同じ「クエリ式’Left([color],5)’のコンパイルエラー」と表示されるエラーメッセージがでます。 どうしてなのでしょうか? 使用ソフトはACCESS2003アカデミックパックです。 何か制限あるのでしょうか?

  • 複数の文字列検索について

    VBというよりも、accessで利用したいのでVBAになるかと思いますが、 ある項目について文字列検索をしたいのですが、 001:"aaa" 002:"bbb" 003:"ccc" ・ ・ 100:"zzz" ※SELECT hoge FROM geho WHERE あああ Like "*%%%*"     ***%%%の値を個数分かえたい*** といったように複数パターンあり、クエリの条件節に記述できない状態です。 フォームを作成し、リストボックスに値を格納するところまではできたんですが、 その値を取得して、変数に格納することができません。 ヘルプではItemsSelectedを利用すればいけそうな感じでしたが、 使用例をはりつけて試してみてもエラーになります。 access97なので使えないメソッドだったりするんでしょうか? 何かよい知恵ももってらっしゃる方いらっしゃったらご教授願います。

  • XML文書にかいてある値を変数に格納したい。

    vb2005にてxml文書にアクセスして 値を変数に格納したいと思っています。 どこか参考になるサイトはないでしょうか? 教えてください。

  • SELECT文でLEFT関数を使うと未定義関数ですと言われる

    VBソース上では SELECT LEFT(~~~,4) AS 項目 FROM テーブル と SELECT文で書いてもエラーにならずオープンできるみたいなのですが そのSQL文をACCESS2000上で動かすと 未定義関数LEFTがあると言われます どなたか分かる方至急お願いします!!!

  • @変数の使い方

    お世話になります。 以下のようなクエリで、変数にNULLが入ります。 何が悪かったのでしょうか、ご教示ください。 SELECT @change := MAX( 購入日 + INTERVAL 2 YEAR ) as 交換日 FROM テーブル WHERE @change > '2012-04-24' お願いします。

    • ベストアンサー
    • MySQL
  • ファイルを読み込んで変数へ

    VB初心者です。 ファイルの文字列を読み込んで、変数に格納し、SQL文のテーブル名に指定したいのですが、どうすればよいのでしょうか? テキストから文字列を取得するところまではできたのですが、変数にもって、SQL文に組み込むことができません。実行すると「テーブル名が無効です。」とエラーになります。 どうか、皆様ご教授ください。

  • 一度変数に格納すればフィルタができるのですが

    Set cn = CurrentProject.Connection rs.Open "Qクエリ", cn, adOpenKeyset, adLockOptimistic myStr = "(数 = 0) And (名 = 'test') " rs.Filter = myStr なら問題なくフィルタができるのですが、 rs.Filter = "(数 = 0) And (名 = 'test') " とすると、 実行時エラー3001「引数が間違った型、許容範囲外、または競合しています。」 になります。 なぜか一度変数に格納すればフィルタができるのですが そんなことありますか? 変数を介さないとエラーになるなんてありますか? エラーの原因は変数を介さない事なのでしょうか? アクセスです。

  • select * from rooms where rtype like _____

    rtypeフィールドが5文字のレコードを得たいのですが [ODBC Microsoft Access Driver] クエリ式 'rtype like _____' の 構文エラー でした。 select * from rooms where rtype like _____ のどこがいけないのでしょうか?

  • Access クエリのデータ型について

    AccessでPablic変数を日付範囲指定、クエリの抽出条件に指定したのですが、「抽出条件でデータ型が一致しません。」とのエラーメッセージで抽出出来ません。 【処理フロー】 1.フォームで、開始日と終了日をPublic変数へ格納 2.データ抽出クエリの日付条件に"GetData()"Public Functin VBAで変数を格納した値をクエリの抽出条件に返す。 《変数》 '開始日の宣言 Public sDate As Date '終了日の宣言 Public eDate As Date 《GetData()》 Public Function GetDate() MsgBox "開始日は、" & sDate & vbCrLf & "終了日は、" & eDate GetDate = ">=#" & sDate & "# And <=#" & eDate & "#" MsgBox ("Where文は、" & GetDate) End Function デバッグの為、"GetDate()"の戻り値を、メッセージボックスで表示してますが、戻り値は正常とおもわれますが、「抽出条件でデータ型が一致しません。」でクエリが実行できません。 ここを参考に、上記仕様にしました。 http://www.tsware.jp/tips/tips_369.htm どうすれば、日付範囲をPablic変数から指定出来るか、お教え頂けましたら幸いです。 ちなみに、Pablic変数にしているのは、他のクエリでもこの日付範囲を使いたい為です。 もし、ほかに良い処理方法が有れば、ご教授ください。