過去の桐井戸端BBS (桐ver.8)
10791 日付で絞り込んだとき間違った入力を判定する方法 HERB 2001/04/08-16:46
日時型データを絞り込むため、サブフォームを作成、通常は非表示にしておき
絞込開始、オブジェクト操作で表示させ、フォームテキスト数値型項目、年、月、日の
ソースにそれぞれ変数、&開始年、&開始月、&開始日とする。

イベントで。

絞り込み [日付]<#日数加算(#日時値生成(&開始年,&開始月,&開始日),1)

としています、
入力した値 、開始年2001、開始月4、開始日8のように実在する日付なら良いのですが、
入力を間違えて、開始年2001、開始月4、開始日31のように実在しない日付を入力した場合の
エラーを返すような判定方法がありますか。

よろしくお願いします。


10794 Re:#日時値生成で間違った入力を判定する ONnoji 2001/04/08-19:11
記事番号10791へのコメント

>日時型データを絞り込むため、サブフォームを作成、通常は非表示にしておき絞込
>開始、オブジェクト操作で表示させ、フォームテキスト数値型項目、年、月、日の
>ソースにそれぞれ変数、&開始年、&開始月、&開始日とする。
>イベントで。
>絞り込み [日付]<#日数加算(#日時値生成(&開始年,&開始月,&開始日),1)
>としています、入力した値 、開始年2001、開始月4、開始日8のように実在す
>る日付なら良いのですが、入力を間違えて、
>開始年2001、開始月4、開始日31のように実在しない日付を入力した場合の
>エラーを返すような判定方法がありますか。

日時型での動作は確かめていませんが次のような方法で判定できませんか?
-------------------------------------
*&Date,&ChkDateは日時型とします。

&Date=#日時値生成(&開始年,&開始月,&開始日)
&ChkDate=#日数加算(&Date,1)
&ChkDate=#日数加算(&ChkDate,-1)
if (&Date = &ChkDate )
* &Dateの値はは正しい日付
else
* &Dateの値は誤っている日付
end
-------------------------------------
私の場合は日時型ではなく日付文字列で処理していますが上手くいっています。
ただし日付のフォーマットに注意が必要だったと思います。

10800 Re:#日時値生成で間違った入力を判定する toshi-chan 2001/04/09-02:39
記事番号10791へのコメント
HERBさん、こんばんは。

「エラーを返す」ということですが、具体的にどのような結果を望んでいるのでしょうか。
開始年2001、開始月4、開始日31 とした場合、
       #日時値生成(&開始年,&開始月,&開始日)
で、エラーになりませんか。実在しない日時値は生成できないと思うのですが。
桐は「テキストオブジェクトに数値の入力はできるけど、絞り込みコマンドの箇所でエラーになる。」
という挙動を示すと思います。

代わりにこんなのはいかがですか。
フォームテキスト数値型項目はやめて、日時型の項目を作ってしまいます。
そうしますと、実在しない 2001/4/31  を入力すると、桐はその場ではねてくれるはずです。
(つまりデータが確定しないので、先に進めない。)
10802 Re:#日時値生成で間違った入力を判定する ONnoji 2001/04/09-03:59
記事番号10794へのコメント
>>絞り込み [日付]<#日数加算(#日時値生成(&開始年,&開始月,&開始日),1)
>>
>>としています、入力した値 、開始年2001、開始月4、開始日8のように実在す
>>る日付なら良いのですが、入力を間違えて、
>>開始年2001、開始月4、開始日31のように実在しない日付を入力した場合の
>>エラーを返すような判定方法がありますか。
>

HERBさんへ

KU1090:コマンドの形式に誤りがあります
まず、首記のエラーは日時値生成()関数で有り得ない日付を設定した場合のことだと後になって気がつきました。
気がつくのがおそくてごめんなさい。

エラーの対処ですが、
エラーを検知するのは装置に対するものに限定するべきです。
それ以外のエラーは作り手側で処理するものだと思います。

エラーを回避する手順を次に示しますので参考にして下さい。

