[2850]
 アクアク 2004/7/24 14:41
------------------------
抽出条件のデータ型が一致しません
-----------
Accessバージョン: 2000   OS:2000
こんにちわ。いつもお助け板を見て参考にさせて
頂いてます。
私は、毎月、先月のデータを日にちを指定して取り出して
います。で、タイトルのエラーが出てしまいます。どこが
わるいのか分からずアドバイスを頂きたいと思いメールして
みました。
まずアクセスに取り込むデータは、簡単に例で説明すると
商品  日付@ 日付A  価格
りんご 980421  821  500
みかん   522 101101 263
ばなな 40621  970213 123

上記のように日付@,Aが桁がバラバラです。そこで
桁を揃えてクエリで
Right("00"&[日付@],6)
Right("00"&[日付A],6)
と桁を6桁にそろえた後、形式を日付形式に変換するため
Cdate(Format([6桁にそろえた日付],"@@//@@//@@)
と形式を変換します。
その後、日付を変換した関数の列のクエリの抽出条件のところに取り出したいデータ
期間を入力します。
魔法使い工房さんで見た関数を参考にさせていた
Between DateSerial(Year(Date()),Month(Date())-1,1)
And DateSerial(Year(Date()),Month(Date()),0)
を入力しました。クエリを実行すると、タイトルのエラー
メッセージが出てデータ抽出できません。
テーブルの日付@,Aの書式形式は、数値型の長整数型です。
アドバイスをお願いします。




 クロ 2004/7/26 09:30
------------------------
Re:抽出条件のデータ型が一致しません
-----------
※丸数字は文字化け及びAccessのフィールと名としては不適切なのでそれぞれ「1」「2」と
 します。
Right("00"&[日付1],6)やRight("00"&[日付2],6)では
821や522のとき(たぶん2000年)に桁が足りなくなりませんか?
でFormat([日付1],"000000")とFormat([日付2],"000000")としてみてください。

以下は日付1(名称を日付Aにしてます)の抽出条件に入れた場合のSQLです。
※テーブル名は「テーブル1」としてます。

SELECT テーブル1.商品, CDate(Format(Format([日付1],"000000"),"@@//@@//@@")) AS 日付A,
CDate(Format(Format([日付2],"000000"),"@@//@@//@@")) AS 日付B, ACAC.価格
FROM テーブル1
WHERE (((CDate(Format(Format([日付1],"000000"),"@@//@@//@@"))) Between DateSerial
(Year(Date()),Month(Date())-1,1) And DateSerial(Year(Date()),Month(Date()),0)));



 アクアク 2004/7/29 21:42
------------------------
Re[2]:抽出条件のデータ型が一致しません
-----------
返事遅くなってすいません。数日間PCの調子が悪くて繋がらなくて。クロさん回答有難うございました。日付が手入力の為に41906と入力されていたの日付の関数で変換できず件名のエラーになりました。エラー対処のため のIIf(Is Error(CDate(Format(Format([日付1],"000000"),"@@//@@//@@")),"",CDate(Format(Format([日付],"000000"),"@@//@@//@@")))
または IIf( IsNumeric (CDate(Format(Format([日付1],"000000"),"@@//@@//@@")),"",CDate(Format(Format([日付],"000000"),"@@//@@//@@")))式を入力しましたがまた#errorになってしまいます。対処法をおしえていただけますでしょうか?よろしくお願いします。



 クロ 2004/7/30 08:50
------------------------
Re[3]:抽出条件のデータ型が一致しません
-----------
>IIf(Is Error(CDate(Format(Format([日付1],"000000"),"@@//@@//@@")),"",CDate(Format
>(Format([日付],"000000"),"@@//@@//@@")))

記述ミスでしょうか?
IIf(IsError(CDate(Format(Format([日付1],"000000"),"@@//@@//@@"))),"",CDate(Format(Format([日付1],"000000"),"@@//@@//@@")))
では?

というか...エラーにはならないのでは?

41906の場合下二桁の06をyyと中二桁の19をdd、上一桁の4をmmと判断して
2006/04/19となるばすです。

日付1と日付2のデータ型は数値型、テキスト型のどちらでしょうか?
それと何故日付を数値(テキスト)型で入れられているのでしょうか?



 クロ 2004/7/30 11:48
------------------------
Re[3]:抽出条件のデータ型が一致しません
-----------
ユーザ定義関数を作ってみました。

Function IsDateErrChk(Moto) As Integer
'***フィールドの値を日付に変換して日付になるならTrue、ならないならFalseを返します***
Dim Y As String, M As String, D As String

 'Motoにある値を6桁にして左から2つを取得
 Y = Left(Format(Moto, "000000"), 2)
 'Motoにある値を6桁にして真ん中の2つを取得し、
 '12より大きい場合は13を入れる
 M = IIf(CInt(Mid(Format(Moto, "000000"), 3, 2)) > 12, 13, Mid(Format(Moto, "000000"), 3, 2))
 'Motoにある値を6桁にして右から2つを取得
 D = Right(Format(Moto, "000000"), 2)
 'DateSerialで算出した日付の月とMの月を比較
 If Month(DateSerial(Y, M, D)) <> CInt(M) Then
  IsDateErrChk = False
 Else
  IsDateErrChk = True
 End If
End Function

DateSerialの事例は以下をご覧ください。
http://support.microsoft.com/default.aspx?scid=kb;ja;88657
第二引数に13を入れると次年1月になりますし、第三引数にない日にち(例えば6月31日の31など)を
入れた場合も翌月1日を返します。これを利用して比較をしています。

クエリでフィールドに
式1:IsDateErrChk([日付1])
といれ、データシートビューにすると0/-1と表記されますので抽出条件に-1又はTrueを入れておけば
日付認識するレコードのみを表示すると思います。
※クエリの「表示」チェックを外せば見えなくなります。

期間抽出フィールドは例のとおり
式2: CDate(Format(Format([日付1],"000000"),"@@//@@//@@"))
として
抽出条件には
Between DateSerial(Year(Date()),Month(Date())-1,1) And DateSerial(Year(Date()),Month(Date()),0)

如何でしょうか?



 アクアク 2004/7/30 21:05
------------------------
Re[4]:抽出条件のデータ型が一致しません
-----------
クロさん大変わかりやすい説明ありがとうございます。
なぜ日付1, 2 を日付型に最初に設定しないかというと
外部データからテキスト形式にしてデータをおとしてます。
インポート時に日付型にするとインポートエラーになるので。

ユーザー定義関数で処理するとクエリで実行すると結果がで
るまでに時間がかかります。
何か定義関数に付け加えれば速く結果が表示されますか?
あと抽出条件で日付型に出来ない商品を確認するためにFALSEや0で
入力するとエラーでかえってきます。IIFで条件づけても同じ結果でます。
すいませんアドバイスを頂けますか



 クロ 2004/8/1 00:31
------------------------
Re[5]:抽出条件のデータ型が一致しません
-----------
>ユーザー定義関数で処理するとクエリで実行すると結果がで
>るまでに時間がかかります。
>何か定義関数に付け加えれば速く結果が表示されますか?

そんなに遅いですか?
190,000件程度で試しましたがほとんど一瞬でしたが...

>あと抽出条件で日付型に出来ない商品を確認するためにFALSEや0で
>入力するとエラーでかえってきます。IIFで条件づけても同じ結果でます。
>すいませんアドバイスを頂けますか

エラーで返るのは日付型にできないので元のレコードを修正してください。
その場合は件のユーザ定義関数でFALSEや0で引いたものを単に「日付1」や
「日付2」で修正するしかないのでは?これは別クエリか同クエリ内に
別フィールドを設けてください。



 アクアク 2004/8/1 21:33
------------------------
Re[6]:抽出条件のデータ型が一致しません
-----------
早速の返事ありがとうございます。
すいません説明不足でした。
件数は190,000の2倍で関数を使った
クエリをもとに違うクエリを作って
その月の合計を取っています。
そのクエリが何分とかかります。
そのクエリも商品をグループ化して
価格を合計しているのですが。

>エラーで返るのは日付型にできないので元のレコードを修正してください。
>その場合は件のユーザ定義関数でFALSEや0で引いたものを単に「日付1」や
>「日付2」で修正するしかないのでは?これは別クエリか同クエリ内に
>別フィールドを設けてください。

もうひとつのほうはやってみます。



 クロ 2004/8/2 08:29
------------------------
Re[7]:抽出条件のデータ型が一致しません
-----------
>外部データからテキスト形式にしてデータをおとしてます。
抽出がどうのと言うよりは、それ以前に日付部分を日付型として認識できないデータを
どう修正するかの方が先のような気がしますが...如何でしょうか?
外部データのオペレート段階でどうにかするか、インポート後に修正する手順をとらな
いと。
レスタイトルの「抽出条件のデータ型が一致しません」はこの所為なのですから...

件のユーザ関数で集計前のレコードの日付型にできないレコードを引っ張って修正すれ
ば、以降のユーザ関数は使用しないでいいわけですし、多重クエリは何処かで一度ワー
クテーブルに落としてやるなりしたら幾らか速くなるのではないかと思います。