過去の桐井戸端BBS (桐ver.8)
22104 前項目の値で入力範囲の制限を変えたい あつみ 2003/09/01-14:44
初めて入室しましたあつみと申します。
桐をはじめプログラム自体初心者なので至らないところもあると思いますが、どうかよろしくお願いいたします。
桐ver8を使用しています。

[項目A], [項目B]があります。
[項目A]には、"89"・"90"の数値のどちらかしか入力しません。
@[項目A]=89 の場合→[項目B]には"30〜59"
A[項目A]=90 の場合→[項目B]には"0〜30"   
 が入力でき、それぞれ範囲外の数値を入力した場合は、エラーメッセージを出し、
範囲内の数値の再入力が出来るようにしたいのです。
[項目B]に、入力後イベントを作成したいのですが、どうしても@・Aの制限を書く条件式がわかりません。
それとも入力後イベントを使わないで一括処理にしたほうがいいのでしょうか?
どなたか教えて頂けないでしょうか?


22107 Re:前項目の値で入力範囲の制限を変えたい アックン 2003/09/01-16:56
記事番号22104へのコメント
あつみさん、こんばんは。アックンと申します。
私は久しぶりに入室して書いています。
よろしくお願いします。

フォームに入力後イベントを設定してみましょう。
イベントを設定するオブジェクトは、[項目B]をソースとするテキストオブジェクトです。
式を2通り書いておきます。お好みの方を利用なさってください。
なお、前提として、[項目A]には 89,90 のどちらかの値しか入力できないように設定済であるとします。
(以下、空白がずれてわかりづらいと思いますけど、ご自分でわかりやすいように修正なさってください。)

