過去の桐井戸端BBS (桐ver.8)
13750 イベント内でのif文の式の書き方 ひろこ 2001/10/31-09:33
イベント内でテーブルの選択総件数を求め(#総件数)
総件数によって印刷の終了ページを変更したい為、

手続き定義開始 コ一覧印刷::マウス左クリック(略)
&印刷用件数=#総件数
if (1<=&印刷用件数<=10)
レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=1
else if (11<=&印刷用件数<=20)
レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=2
else if (21<=&印刷用件数<=30)
レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=3
else if (31<=&印刷用件数<=40)
レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=4
end
手続き定義終了

としたのですが、、最初のif文の命令が実行されてしまいます。
(&印刷用件数が18あっても1枚しか印刷されない)
&印刷用件数は確認をかけた所しっかりと数値が戻ってきていました。
&印刷用件数は整数で宣言してあります。

この元フォーム自体がグループ化してあり「一覧印刷」ボタンを設置
現在選択表示中のグループを印刷できる....といった具合にしたいのですが、
if文とは、比較式(条件式?)を選択できない物なのでしょうか?

else if (11<=&印刷用件数<=20)←このかっこの中の記述を
どうすればいいのかよく解りません(?_?)

13751 Re:条件式と比較式 悲しげ 2001/10/31-10:05
記事番号13750へのコメント
どもっ、ひろこさん
「比較式」を使えるところは、11<=&印刷用件数<=20 のような記述ができますが、
「条件式」で書くべきところは、次のようにします。
-----------------------
手続き定義開始 コ一覧印刷::マウス左クリック(略)
&印刷用件数=#総件数
if (1<=&印刷用件数 .and &印刷用件数<=10)
レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=1
else if (11<=&印刷用件数 .and &印刷用件数<=20)
レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=2
・・・・・・
(以下略)
-----------------------

でも次のようにした方が簡単かも。
-----------------------
手続き定義開始 コ一覧印刷::マウス左クリック(略)
 &終了頁=#切り上げ(#総件数,-2)
 レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=&終了頁
手続き定義終了
-----------------------
または
 レポート印刷 "仕様書.rpt",開始ページ=1,終了ページ=#切り上げ(#総件数,-2)
ってのが通れば、1行で済みます(が挙動未確認)。

13753 Re:条件式と比較式 ひろこ 2001/10/31-11:26
記事番号13751へのコメント
悲しげさん、いつもお世話になってます。
あれれ???昨日の時点で一生懸命「.and」
を使って記述してたんですがうまく動作しなかったんです。

所が
>else if (11<=&印刷用件数 .and &印刷用件数<=20)
else if (&印刷用件数>11 .and &印刷用件数<20)
else if (&印刷用件数=>11 .and &印刷用件数<=20)

どれでも大丈夫でした。うぅぅ〜ん、、昨日も試してみたはずなのに....
こんな初歩的な質問でごめんなさい。でした。

それと、あえて変数にする必要がなかったですね(^^;;
         ↓      ↓
else if (11<=#総件数 .and #総件数<=20)

と、、悲しげさんの記述をヒントに作ってみました。
これならかなり行数を減らす事が出来ました。
最初に記述した物だと、考えたらデータが増えていった時に困るんですよね....
(1000件はいかないだろう・・・という事で今は100の位まで)

手続き定義開始 コ一覧印刷::マウス左クリック(略)
if(#総件数=<90)
レポート印刷 "仕様書.rpt",\
開始ページ=1,終了ページ=#整数(#部分列(#文字列(#切り上げ(#総件数,-2),2),1,1))
else if(#総件数=>91)
レポート印刷 "仕様書.rpt",\
開始ページ=1,終了ページ=#整数(#部分列(#文字列(#切り上げ(#総件数,-3),3),1,2))
end
手続き定義終了

という感じでいいんでしょうか?動作確認はばっちりでした。が、、
終了ページ以降の書き方がこれ以上すっきりさせる事とかは出来るのでしょうか?
これが正当方法?ではないですよね。そういう所がまだよく解りませんし、
悲しげさんのように別の書き方があるというヒントを頂けると、自分の中でそこから先が広がります。
今後も宜しくお願いしまっすm(_ _)m

有り難うございました。
13754 Re:条件式と比較式 悲しげ 2001/10/31-12:04
記事番号13753へのコメント
あぅ、全然勘違いでした。(^^;)

  ・・・,終了ページ=#ceil(#総件数/10)

でどうでしょう?(これまた挙動未確認ですが)
レポート定義の明細行数に可変対応したければ、例えば

  &行数=10
  ・・・,終了ページ=#ceil(#総件数/&行数)

13755 Re:条件式と比較式 【多遊】 2001/10/31-12:12
記事番号13753へのコメント
細かい計算式は別として
#INT((#総件数+9)/10)
これだけで意味が伝わるかな?

13757 Re:条件式と比較式 ひろこ 2001/10/31-13:59
記事番号13754へのコメント
悲しげさん、多遊さん、こんにちは。

#ceil(#総件数/10)
#INT((#総件数+9)/10)

どちらもバッチリでした。
#ceilは小数点部分を整数に切り上げ
#INTは小数点部分切り捨て(の為の+9)
(どちらも10で割っているから)

あっているでしょうか?
どちらにしても今回の一覧表印刷はデータが10件/1ページ単位
だったから「÷10」なんですよね?これが5件/1ページ単位
だったら
#ceil(#総件数/5)
#INT((#総件数+4)/5)
という事?

有り難うございました。
(^^;;; 違ったら違うよ!!と指摘してください。
お願いします。
13766 Re:条件式と比較式 【多遊】 2001/10/31-22:23
記事番号13757へのコメント
さいわい動いたようでなによりですが、1ページ10行として
INT((#総件数-1)/10)+1 が、普通でしょう
例えば1ページ7行の場合は、「INT((#総件数-1)/7)+1」のようにします。
「-1・+1」は、共通です。

このほかに、「int と mod 」の使い方を、覚えられたらいいですよ。

例えば、1ページに4行印刷印刷できたとして、7番目は
何ページの何行目に印刷されるか等の計算時に役にたちます。
2ページ目の3番目ですね。

では、12行目は・・・3ページ目の0番目と出ませんか?
正解は3ページ目の4番目ですね。

あまり説明は必要ないかもしれないので、一言で、いうと
「先に−1してあとで+1する計算式」を利用してみてください。


13769 補足>この条件式の解釈のされ方 佐田 守弘 2001/10/31-23:26
記事番号13750へのコメント
ひろこさん
質問の本題からは外れますが、
>if (1<=&印刷用件数<=10)
と書かれた括弧内の条件式がどの様に解釈されるかについて補足します。
正しい書き方は、悲しげさん、【多遊】さんのコメント通りなのですが、
誤って書かれた上記の式も、質問にも書かれている通り、文法エラーにはならずに実行され、
意図しない結果が得られるはずです。

そこで、どうしてその様になるのかについて補足解説しておきます。
まず、ひろこさんが書かれた両側に比較演算子が付く書式は、一般的には比較式の書式です。
しかしながらifコマンドの括弧の中に記述できるのは、条件式です。
ですから桐はこの記述を無理やり条件式として評価します。
(評価するとは計算するとの意味です)

ここでは分かりやすく「&印刷用件数」の値が仮に5だと仮定しましょう。
上記に書かれた式を条件式として解釈しようとすると、次の様な解釈に
なります。
 (1<=&印刷用件数)<=10
なぜなら条件式も計算式などと同様に左側から評価するからです。
括弧を付けたのはその意味です。

つまり、まず最初に
 (1<=&印刷用件数)
が求められます。変数の値を5だとしたら、(1<=5)ですから条件式は論理値の「真」になります。
桐では論理値の「真」は1ですから、この条件式の値は1と同値です。

次いで、後の方の比較演算子で、(1<=5) <=10 が評価されます。
左辺は上記の通り1ですから、条件式は 1<=10 になり、当然ながらこれも真です。
他の値で試してみても同じですが、変数の値がいかなる場合でも、
この条件式は真になりますから、ifコマンドの後のコマンドは
必ず実行される仕組みになります。

佐田守弘(KS-00119)

戻る