アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも楽しく勉強させていただいております。

Access2013のVBAでADOを使ったシステムを作っています。

その中にある契約の月額料金に対して日割で控除額を計算する処理があります。
契約のテーブルには契約が何日~何日(From~To)まで有効であるかを格納し、
控除のテーブルには何日~何日(From~To)まで控除するかが入っています。

日割を行う前に控除のFrom~Toが契約のFrom~Toの範囲内であることのチェックをします。

If Deduction!To > Contract!To Then
一連のエラー処理
Exit Function
End If

上記のコードを実行してうまくいく時といかない時があります。
エラーでないはずなのにエラーになります。
うまくいかない時にイミディエイトウィンドウでみると、こうなっていました。

?Contract!To
2014/02/14

?Deduction!To
2014/02/13

?Deduction!To > Contract!To
True

Deduction!Toは2014/02/13ですからContract!Toの2014/02/14より大きいはずはないのですが・・・。
どちらのテーブルのTo列も日付時刻型です。

ためしにCdate関数を使ってみましたが、これは意図したとおりに動きました。

If Cdate(Deduction!To) > Cdate(Contract!To) Then

ということで何とか回避する手段はあるのですが、気持ち悪いです。

(1)どうしてこういった現象がおきるのか。
(2)ADOのRecordsetを使った日付の比較は危険なのか。
(3)もっと根本的な解決法はありますか。

どなたかご存知の方教えてくださいませんか。

A 回答 (1件)

> ためしにCdate関数を使ってみましたが


元のデータはテキスト型ということですか?

日付型のまま、大小比較するのは危ないと思います。

(1)どうしてこういった現象がおきるのか。
「たぶん」程度ですが、日付表記の文化の違いかも。

日本では「年月日」の言葉通り、yyyymmddですよね。これは大小比較しやすい。
でも合衆国ではmm-dd-yyyyだし、他の英語圏ではdd-mmm-yy。
クエリに日付を#で囲んで記述する際に#14/03/2014#と書くようです(参考URL)

なので
> ?Deduction!To
> 2014/02/13
は 14/02/13 → 2013/02/14と解釈されてるのかも。

if format(Deduction!To, "YYYY/MM/DD") > format(Contract!To, "YYYY/MM/DD) Then
みたいに明示したほうがトラブルにならないと思います。(処理速度が不利としても)


バージョンによるのかも、とは思いますが
1)ACCESSでタイムスタンプ目的で年月日時分秒を記録して
2)レコードコピーして、
3)EXCELにペーストすると、dd-mmm-yyになる。
4)それをEXCELでコピーして
5)ACCESSにペーストすると、yyとddが逆転する。
何度か痛い目に遭いました。

参考URL:http://office.microsoft.com/ja-jp/access-help/HA …
    • good
    • 0
この回答へのお礼

bin-chanさん、回答ありがとうございます。

>元のデータはテキスト型ということですか?

いえ、どちらのテーブルもFromとToは日付時刻型です。
本来ならこのまま比較してもかまわないはずですよね。

>「たぶん」程度ですが、日付表記の文化の違いかも。

私もそんな気がしていました。


>if format(Deduction!To, "YYYY/MM/DD") > format(Contract!To, "YYYY/MM/DD) Then
>みたいに明示したほうがトラブルにならないと思います。(処理速度が不利としても)

多少処理が遅くなっても、日付の比較はとても重要ですからそうすることにします。

>バージョンによるのかも、とは思いますが
>1)ACCESSでタイムスタンプ目的で年月日時分秒を記録して
>2)レコードコピーして、
>3)EXCELにペーストすると、dd-mmm-yyになる。
>4)それをEXCELでコピーして
>5)ACCESSにペーストすると、yyとddが逆転する。
>何度か痛い目に遭いました。

私もそういうことありました。

どうにかならないものかと思いますが他のDBMSでも日付関連のトラブルはあると
聞きますし、好きで使っているAccessなのでこれからも工夫して付き合っていきます。

ありがとうございました。

お礼日時:2014/03/14 17:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A