●式1
手続き定義開始 tB::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
 if ( .not( \
     ( [A] = 89 .and #num(&編集文字列) > 29 .and #num(&編集文字列) < 60 ) \
  .or ( [A] = 90 .and #num(&編集文字列) > -1 .and #num(&編集文字列) < 31 ) \
      ) \
   )
   メッセージボックス "入力エラー" , "入力した値が範囲を越えています。" ,\
             アイコン=i
   &編集文字列 = "" \
   &入力継続 = 1
 end
手続き定義終了

●式2
手続き定義開始 tB::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
 if ( #cond( [A] = 89 , \
       .not( #num(&編集文字列) > 29 .and #num(&編集文字列) < 60 ) \
      ) \
   )
   メッセージボックス "入力エラー" , "30〜59の値を入力してください。" ,\
             アイコン=i
   &編集文字列 = "" \
   &入力継続 = 1
else if( #cond( [A] = 90 , \
         .not( #num(&編集文字列) > -1 .and #num(&編集文字列) < 31 ) \
        ) \
   )
   メッセージボックス "入力エラー" , " 1〜30の値を入力してください。" ,\
             アイコン=i
   &編集文字列 = "" \
   &入力継続 = 1
 end
手続き定義終了
-----------------------
22108 Re:前項目の値で入力範囲の制限を変えたい アックン 2003/09/01-17:14
記事番号22107へのコメント
訂正です。
「1〜30の値を入力して・・」は「0〜30の値を入力して・・」が正しいです。(^^;
式はそのままで結構です。
ついでに、今回のコツを。
入力後イベントの時点では、まだ項目値が確定していないので、
式に項目[B]を使用せず、&編集文字列を使いましょう。
(例)
 X  [B] => 30
 ○  #num(&編集文字列) => 30

22114 【別解】前項目の値で入力範囲の制限を変えたい 佐田 守弘 2003/09/02-00:08
記事番号22104へのコメント
あつみさん
イベントでとのご希望ですが、この様な基本的な値の条件は、できれば表定義の中で
行う方が良いだろうとの理由で、別解を提示します。

その別解は行制約で項目Bの値範囲に制限を付ける方法です。
ただし、行制約のため1行の入力が終ってからでないと値の判定ができません。
多項もくの値を参照するので、項目制約ではできません。

方法:
項目[B]の行制約式に以下の条件式を記述して下さい。
([A]=89)*([B]>=39)*([B]<=59)+([A]=90)*([B]>=0)*([B]<=39)

「[項目]=<値>」の記述と乗算と加算で組み合わせているので、分りにくいと思いますので、解説しておきます。
・条件式は1または0の値を取る
「([A]=89)」のカッコの中は条件式ですが、条件式は真または偽に応じて1ないし0の値を取ります。
・乗算は論理積、加算は論理和
論理積(AND)は、乗算(かけ算)で、論理和(OR)は加算になります。
・上記の式の意味
[A]が89であって、[B]が39以上で59以下であるか(つまりAが89ならBは39〜59と同じ)
[A]が90であって、[B]が0以上で39以下であるか、いずれかである事。
という意味になります。
別の言い方に見えますが、これが求めているAの値でBの値の範囲を限定するという事と
同じ意味である事に気がつかれると思います。

佐田守弘(KS-00119)
22124 Re:【別解】前項目の値で入力範囲の制限を変えたい うにん 2003/09/02-10:16
記事番号22114へのコメント
>項目[B]の行制約式に以下の条件式を記述して下さい。
>([A]=89)*([B]>=39)*([B]<=59)+([A]=90)*([B]>=0)*([B]<=39)
>
>「[項目]=<値>」の記述と乗算と加算で組み合わせているので、分りにくいと思います
>ので、解説しておきます。

.andと.orで書いたほうがわかりやすいと思いますが^^;

22125 Re:【別解】前項目の値で入力範囲の制限を変えたい あつみ 2003/09/02-11:24
記事番号22114へのコメント
アックンさん、佐田さん、うにんさん、ご返事本当にありがとうございます。

アックンさんから教えて頂いた
 .not という演算子を使うと言う事がまったく思い浮かびませんでした。
一度覚えると、これから条件式を作る時、とても役立ちそうです。
 自分がなんとなくイメージしていた組み方と、いつか他の者にプログラムを引き継ぐ場合が
あるかもということを考えると(なにしろ皆素人なので・・)、式2を利用したいと思いました。

佐田さんから教えて頂いた
>イベントでとのご希望ですが、この様な基本的な値の条件は、できれば表定義の中で
>行う方が良いだろうとの理由で、別解を提示します。
とてもありがたいです。実は最初の時点で、なんとか表の中で定義できないかと思ったのですが、
行制約の使い方が今イチわからず、入力後イベントを使用しようと思いました。
恥ずかしながら行制約・項目制約の違い・使い方が初めて理解出来ました。

>・乗算は論理積、加算は論理和
>論理積(AND)は、乗算(かけ算)で、論理和(OR)は加算になります。
初めて知りました。勉強になります。

うにんさんのコメントでわかりました。
どちらを表記しても同じということですね。わかりやすい方で記入しようと思います。

自分としては、イベント・表定義の、どちらも"範囲外の数値を入力したらエラーが出る"の目標を達成しているので、
できるだけ表定義で設定を済ませたいと思っております。
あとは少しエラーメッセージの出る時が違うので、利用してる方の声も聞いてみたいと思います。

皆さんのおかげで本当に勉強になりました。
今回の書き込みで理解できた事がたくさんありました。
まだまだまだ桐もプログラム自体も勉強不足でわからない事だらけですが、
少しずつでも確実に理解を深めて行こうと思いました。ありがとうございました。


22130 他人の褌で相撲を取る しぼうかん 2003/09/02-19:54
記事番号22104へのコメント
あつみさん、こんばんは.

アックンさんのやり方の方は使い勝手が良くて
いろいろカスタマイズも出来ます。

佐田先生のやり方は何かの間違いで制限したいデータが
入力されてしまう事が無い為正しいデータの保持には有利だと思います。

※例えば入力後イベントの方法では誰かが間違って
テーブルでの入力をしてしまった場合には制約条件は働きません。

そこでアックンさんと佐田先生の両方の方法を併用してはいかがでしょうか?

これならレコード全てを入力した後で無くても入力データの制約を出来ますし、エラーメッセージも自由です。

また間違ったデータが入力されてしまう可能性も無いので
正しいデータのは保持にも問題が無い様に思います。

試して見た訳で大間違いかもしれませんが・・・

22135 Re:【別解】前項目の値で入力範囲の制限を変えたい 佐田 守弘 2003/09/02-23:14
記事番号22124へのコメント
うにんさん
>.andと.orで書いたほうがわかりやすいと思いますが^^;
仰る通り。

個人的にはこの様な書き方をする事が多いので、つい書いてしまいました。
次の様に書き改めます。

([A]=89) .and ([B]>=39) .and ([B]<=59) .or ([A]=90) .and ([B]>=0) .and ([B]<=39)

佐田守弘(KS-00119)


22136 名案ですね。 佐田 守弘 2003/09/02-23:16
記事番号22130へのコメント
しぼうかんさん
名案ですね。
表は表で制約を行っておき、重複するかもしれないけど、イベントでも
同じ様なチェックを行うのが、最善かも知れません。

イベントによるリアルタイムのチェックと、行制約による確実なチェックの両方が行えます。

佐田守弘(KS-00119)
22147 Re:他人の褌で相撲を取る あつみ 2003/09/03-10:26
記事番号22130へのコメント
しぼうかんさん、佐田さん ありがとうございます。

しぼうかんさんのアドバイス通り、
アックンさん、佐田さんから教えていただいた両方を併用しようと思います。

 レコード全てを入力した後で無くても入力データの
>制約を出来ますし、エラーメッセージも自由です。
>
>また間違ったデータが入力されてしまう可能性も無いので
>正しいデータのは保持にも問題が無い様に思います。
>

私どもの会社は製造業で、部品の大きさや角度を測り、規格をクリアしたものだけをデータに載せ、お客様に提出しています。
なので間違ったデータを入力する事はお客様の信頼を損ねてしまうので、確実なデータ入力とデータ管理が大切です。
なので二つの方法を併用するというアドバイスは、とても為になりました。

今回頂けた沢山のアドバイスを参考に、桐をもっと利用したいと思いました。
プログラムを作るということは、とても奥が深いですね。
頑張りたいと思います。

戻る