Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7 Professional : Access 2010)
クエリ実行時、パラメータの入力要求画面表示について
投稿日時: 18/10/21 16:07:00
投稿者: rockforest

下記の式をフィールドリストに式を入れると「免許更新日1」のパラメータの入力要求画面が表示されてしまいます。
数日調べているのですが、行き詰っているので、質問させて頂きました。
 
解決策をご教示下さい。
また、他のフィールドリストも合わせて記載させて頂きます。
不足情報がありましたら、追記致します。
宜しくお願い致します。
 
<問題の式>
満了残日数: DateDiff("d",Date(),Mid(IIf([免許更新日1]<[免許更新日2],[免許更新日2],[免許更新日1]),1,4)+2 & "/12/31")
 
<フィールドリスト式>
直近免許番号: IIf([免許更新日1]<[免許更新日2],[免許番号2],[免許番号1])
直近免許更新日: IIf([免許更新日1]<[免許更新日2],[免許更新日2],[免許更新日1])
有効期間: Mid([直近免許更新日],1,4)+2 & "/12/31"
 
満了残日数: DateDiff("d",Date(),Mid(IIf([免許更新日1]<[免許更新日2],[免許更新日2],[免許更新日1]),1,4)+2 & "/12/31")

回答
投稿日時: 18/10/21 21:37:55
投稿者: よろずや

>「免許更新日1」
テーブルの項目名と完全に一致していますか?
 

投稿日時: 18/10/21 22:26:05
投稿者: rockforest

よろずやさん
コメントありがとうございます。
項目名は一致しております。

回答
投稿日時: 18/10/21 23:22:46
投稿者: よろずや

テーブルの項目名じゃないですよね。
>COMSTAFF.LICENSEDATE1 AS 免許更新日1
クエリの中で付けた別名を式の中で参照してますよね。
こういうことは、Accessでは一応可能ですが、
Accessのコンパイラがタコなので、
複雑な式の中でこれをやると、
コンパイルエラーになります。
 
>DateDiff("d",Date(),Mid(IIf([免許更新日1]<[免許更新日2],[免許更新日2],[免許更新日1]),1,4)+2 & "/12/31") AS 満了残日数