変数宣言 固有,数値{&g年,&g月,&g日}
変数宣言 固有,日時{&gDate}
変数宣言 固有,文字列{&gstrDate,&gstrChkDate}
&g年=2001,&g月=2,&g日=29 */KU1090:コマンドの形式に誤りがあります */
&gstrDate = #連結( #str(&g年),"年",#str(&g月),"月",#str(&g日),"日" )
&gstrDate = #日付( &gstrDate,4 )
確認 "入力した日時値を文字列に直すと:"+&gstrDate + "です"

&gstrChkDate = #連結( #str(&g年),"年",#str(&g月),"月",#str(&g日),"日" )
&gstrDate = #日付( #str( &gstrChkDate ),4 )

確認 "チェック文字列は" + &gstrChkDate
確認 &gstrChkDate + "と" + &gstrDate + "を比較します"
if ( #num(&gstrChkDate) = #num(&gstrDate ))
確認 #str(&gDate) + "は存在する日付です"
else
確認 #&gstrChkDate + "は存在する存在しない日付です"
end


10807 Re:#日時値生成を使う理由 HERB 2001/04/09-12:34
記事番号10800へのコメント
ONnojiさんへ、HERBです。

> エラーの対処ですが、
> エラーを検知するのは装置に対するものに限定するべきです。

ここで言う、装置とは何に対することでしょうか?もう少し説明いた
だけませんか。

> それ以外のエラーは作り手側で処理するものだと思います。

エラーを回避する手順を参考にして考えてみます、アドバイスありがとうございました。


toshi-chanさんへ、HERBです。

> 「エラーを返す」ということですが、具体的にどのような結果を望
> んでいるのでしょうか。

#日時値生成を使う理由は、外部DBでSQLデータを絞り込んでいます、
絞り込みはパラメーター変数を使い、開始年、開始月を数値型データとして絞り込みます、
外部DBで使える関数が桐で使える関数とは違い使える関数に制限があります。

外部DB表の定義は結合表と同じようにできます、#年、#月関数は使えます、
SQL日時型データ項目を計算項目で日時部分から年、月をそれぞれ数値型データにし
パラメーター変数として絞り込みを行っています。

そのため日時型データを使わず年月日をそれぞれ数値で選択フォームに入力しています、
外部DB表を開き桐に読込、桐側で読み込んだ日時型データをさらに絞り込みます、
その時日時生成関数を使います、
この時点で言われるようにエラーを桐が返してきます、
エラーがでないようフォームで入力したあと、何らかの方法で入力された数値データが
実在する日付と合っているかどうかを確認したかったのです。


10808 Re:#日時値生成を使う理由 ONnoji 2001/04/09-14:06
記事番号10807へのコメント

>ONnojiさんへ、HERBです。
>> エラーの対処ですが、
>> エラーを検知するのは装置に対するものに限定するべきです。
>ここで言う、装置とは何に対することでしょうか?もう少し説明いた
>だけませんか。

HERBさん。こんにちはONnojiです。

意図することがうまく伝わらなかったようで恐縮です。
これは桐とは限定しないで開発言語に対する私の考えですが...。

ON error のような記述が可能な言語が多いと思います。
ですが、ファイルが存在しない場合に使用したり、
シンタックスエラーのレベルにまで使用したりする例が、
多々見受けられます。

しかし、ファイルが存在するか否かはON errorを使用しなくてもわかるはずです。
ましてシンタックスエラーにON errorを使うのは論外です。
どうやってDEBUGするのか不思議です。
私としてはこういった場合にはON errorを使わないようにしています。

一方、ネットワークやプリンタなどいった装置に対しては、
ON errorを使うのが妥当だと思います。

以上はあくまでも私個人の考えです。
プログラムの考え方は人それぞれで違います。
そういう考え方もあるのかなという程度に思ってください。

<追伸>
前回の一括の例は正しく動かないと思います。ごめんなさい。
あらためて以下に示します。
桐の一括処理に貼りつけてデバッグ実行してみてください。


*これは一括処理です。
変数宣言 固有, 数値{&g年,&g月,&g日}
変数宣言 固有,文字列{&gstrDate,&gstrChkDate}
&g年=2001,&g月=4,&g日=30 
&gstrDate = #連結( #str(&g年),"年",#str(&g月),"月",#str(&g
日),"日" )
&gstrDate = #日付( &gstrDate,4 )
確認 "入力した日時値を文字列に直すと:"+&gstrDate + "です"

