過去の桐井戸端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に >なるのが仕様です。 これは、わかりますが、すこし混乱しました。 やや、釈然としない部分はありますが、目的は達成できました。 どうもありがとうございました。 |