過去の桐井戸端BBS (桐ver.9)
20602 フォームで入力するとき日付型データでありえない日付のチェックを行いたい 杉作 2003/05/29-11:06
日付チェックでご質問です。
伝票フォームでヘッダーに日付を入力します。
データは日時型で、下記のイベントで前後3ヶ月以上の入力を禁止しています。
今日が5/29とします。
2003.5.30 や 5.30 と入力すると問題なく次の項目に進みますが、
30 だと 確認メッセージがでて、仕入日にフォーカスが
移ったときに 2003/05/30 と表示してその後はエンターキーで先に進みます。
29 や30 と入力してもエラーにならないようにするにはどうしたらよいでしょうか?
*---------------------------------------------------------------*
手続き定義開始 仕入日::ソース値更新()
method @仕入日.編集文字列取得(&編集文字)
&指定日付=#日時値(&編集文字)
if(&指定日付>#日時値(#月数加算(#年月日,3,1)))
確認 "日付が違います。"
method @仕入日.フォーカス設定()
else if(&指定日付<#日時値(#月数加算(#年月日,-3,1)))
確認 "日付が違います。"
method @仕入日.フォーカス設定()
end
手続き定義終了

20603 Re:日付型の日付チェック 杉作 2003/05/29-13:20
記事番号20602へのコメント
すみません、補足です。
OSはWIN2K、XPどちらも
桐V9、桐V9SP1どちらもです。
20607 Re:日付型の日付チェック うにん 2003/05/29-20:15
記事番号20602へのコメント
>今日が5/29とします。
>2003.5.30 や 5.30 と入力すると問題なく次の項目に進みますが、
>30 だと 確認メッセージがでて、仕入日にフォーカスが
>移ったときに 2003/05/30 と表示してその後はエンターキーで先に進みます。

#日時値()の引数が数字だけで1〜31のとき、
年=今年
月=1
日=引数
という謎の値になってしまいますね。バグじゃないでしょうか。
今年・今月・引数か、引数・1月・1日でないと仕様にあってないと思います。

>手続き定義開始 仕入日::ソース値更新()

入力値のチェックは入力後イベントでやるのが本筋のはずなので、
こんなんでどうでしょう(動作確認済み)

手続き定義開始 仕入日::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
変数 日時{&指定日付},{&編集文字}
&指定日付=#COND(#IS数字(&編集文字列,1),#日時値(#STR(#年(#年月日))+"-"+#STR(#月(#年月日))+"-"+&編集文字列),1,#日時値(&編集文字列))
if(&指定日付>#日時値(#月数加算(#年月日,3,1)))
確認 "日付がおそすぎます。"
&入力継続=1
else if(&指定日付<#日時値(#月数加算(#年月日,-3,1)))
確認 "日付がはやすぎます。"
&入力継続=1
end

余談ですが、日時値文字列の区切りは何でもいいはずなんですが、
一部省略している場合、文字によって解釈が変わりますね。
d"5/5" <> d"5d5"

20609 Re:日付型の日付チェック 杉作 2003/05/30-10:04
記事番号20607へのコメント
うにんさん、コメントありがとうございます。
私も、「変だな」と思っていました。やはり、バグでしょうか?

>#日時値()の引数が数字だけで1〜31のとき、
>年=今年
>月=1
>日=引数

これは、確認しました。
しかし、32以上の時は
年 19+引数 (1932)
月 今月
日 本日

となり、うにんさんの入力後イベントで 32 と入力してみると
日付チェックに引っかからずに 1932/05/30 となります。

それで、なぜかな?と&指定日付の値を見ると 2003/05/01 となっています。

???

というわけで、とりあえずの回避策として
桁数をチェックして2桁の数字のみは入力禁止にしてみようかと考えています。

20612 Re:日付型の日付チェック うにん 2003/05/30-12:17
記事番号20609へのコメント
>しかし、32以上の時は
>年 19+引数 (1932)
>月 今月
>日 本日
>
>となり、うにんさんの入力後イベントで 32 と入力してみると
>日付チェックに引っかからずに 1932/05/30 となります。

あ、確認不十分でした(^^;
1〜31のときだけ動作が変なので、その時だけ#日時値()を使わないようにしないとだめでしたね。
1932になるのは、環境設定の「日時・時間型」の「高度な設定」によります。

&指定日付=#COND(#IS数字(&編集文字列,1) .and #NUM(&編集文字列)>0 .and #NUM(&編集文字列)<32,#日時値(#STR(#年(#年月日))+"-"+#STR(#月(#年月日))+"-"+&編集文字列),1,#日時値(&編集文字列))>

数字だけの入力は常に「日」とみなしたいのなら、また別の計算になりますが。

>それで、なぜかな?と&指定日付の値を見ると 2003/05/01 となっています。

"2003/5/32"は日時値に変換すると不正な部分だけ1に置き換わって2003/5/1になるのが仕様です。

20613 Re:日付型の日付チェック 杉作 2003/05/30-12:36
記事番号20612へのコメント
うにんさん、よくわかりました。

>"2003/5/32"は日時値に変換すると不正な部分だけ1に置き換わって2003/5/1に
>なるのが仕様です。

これは、わかりますが、すこし混乱しました。

やや、釈然としない部分はありますが、目的は達成できました。
どうもありがとうございました。

戻る