DateDiff("d",Date(),Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],[COMSTAFF].[LICENSEDATE2],[COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31") AS 満了残日数
 
※マルチポストしても、回答する人は同じです。

投稿日時: 18/10/22 22:43:27
投稿者: rockforest

よろずやさん
返信が遅くなりました。コメントありがとうございます。
 
ご教示頂いた内容で試した結果、無事にパラメータの入力要求画面表示は解消致しました。
ですが、新たな問題が発生致しました。
 
クエリの満了残日数項目の抽出条件欄に「<31」セットすると「抽出条件でデータ型が一致しません。」表示されてしまいます。
満了残日数項目は、日付の差引し数値形式のはずなのになぜ、データ型が一致しないのか、まったく分からなく困っております。
 
申し訳ありませんが、アドバイスを頂けないでしょうか。
宜しくお願い致します。

回答
投稿日時: 18/10/23 09:12:18
投稿者: よろずや

こちらの環境(Win7pro,Access2010)では問題ありません。
テーブルの仕様とサンプルデータ、クエリのSQL全文を提示してください。

投稿日時: 18/10/23 23:25:54
投稿者: rockforest

よろずやさん
コメントありがとうございます。
コメントの情報は以下の通りです。
宜しくお願い致します。
 
<テーブル仕様書>
COMSTAFF                
NO    項目名称    タイプ    サイズ    インデックス
1    HOSPITALCODE    テキスト型    2    
2    STAFFCODE    テキスト型    10    PrimaryKey
3    GENERATIONNO    テキスト型    1    PrimaryKey
4    WARDCODE    テキスト型    5    
5    PROFESSIONCODE    テキスト型    2    
6    DEGREECODE    テキスト型    2    
7    KANANAME    テキスト型    20    
8    KANJINAME    テキスト型    20    
9    PASSWORD    テキスト型    64    
10    VALIDSTARTDATE    日付/時刻型    8    
11    VALIDENDDATE    日付/時刻型    8    
12    LICENSECODE1    テキスト型    16    
13    LICENSEDATE1    日付/時刻型    8    
14    LICENSECODE2    テキスト型    16    
15    LICENSEDATE2    日付/時刻型    8    
16    SEX    テキスト型    1    
17    GENGOU    テキスト型    1    
18    BIRTHDAY    テキスト型    6    
19    PERSONALCODE    テキスト型    10    
20    UPDATEDATE    日付/時刻型    8    
21    UPDATETERMINAL    テキスト型    10    
22    UPDATEOPERATOR    テキスト型    10    
23    STAFFSHORTNAME    テキスト型    6    
24    STAFFGROUP    テキスト型    10    
25    PWDUPDDATE    日付/時刻型    8    
                
COMWARD                
NO    項目名称    タイプ    サイズ    インデックス
1    WARDCODE    テキスト型    4    PrimaryKey
2    WARDNAME    テキスト型    20    
3    WARDSUBNAME    テキスト型    20    
4    WARDSPECIALNAME    テキスト型    20    
5    WARDSTATUS    テキスト型    1    
6    WARDSEQ    数値型    整数型    
7    VISIBLESTATUS    テキスト型    1    
 
<サンプルデータ>
職員コード    部署名    職種    カナ名    氏名    免許番号1    免許更新日1    免許番号2    免許更新日2    直近免許番号    直近免許更新日    有効期間    満了残日数    使用開始日    使用終了日
00002    医局    医師    アイウエオ    あいうえお    160206    2016/01/01    182319    2018/01/01    182319    2018/01/01    2020/12/31    800    2013/08/20    2049/12/31
 
<SQL文>
 
SELECT COMSTAFF.STAFFCODE AS 職員コード, COMWARD.WARDNAME AS 部署名, COMPROFESSION.PROFESSIONNAME AS 職種, COMSTAFF.KANANAME AS カナ名, COMSTAFF.KANJINAME AS 氏名, COMSTAFF.LICENSECODE1 AS 免許番号1, COMSTAFF.LICENSEDATE1 AS 免許更新日1, COMSTAFF.LICENSECODE2 AS 免許番号2, COMSTAFF.LICENSEDATE2 AS 免許更新日2, IIf([免許更新日1]<[免許更新日2],[免許番号2],[免許番号1]) AS 直近免許番号, IIf([免許更新日1]<[免許更新日2],[免許更新日2],[免許更新日1]) AS 直近免許更新日, Mid([直近免許更新日],1,4)+2 & "/12/31" AS 有効期間, DateDiff("d",Date(),Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],[COMSTAFF].[LICENSEDATE2],[COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31") AS 満了残日数, COMSTAFF.VALIDSTARTDATE AS 使用開始日, COMSTAFF.VALIDENDDATE AS 使用終了日
FROM (COMSTAFF INNER JOIN COMWARD ON COMSTAFF.WARDCODE = COMWARD.WARDCODE) INNER JOIN COMPROFESSION ON COMSTAFF.PROFESSIONCODE = COMPROFESSION.PROFESSIONCODE
WHERE (((COMSTAFF.STAFFCODE) Not Like "9*" And (COMSTAFF.STAFFCODE) Not Like "8*") AND ((COMSTAFF.LICENSECODE1) Is Not Null) AND ((DateDiff("d",Date(),Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],[COMSTAFF].[LICENSEDATE2],[COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31"))<31) AND ((COMSTAFF.VALIDENDDATE)=#12/31/2049#) AND ((COMPROFESSION.PERMISSIONCODE)="0100" Or (COMPROFESSION.PERMISSIONCODE)="1100"))
ORDER BY COMSTAFF.STAFFCODE, COMSTAFF.PROFESSIONCODE;

回答
投稿日時: 18/10/24 12:24:40
投稿者: Suzu

rockforest さんの引用:
クエリの満了残日数項目の抽出条件欄に「<31」セットすると「抽出条件でデータ型が一致しません。」表示されてしまいます。
満了残日数項目は、日付の差引し数値形式のはずなのになぜ、データ型が一致しないのか、まったく分からなく困っております。

 
抽出条件無しで値の確認をした上での話でしょうか。
 
本当に戻り値は、数値ですか?
違いますよね? Null も取りうるはずです。
 
戻り値は、リアント型 (内部処理形式 Long の Variant)ではありませんか?

回答
投稿日時: 18/10/24 22:38:23
投稿者: よろずや

エラーにはならずに、単に抽出されなくなります。
 
Accessファイルは、いじくり回してると壊れます。
特に、実行中断モードでいじると壊れやすいです。
修復/最適化を実行してみてください。
 
かなり作り込んでる様ですが、こちらも参考にしてください。
<データベースの分割>
https://support.office.com/ja-jp/article/access-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B-3015ad18-a3a1-4e9c-a7f3-51b1d73498cc
 
https://msdn.microsoft.com/ja-jp/library/cc344340.aspx?f=255&MSPPError=-2147217396
 
https://dekiru.net/article/15690/

投稿日時: 18/10/24 22:41:39
投稿者: rockforest

よろずやさん
返信ありがとうございます。
私も内部処理形式 Long Variantだと思っているのですが、2つの日付項目(日付・時刻形式)をDateDiffを使って、日付の差分を計算し数値を出しているのですが、見た目に数値形式ですが、実際には違うのでしょうか。
仮に形式が違うのであれば、どう定義したら良いか、分からないので、定義方法をお教え下さい。

回答
投稿日時: 18/10/25 09:51:56
投稿者: sk

引用:
クエリの満了残日数項目の抽出条件欄に「<31」セットすると
「抽出条件でデータ型が一致しません。」表示されてしまいます。

引用:
DateDiff("d",
         Date(),
         Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],
                 [COMSTAFF].[LICENSEDATE2],
                 [COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31"))<31

テーブル[COMSTAFF]に、[LICENSEDATE1]の値が Null であるレコードが
含まれているからではないでしょうか。

回答
投稿日時: 18/10/25 22:09:01
投稿者: よろずや

sk さんの引用:
テーブル[COMSTAFF]に、[LICENSEDATE1]の値が Null であるレコードが
含まれているからではないでしょうか。
それはありません。
WHERE句に
((COMSTAFF.LICENSECODE1) Is Not Null)
があります。
 
 
 
とりあえず、修復/最適化を試してみてください。

投稿日時: 18/10/25 23:12:10
投稿者: rockforest

Suzuさん、skさん、よろずやさん
コメントありがとうございます。
 
修復/最適化を実施致しましたが、変化ありませんでした。
やはりどこか定義に問題があるように思います。
 
因みに「テーブル[COMSTAFF]に、[LICENSEDATE1]の値が Nullはありません。
[LICENSEDATE2にはありますが。

回答
投稿日時: 18/10/26 06:54:31
投稿者: よろずや

空のデータベースを作り、
COMPROFESSION,COMSTAFF,COMWARD,問題のクエリ
をインポートして、問題が起きるか試してください。

回答
投稿日時: 18/10/26 10:15:10
投稿者: sk

よろずや さんの引用:
それはありません。
WHERE句に
 
((COMSTAFF.LICENSECODE1) Is Not Null)
 
があります。

[LICENSECODE1]の値が Null ではなく、かつ
[LICENSEDATE1]の値が Null であるレコードが
存在していても、何らおかしくはないと思いますが。
 
また、今回の場合は該当しないでしょうけど、
それぞれの条件式がどのような順番で評価されるかは
WHERE 句における記述の仕方によって変わってきます。
 
実際に[満了残日数]に対して条件を設定することによって
件のエラーが発生している以上、まずはその式の構造や
それぞれの関数の戻り値、引数として渡されている値に
着目するのが道理に適っています。
 
rockforest さんの引用:
因みに「テーブル[COMSTAFF]に、[LICENSEDATE1]の値が Nullはありません。
[LICENSEDATE2にはありますが。

ではとりあえず、次のような選択クエリを実行してみて、
1 件以上のレコードが返されるか否かをご確認される
ことをお奨めします。
 
( SQL ビュー)
----------------------------------------------------------------------
SELECT [COMSTAFF].[STAFFCODE], 
       [COMSTAFF].[GENERATIONNO], 
       [COMSTAFF].[LICENSECODE1], 
       [COMSTAFF].[LICENSEDATE1], 
       [COMSTAFF].[LICENSECODE2], 
       [COMSTAFF].[LICENSEDATE2], 
       [COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2] AS [IIf関数における比較演算の結果], 
       IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],
           [COMSTAFF].[LICENSEDATE2],
           [COMSTAFF].[LICENSEDATE1]) AS [IIf関数の戻り値], 
       Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],
               [COMSTAFF].[LICENSEDATE2],
               [COMSTAFF].[LICENSEDATE1]),1,4) AS [Mid関数の戻り値], 
       Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],
               [COMSTAFF].[LICENSEDATE2],
               [COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31" AS [DateDiff関数に渡される文字列], 
       IsDate(Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2],
                      [COMSTAFF].[LICENSEDATE2],
                      [COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31") AS [日付時刻データとして扱えるか否か] 
FROM [COMSTAFF] 
WHERE IsDate(Mid(IIf([COMSTAFF].[LICENSEDATE1]<[COMSTAFF].[LICENSEDATE2], 
                     [COMSTAFF].[LICENSEDATE2], 
                     [COMSTAFF].[LICENSEDATE1]),1,4)+2 & "/12/31")=False;
----------------------------------------------------------------------

回答
投稿日時: 18/10/26 12:35:07
投稿者: よろずや

sk さんの引用:
ではとりあえず、次のような選択クエリを実行してみて、
1 件以上のレコードが返されるか否かをご確認される
ことをお奨めします。
やってみましたが、何をおっしゃりたいのか判りかねます。
 
こちらでは、テーブル定義、サンプルデータ、クエリを再現して回答しています。

回答
投稿日時: 18/10/26 17:37:04
投稿者: よろずや

skさんのおっしゃることがようやく分かりました。
他のWHERE条件により抽出対象外となっているレコードであっても、
エラーにならないような条件文を書きなさいということですね。
 
rockforestさん、サンプルデータを提示していただきましたが、
実際はもっとたくさんのデータが入っているテーブルを使用してますよね。
 
そのどのレコードに対してもエラーにならないような条件式を書かなけれななりません。
 
満了残日数: DateDiff("d",Date(),Mid(IIf(Nz([COMSTAFF].[LICENSEDATE1],#2049/12/31#)<Nz([COMSTAFF].[LICENSEDATE2],#2049/12/31#),Nz([COMSTAFF].[LICENSEDATE2],#2049/12/31#),Nz([COMSTAFF].[LICENSEDATE1],#2049/12/31#)),1,4)+2 & "/12/31")
 

回答
投稿日時: 18/10/26 19:21:57
投稿者: よろずや

やっぱ、こっちか。
 
満了残日数: DateDiff("d",Date(),Mid(IIf(Nz([COMSTAFF].[LICENSEDATE1],#1900/01/01#)<Nz([COMSTAFF].[LICENSEDATE2],#1900/01/01#),Nz([COMSTAFF].[LICENSEDATE2],#1900/01/01#),Nz([COMSTAFF].[LICENSEDATE1],#1900/01/01#)),1,4)+2 & "/12/31")

回答
投稿日時: 18/10/26 20:20:13
投稿者: sk

よろずや さんの引用:
skさんのおっしゃることがようやく分かりました。
他のWHERE条件により抽出対象外となっているレコードであっても、
エラーにならないような条件文を書きなさいということですね。

今回のケースに関しては
「 DateDiff 関数がエラーを吐くような値を渡すな」
という一点について言及しているだけです。
 
sk さんの引用:
テーブル[COMSTAFF]に、[LICENSEDATE1]の値が Null であるレコードが
含まれているからではないでしょうか。

この回答に関しても、あくまでそのエラーのトリガーとなり得る
レコードが存在する(ことを見落としている)可能性の 1 つを
示唆したに過ぎません。
 
rockforest さんの引用:
因みに「テーブル[COMSTAFF]に、[LICENSEDATE1]の値が Nullはありません

・[LICENSEDATE1]のデータ型は日付/時刻型である。
 
・[LICENSEDATE1]の値が Null であるレコードは
 テーブル[COMSTAFF]に存在していない。
 
・コントロールパネルの設定に関しても問題はない。
 
以上の前提に誤りがないとするならば、残されている可能性は
[LICENSEDATE1]と[LICENSEDATE2]のいずれか(あるいは両方)の値が
9998/01/01 から 9999/12/31 までの範囲に含まれる日付である
(結果、"10000/12/31" か "10001/12/31" のいずれかの文字列が
DateDiff 関数に渡されようとして型不一致エラーが発生する)
ということだけだと思います。
 
そして実際にそういったレコードが存在しているか否かは、
先の回答で例示した選択クエリの結果を rockforest さんが
ご確認なされば、はっきりと判ることでしょう。

投稿日時: 18/10/28 15:32:53
投稿者: rockforest

sk さん、よろずやさん
 
返答がおそくなりすみません。
みなさんありがとうございます。
 
skさんからのご質問の下記の点ですが、テーブル[COMSTAFF]に
そのようなデータは存在しておりませんでしたが
 
再度、テーブル[COMSTAFF]を確認したところ[LICENSEDATE1]に
NULLが存在しておりました。
すみません。
 
skさんからのご質問
[LICENSEDATE1]と[LICENSEDATE2]のいずれか(あるいは両方)の値が
9998/01/01 から 9999/12/31 までの範囲に含まれる日付である
(結果、"10000/12/31" か "10001/12/31" のいずれかの文字列が
DateDiff 関数に渡されようとして型不一致エラーが発生する)
ということだけだと思います。
  
そして実際にそういったレコードが存在しているか否かは、
先の回答で例示した選択クエリの結果を rockforest さんが
ご確認なされば、はっきりと判ることでしょう。[/quote]

トピックに返信