Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Microsoft 365)
クエリでの抽出条件
投稿日時: 23/02/22 14:33:34
投稿者: jimusyo

いつもお世話になっております。
 
■テーブルには
 年(数値型)
 月(数値型)
 日(数値型)
が入っているテーブルがございます。
 
フォーム(Fデータ検索)上で、非連結のテキストボックス日付「から」「まで」を指定し、
※書式は日付(S)
 
・「から」「まで」が共に入力されていれば、
 その日付範囲のデータ
 
・「から」が入力されており、「まで」が入力されていなければ、
 「から」以上の日付データ
 
・「から」が入力されてなく、「まで」が入力されている場合は、
 「まで」までの日付データ
 
・「から」「まで」共に入力されていなければ全てのデータ
 
のデータを抽出したく、
クエリに
■「から」のフィールド
IIf([Forms]![Fデータ検索]![から] Is Null,True,DateSerial([年],[月],[日])>=[Forms]![Fデータ検索]![から])
■「から」の抽出条件
True
 
■「まで」の抽出条件
IIf([Forms]![Fデータ検索]![まで] Is Null,True,DateSerial([年],[月],[日])<=[Forms]![Fデータ検索]![まで])
■「まで」の抽出条件
True
 
とし、実際フォーム上で日付を入力し、データを抽出しようとすると
式が正しく入力されていないか、複雑すぎるために評価できません。たとえば、数式に複雑な要素が多すぎます。変数に式の一部を割り当て、式を簡単にしてください。
と表示されております。
 
どの記述に誤りがあるのでしょうか。
 
よろしくお願いいたします。

回答
投稿日時: 23/02/22 15:20:25
投稿者: sk

そのクエリの SQL ビューの内容をそのまま明示されることをお奨めします。

投稿日時: 23/02/22 15:29:07
投稿者: jimusyo

sk様
 
早々にご連絡いただき、ありがとうございます。
 
下記がクエリSQLすべてとなります。
 
PARAMETERS [Forms]![Fデータ検索]![から] DateTime, [Forms]![Fデータ検索]![まで] DateTime;
SELECT [サンプル試作依頼].*, DateSerial([年],[月],[日]) AS 日付
FROM サンプル試作依頼
WHERE ((([サンプル試作依頼].客先) Like IIf([Forms]![Fデータ検索]![客先名] Is Null,"*","*" & [Forms]![Fデータ検索]![客先名] & "*")) AND ((IIf([Forms]![Fデータ検索]![から] Is Null,True,DateSerial([年],[月],[日])>=[Forms]![Fデータ検索]![から]))=True) AND ((IIf([Forms]![Fデータ検索]![まで] Is Null,True,DateSerial([年],[月],[日])<=[Forms]![Fデータ検索]![まで]))=True) AND (([サンプル試作依頼].年) Is Not Null And ([サンプル試作依頼].年)>0) AND (([サンプル試作依頼].月) Is Not Null And ([サンプル試作依頼].月)>0) AND (([サンプル試作依頼].日) Is Not Null And ([サンプル試作依頼].日)>0))
ORDER BY [サンプル試作依頼].[サンプル試作依頼ID];
 
上記そのままとなります

回答
投稿日時: 23/02/22 17:33:56
投稿者: sk

SQL ビューの内容を拝見した限り、クエリの作り方自体については
大きな問題点は認められません。
 
よって現時点で疑うべき箇所を挙げるとすれば、
テーブル[サンプル試作依頼]に格納されている
いずれかのレコードの内容だと思います。
 

引用:
DateSerial([年],[月],[日])

例えば[年]の値が 10000 以上であるレコードが存在している場合、
日付/時刻型で表現できるデータ範囲の上限( 9999/12/31 23:59:59 )を
超えてしまうため、上記の DateSerial 関数はエラーを返します。
 
そのような状況においてクエリの抽出条件式に記述されている
DateSerial 関数が呼び出された際に、以下のエラーメッセージが
返されることになります。
 
引用:
式が正しく入力されていないか、複雑すぎるために評価できません。たとえば、数式に複雑な要素が多すぎます。変数に式の一部を割り当て、式を簡単にしてください。

とりあえず、[年],[月],[日]のいずれかに異常な値が
格納されているレコードがないか否かを調査してみて下さい。

投稿日時: 23/02/22 19:02:11
投稿者: jimusyo

sk様
 
 ご回答いただきありがとうございました。
 
> 例えば[年]の値が 10000 以上であるレコードが存在している場合、
> 日付/時刻型で表現できるデータ範囲の上限( 9999/12/31 23:59:59 )を
> 超えてしまうため、上記の DateSerial 関数はエラーを返します。 
 
 年のデータ10000以上が存在しておりました。
 
 本データを修正することで、エラーなく検索が表示されました。
 
 DateSerial関数勉強になりました。
 
大変ありがとうございます。