&gstrChkDate = #連結( #str(&g年),"年",#str(&g月),"月",#str(&g
日),"日" )
&gstrDate  = #日付( #str( &gstrChkDate ),4 )

確認 "チェック文字列は" + &gstrChkDate
確認 &gstrChkDate + "と" + &gstrDate + "を比較します"

if ( #num(&gstrChkDate) = #num(&gstrDate ) )
確認 &gstrChkDate + "は存在する日付です"
else
確認 &gstrChkDate + "は存在しない日付です"
end


10809 Re:#日時値生成を使う理由 toshi-chan 2001/04/09-14:47
記事番号10807へのコメント
HERBさん。

私は外部DBを使用したことはありませんが、なんとなくわかってきました。
少しピントのずれたコメントで失礼しました。ONnoji さんとは別の方法を提案します。

桐のフォームには、やっぱり日時型のテキストオブジェクトをつくります。
ソースは日時型の変数 &日付 とします。
こうすれば、入力の段階で存在しない日付に対してエラーを返すことができます。

さて、入力が完了すると、&日付 は絶対に存在する日付です。
ここで下記のようにして年、月、日の値を取り出します。

代入 &開始年=#年( &日付 )
代入 &開始月=#月( &日付 )
代入 &開始日=#日( &日付 )

#年、#月、#日は、いずれも日時型データを引数にすることができ、かつ、数値型の値を返します。
外部DBに対してはこの値を使用して絞り込みを行い、桐側では
&日付 を使用して絞り込みをすればうまくいくのではないでしょうか。
プログラムをいろいろ書かなくても済むような気がするのですけど。

10813 Re:イベント作成してみました HERB 2001/04/09-17:45
記事番号10809へのコメント
HERBです。、ONnojiさんのアドバイスを参考に以下、イベントを作成してみました。

手続き定義開始 取込実行 ()
ケース開始
ケース (&開始月>12)
メッセージボックス "月指定エラー",\
        #文字列(&開始月)+"月 存在しない月を指定しています。",\
        アイコン = ?,ボタン指定 = 1,&YN
        &確認 = 1

ケース (#数値(#文字列(&開始年)+#文字列(&開始月,2)+#文字列(&開始日,2))>\
#数値(#日付(#月末(#日時値生成(&開始年,&開始月)),4)))
メッセージボックス "月指定エラー",\
        #文字列(&開始年)+"年"+#文字列(&開始月)+"月"+#文字列(&開始日)+\
"日 存在しない日付を指定しています。",\
        アイコン = ?,ボタン指定 = 1,&YN
        &確認 = 2

ケース (#数値(#文字列(&開始年)+#文字列(&開始月,2)+#文字列(&開始日,2)\
)<19981201)
メッセージボックス "月指定エラー",\
        #文字列(&開始年)+"年"+#文字列(&開始月)+"月"+#文字列(&開始日)+\
"日 データのない過去日付を指定しています。",\
        アイコン = ?,ボタン指定 = 1,&YN
        &確認 = 3

ケース その他
        &確認 = 4

ケース終了

ケース開始
ケース (&確認=1)
&開始年=#未定義,&開始月=#未定義,&開始日=#未定義

ケース (&確認=2)
&開始年=#未定義,&開始月=#未定義,&開始日=#未定義

ケース (&確認=3)
&開始年=#未定義,&開始月=#未定義,&開始日=#未定義

ケース (&確認=4)
*通販システムからパラメータ変数により、日付指定フォームで\
指定した月データを取り込む
外部DB 接続,ODBC = "SQL_Server",\
     ユーザ名 = "",パスワード = "",\
     接続ハンドル = &hODBC,終了状態 = &OK

ケース終了

フォームテキストを数値型にこだわってみました、まだ思い通りに動かず試行錯誤しています、
自分なりに検証はしていますが、アドバイスありましたらよろしくお願いします。

ONnojiさん
>> エラーを検知するのは装置に対するものに限定するべきです。

解説ありがとうございました。

戻る