none
Access 2010 Runtimeの環境でSQLのWHERE句にFormat関数を使用して時間まで比較したい RRS feed

  • 質問

  • はじめまして。お世話になります。

    Microsoft Answersにて同様の質問をした際、こちらに書き込んだほうがよいとのアドバイスをいただいたので、

    再度書き込ませでいただきます。

    http://answers.microsoft.com/ja-jp/office/forum/office_2010-access/access-2010/bbf903f4-c8ac-465e-ae5e-4ba0237e13cb

    【環境】
    [1] Windows7 32ビット
      ・Access2010インストール済
    [2] [1]の環境上に立てたVirtualPC(WindowsXP(SP3))
      ・Microsoft Access 2010 Runtimeインストール済(http://www.microsoft.com/ja-jp/download/details.aspx?id=10910)
      ・Access 2010 Runtime SP1インストール済(http://support.microsoft.com/kb/2460015/ja)
      ・レジストリ変更済み(参考URL:http://www.mkkobo.com/runtime/runtime04.htm)
    [3] 参照するDB:SQL Server 2008 R2
    [4] 使用するPG:[1]で作成したMDEファイル

    【やりたいこと】
    ランタイム環境下([2]の環境)で[4]の動作確認を行っています。
    その中で、以下のSQLを実行したい。
    ※WHERE条件の[テーブルA.登録日時]はDateTime型である。

    Dim DB As ADODB.Connection
    Set DB = CurrentProject.Connection

    strSQL = "SELECT"
    strSQL = strSQL & " テーブルA.*"
    strSQL = strSQL & " INTO テーブルB"
    strSQL = strSQL & " FROM テーブルA"
    strSQL = strSQL & " IN ''[ODBC;driver={SQL Server Native Client 10.0};server=サーバー名;uid=ログインID;pwd=パスワード;database=データベース名]"
    strSQL = strSQL & " WHERE Format(テーブルA.登録日時,'yyyy/mm/dd') >= '2012/12/21';" ←★


    DB.Execute strSQL

    DB.Close: Set DB = Nothing

    【現状】
    [1]の環境では実行できるが、
    [2]の環境では下記のメッセージが表示され、実行できない。

    『イベント プロパティに指定した式 クリック時でエラーが発生しました
     :OLEオブジェクトのプロパティまたはメソッドにアクセスするときにエラーがはっせいしました。
     *マクロ名、ユーザ定義関数名、[イベントプロシージャ]以外の式が指定されています。
     *関数、イベント、マクロの評価でエラーが発生しました。
     (このエラーは、イベントのロジックの場所を評価できないためにイベントを実行できなかった場合に発生します。
     たとえば、フォームの"OnOpen/開く時"プロパティが=[フィールド]に設定されている場合、
     イベントが開始されたときに、マクロまたはイベントの名前が実行対象として予期されるため、このエラーが発生します。』

    【対策】
    ★の部分を下記のように書き換えれば、比較対象のデータ型を変換すると[2]の環境でも実行できた。

    ≪成功≫
    strSQL = strSQL & " WHERE テーブルA.登録日時 >= Cdate('2012/12/21 00:00:00');"
    strSQL = strSQL & " AND テーブルA.登録日時 <= Cdate('2012/12/22 00:00:00');"

    ≪失敗≫
    ・strSQL = strSQL & " WHERE Format(テーブルA.登録日時," & """" & "yyyy/mm/dd" & """" & ") >= '2012/12/21';"
    ・strSQL = strSQL & " WHERE Format(テーブルA.登録日時," & """" & "yyyy/mm/dd" & """" & ") >= " & """" & "2012/12/21" & """" & ";"
    ・strSQL = strSQL & " WHERE Format(テーブルA.登録日時,'yyyy/mm/dd') >= '2012/12/21';"
    ・strSQL = strSQL & " WHERE Format(テーブルA.登録日時,'yyyy/mm/dd') >= Cdate('2012/12/21');"
    ・strSQL = strSQL & " WHERE DateValue(Format(テーブルA.登録日時,'yyyy/mm/dd')) >= '2012/12/21';"
    ・strSQL = strSQL & " WHERE DateValue(Format(テーブルA.登録日時,'yyyy/mm/dd')) >= #2012/12/21#;"
    ・strSQL = strSQL & " WHERE DateValue(Format(テーブルA.登録日時,'yyyy/mm/dd')) >= Cdate('2012/12/21');"


    Access 2010 Runtimeの環境でSQLのWHERE句にFormat関数を使用して時間まで比較したい場合には
    どのようにしたら良いでしょうか?教えてください。
    よろしくお願いします。


    • 編集済み nyandaba 2013年1月10日 6:14
    2013年1月7日 23:37

すべての返信

  • 1点確認させてください。

    Access 2010 Runtime環境(環境[2])にはVBAがインストールされていますか?

    2013年1月9日 8:35
  • Access も ODBC も殆ど使わないので外してるかもしれませんが、
    CurrentProject.Connection の Provider のバージョンによってFormat関数が使えたり使えなかったりするのかも。
    それぞれの環境で CurrentProject.Connection を比較してみてください。

    尚、Microsoft OLE DB Provider for SQL Server(接続文字列ではProvider=SQLOLEDB;) ならTransact-SQL が使えます。
    Transact-SQLにはFormat関数はありませんが、自動変換されるので直接比較できます。
    ex. WHERE テーブルA.登録日時 >= '2012/12/21 00:00:00'
    2013年1月10日 4:06
  • kyk_nkさん、こんにちは。

    返信ありがとうございます。

    環境[2]はRuntimeのみの環境で、Officeはインストールされていません。

    …という回答でよろしかったでしょうか?もしご質問の意図を取り違えていたらすみません。

    2013年1月10日 5:53
  • hihijijiさん、こんにちは。

    返信ありがとうございます。

    この場合、ODBCのバージョンということでしょうか?

    SQL Server NativeClient 10.0のバージョンは以下の通りでした。

    環境[1]は、2009.100.2500.00

    環境[2]は、2009.100.1600.01

    どちらもMicrosoft® SQL Server® 2008 R2 Native ClientのX86 パッケージ (sqlncli.msi)(http://www.microsoft.com/ja-jp/download/details.aspx?id=16978)をインストールしました。


    • 編集済み nyandaba 2013年1月10日 6:17
    2013年1月10日 6:14
  • AccessVBAの中でSQLServerに対して実行しているSQLに関する質問だったのですね。

    私の理解が誤っていました。(SQLの問い合わせがAccessに対して行われているのかと誤って解釈していました)

    以上、訂正いたします。

     

    Formatで記載している箇所を、CONVERTに変換してもエラーが発生するのでしょうか?

    例:

    SELECT CONVERT(varchar,SYSDATETIME(),111)

    結果:2013/01/10

    • 編集済み kyk_nk 2013年1月10日 7:06
    2013年1月10日 6:52
  • kyk_nkさん、こんにちは。

    返信ありがとうございます。

    >Formatで記載している箇所を、CONVERTに変換してもエラーが発生するのでしょうか?

    早速組み込み、[1]の環境で実行してみたところ、以下のようなエラーが発生しました。

    『実行時エラー'-2147217900(88004e14)':式に未定義関数'CONVERT’があります。』

    質問内容で記載してあるSQLはパススルークエリのようなもので、ODBC接続を使用してAccess側からSQLServer側へ処理を行うものになるので、SQLの文法はAccess側での文法になることから、おそらくTransact-SQLのCONVERT関数は使用できないというのが原因ではないかと思います。

    • 編集済み nyandaba 2013年1月11日 5:49
    2013年1月11日 5:23
  • ご確認ありがとうございます。

    SQLの文法がAccess側になるのですね。重ねて確認不足で申し訳ありません。

     

    もう1つだけ確認させてください。

    質問者さんの環境[2]でFormat()関数の代わりに、Left()もしくはRight()関数をSQLに組み込んだ場合も同様のエラーが発生しますか?

    もしエラーが発生するならば、以下の質問スレッドと類似性がありそうです。

     

    Why I can't use format, Left and Right function in a query?

      

    このスレッドをベースに、確認した方が良いことを以下にまとめます。


    <確認した方が良いこと([2]環境において)>

    ① 参照設定で未参照になっている参照はありませんか?(Missingになっている参照はありませんか?)

      → もし必要な参照が未参照になっていた場合は、参照するようにしてください。

    ② 未参照になっているものがない場合は、適当に新しい参照を追加→解除してみてください。

    ③ ②と同様の状況で、②の方法で解決できなかった場合は、一通り選択されている参照を解除し、再度参照を設定してみてください。

     

    もし、ご参考になりますようでしたら、ご利用ください。

    2013年1月14日 8:59
  • kyk_nkさん、こんにちは。

    返信ありがとうございます。

    >質問者さんの環境[2]でFormat()関数の代わりに、Left()もしくはRight()関数をSQLに組み込んだ場合も同様のエラーが発生しますか?

    アドバイスありがとうございます!早速組み込み、[2]の環境で実行してみたところ、正常に動作しました。

    Microsoft Answersのほうでも教えていただいたのですが、

    Format関数を使用できないのは当方の環境によるものかもしれません。

    しばらくは質問文の【対策】の≪成功≫の方法で対処しようと思います。

    • 回答の候補に設定 kyk_nk 2013年1月17日 10:48
    2013年1月17日 7:57
  • ご確認ありがとうございました。

    八方ふさがりではなく、打開策(CDateを用いればエラーにならない)があり、その方法を採用することも可能であるのならば、何よりです。

    環境依存ということなのですが、もしよろしければ、お時間が良い時にそのように判断された理由などを追記いただけますと、万が一同様の問題を抱えている人がいた場合、助けになると思います。

    お手数をおかけしますが、無理ない範囲でご協力いただけましたら幸いです。

    ※ ただ、質問者さんが当初立ち上げていたスレッド(http://answers.microsoft.com/ja-jp/office/forum/office_2010-access/access-2010/bbf903f4-c8ac-465e-ae5e-4ba0237e13cb)、こちらでのやり取りの結果、環境依存だと判断されたのでしたら、特に追加で記載していただかなくてもかまいません。


    よろしくお願いします。
    • 編集済み kyk_nk 2013年1月17日 10:48 修正
    2013年1月17日 8:17