みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
先日、ほぼ同様のタイトルで質問をさせていただき、一旦は解決できたのですが、
さらに改良を加えたときに思ったようにスクリプトが動いてくれず、悩んでおります。
https://fm-aid.com/bbs2/viewtopic.php?id=9745/
---------------------------------------------------------------
変数を設定 [$入力データ数]
カスタムダイアログを表示 ["入力データ数の設定"; "これから入力するデータ数を入力してください"; $入力データ数]
Loop
Exit Loop If [$入力データ数 = 0]
Exit Loop If [$入力データ数 = Abs ( $入力データ数 )]
Exit Loop If [$入力データ数 ≠ Ceiling ($入力データ数)]
新規レコード/検索条件
変数を設定 [$入力データ数; 値: $入力データ数-1]
End Loop
---------------------------------------------------------------
小数入力やマイナス数字を排除するように、上記のようなスクリプトで落ち着いていたのですが、
必要以上に大量レコードを作成できないようにしようと思い(今回は100超を排除)、Loop~End Loopの間に
以下の1行を追加したらスクリプトが動かなくなってしまいます。
Exit Loop If [$入力データ数 > 100]
どうしてよくないのかが解りません。
100より大きい数字を入れたらダイアログを出すなんてのも試しましたが、レコード自体は作られてしまうので、
根本解決したいと考えています。
お知恵をお貸しいただきたいと思っております。よろしくお願いします。
> Loop
> Exit Loop If [$入力データ数 = 0]
> Exit Loop If [$入力データ数 = Abs ( $入力データ数 )]
> Exit Loop If [$入力データ数 ≠ Ceiling ($入力データ数)]
> 新規レコード/検索条件
> 変数を設定 [$入力データ数; 値: $入力データ数-1]
> End Loop
これは
If [ $入力データ数 > 0 or $入力データ数 = Ceiling ( $入力データ数 ) ]
Loop
Exit Loop If [ $入力データ数 = 0 ]
新規レコード/検索条件
変数を設定 [ $入力データ数 ; 値: $入力データ数 - 1 ]
End Loop
End If
この方がスマートでしょう。
100以上をエラーにするのなら
Ifステップの条件に加えればいいですね。
強制的に100に変更するなら、Ifステップの次で変更すればいいでしょう.
Offline
チポさん
Ifの条件の中に入れようと思い、以下のように書いたのですが、入力した数だけ普通にレコード作成してしまいます。
If [ ($入力データ数 > 0 or $入力データ数 = Ceiling ( $入力データ数 )) and ($入力データ ≤ 100) ]
プログラミングはほとんどやったことがないので、数学の数式的な発想で書いてしまっているのがまずいのだろうと思っています...
アドバイスいただけないでしょうか?
・ カスタムダイヤログを表示 [フィールド入力:テーブル::ダイヤログ入力フィールド]
・ 変数を設定 [$入力データ数;値:テーブル::ダイヤログ入力フィールド]
・ 変数を設定 [$入力データ数;値:Min(Int(Max($入力データ数;0));100)]
・Loop
・ Exit Loop If [$入力データ数=0]
・ 新規レコード/検索条件
・ 変数を設定 [$入力データ数;値:$入力データ数-1]
・End Loop
Last edited by Hiro (2019-10-31 20:36:40)
Offline
ああ、ごめんなさい、間違えていました。
> If [ $入力データ数 > 0 or $入力データ数 = Ceiling ( $入力データ数 ) ]
これは、
If [ $入力データ数 > 0 and $入力データ数 = Ceiling ( $入力データ数 ) ]
でなければダメです。
訂正をお願いいたします。
さらに、
100より大きい数をエラーにするのなら
If [ $入力データ数 > 0 and $入力データ数 = Ceiling ( $入力データ数 ) and $入力データ数 <= 100 ]
とすればいいですね。
Offline
Hiroさん、チポさん
ありがとうございます。
いずれの方法も試したのですが、上限値より大きい数値を入れても容赦なくその分レコードを作成してしまいます。
チポさんにいただいた案のIfで始まる行とLoopで始まる行の間に
Else if [$入力データ数 <= 100]
を追加してみたりしたのですが、スクリプトが動かずです。
ちなみにWin10+FM18の環境で使ってます。
Offline
>#1『必要以上に大量レコードを作成できないようにしようと思い(今回は100超を排除)』
を請けて、(※「最大作成数制限」と理解して)
>#4内 式: Min(Int(Max($入力データ数;0));100)
この式は、「100以上の正数」データ指定でも、最終的に必ず「100」を返しますから、
100を超えることは有り得ません。
>・ 変数を設定 [$入力データ数;値:Min(Int(Max($入力データ数;0));100)]
ステップで、変数「$入力データ数」に実際何が入っているか?確かめて下さい。
Last edited by Hiro (2019-11-01 11:57:08)
Offline
> Else if [$入力データ数 <= 100]
>
> を追加してみたりしたのですが、スクリプトが動かずです。
スクリプトが動かないのは、判定でスルーされたからだと思いますよ。
それが正しい動きでしょう。
Ifステップの
$入力データ数 <= 100
これにゴミが入っているとか、確認してみてください。
私の提案は100より大きい数字の場合スルーしますが、
Hiroさんの式は、100に変更して実行されます。
Offline
使い始めて1ヶ月経つか経たないので、FMの機能の多くを知らないところもあり、Hiroさんのいう『ステップで~確かめて下さい。』のことが
なんのことか解らず、ガチャガチャといじったのですが、スクリプトデバッガのデータビューアというところで確認するということだったのですね。
変数に入った数字やステップごとの動きが判るようになりました。
Hiroさんのご提案の場合、100超の数字をいれたとしても、100とならずに入力した数字がそのまま入っていました。
そして、変数に小数を入れた場合は、Exit Loop ifの判定条件を $入力データ数 <= 0 をしないとスクリプトが延々動き続けてしまいました。
個人的には、小数を入れた場合は入力値として排除したいと思っています。
チポさんのご提案のものも念入りに記述内容をチェックして試したのですが、変数にどんな数字をいれた場合でも、Ifの判定ですぐにEnd ifまで飛んで行ってしまいます。
Last edited by わさび茶漬け (2019-11-01 13:49:06)
Offline
> 変数にどんな数字をいれた場合でも、Ifの判定ですぐにEnd ifまで飛んで行ってしまいます。
??
スルーしてレコードが作られないのでしょうか?
前には作られちゃうと書かれていましたが。。。??
試しに程度ですが、
Ifステップの前に
変数を設定 [ $入力データ数 ; 値: GetAsNumber ( $入力データ数 ) ]
を入れて、強制的に数値に変えてみてください。
Offline
チポさん
変数を設定 [ $入力データ数 ; 値: GetAsNumber ( $入力データ数 ) ]を入れたら、ここ数日の悩ましい状況が完全に解決でき
イメージ通りの動きをしてくれるようになりました!!
あと、Hiroさんご提案の方法を試してダメだったのも、カスタムダイアログを表示の行よりも前の変数定義のところでご提案の記述を
入れていたことが原因でした。
それを直したら、Hiroさんの解説通りの動きをしてくれました。
本当にありがとうございました。すごく勉強になりました。
Offline
Pages: 1
[ Generated in 0.010 seconds, 10 queries executed - Memory usage: 546.52 KiB (Peak: 567.42 KiB) ]