« 第7回 手順5 | トップページ | 第9回 完成 »

2008年5月22日 (木曜日)

第8回 手順6

今回は手順6ですが、これは手順5の続きとなります。以下に手順5の最終部分を再掲してみますので、思い出して下さい。

売価を「999」、原価を「123」として、「計算2」ボタンをクリック後、更に「%へ変換」をクリックすると、次の図のように、メッセージ・ボックスに二行にわたって二つの数値が表示されるはずです。二つの数値とそれに対応するround関数の部分を見比べて、その違いを自身で考えてみて下さい。ポイントは単純な算数の視点です!!


Itoh013



手順6

手順5で指摘した「単純な算数の視点」とは、


put round(fld “NeIre” * 100,2) & CR
put round(fld “NeIre”,2)* 100 after MSG

の二行の違いということです。どちらもスクリプトの実行でエラーがでないことは、メッセージ・ボックスに数値が表示されることで証明済みです。問題は表示された数値の「有効桁数」です。「put round(fld “NeIre” * 100,2) 」の結果は「87.69」であり、「put round(fld “NeIre”,2)* 100」の結果は「88」であるという点です。つまり「%表示」の為に「100」をどこで掛けるか、ということです。
或いは、どこで「100」を掛けたかによって、roundの引数2が異なってくるということです。つまり「put round(fld “NeIre”,2)*100」の引数2である“2”を「put round(fld “NeIre”,4)*100」の様に“4”とすれば、「put round(fld “NeIre” * 100,2) 」と同じ結果を得ることができます。
こうしたことは「目に見えない」エラー候補で、RunRevはチェックしてくれませんが、非常に良く起こすものです。「良く起こす」と言ったのは、スクリプトの書き手が見逃しがちなエラー候補ということで、本人が気づかないままスクリプトを書いている以上、何度見直しても中々原因が判らないまま、自身の欲している結果にならないということになります。式としてはどちらも「正しい」わけで、後はどちらが後で見直しやすいかという点でスクリプトを書くと言うことです。私は個人的には「put round(fld “NeIre” * 100,2) 」という書き方をお勧めします。何故ならば、手順5のround関数の説明のところで『引数「number」は実際の「数字」であっても、数値を含むコンテナ(例えば計算結果をだすためのフィールドを使った計算式)でも構いません。』と書いたように、引数1に当たる“number”はコンテナであっても構わないという処にあります。つまり先に%表示の数値を作っておいてから、その数値の有効桁数を設定するという方がコンテナを使った自然な流れだと思うのです。

ここまでの総まとめとして、先程手順5でつくった「%」ボタンに値入率をパーセントで表示するためのスクリプトを完成させてみましょう。
単純に今までのスクリプトをまとめていくと次の様になります。以下で太字で示した一行を追加するだけでスクリプトは完成します。



on mouseUp
put empty into fld “NeIre”
put fld “BaiKa1” into fld “BaiKa2”
if fld “Baika1” is not empty and fld “BaiKa1” > 0 \
and fld “GenKa” is not empty and fld “GenKa” > 0 then
put (fld “BaiKa2” - fld “GenKa”)/fld “BaiKa1” into fld “NeIre”
put round(fld “NeIre” * 100,2) into fld “NeIre”
else answer “You’ve got an Error !!” as sheet
end if
end mouseUp


この太字にした一行は、その前の行と同じ「into fld “NeIre”」が「put」の実行先に指定されているため、初心者にはかえってエラーを起こすのでは?と書き難いスクリプトかも知れません。しかし、「put XX into YY」という時に「into」は「前にあった値を書き換える」という意味で使うことを思い出せば、エラーにはならない生きたスクリプトであることが判るはずです。
また、コンピュータで実行されるプログラムは基本的に一行一行順番に実行されるので、「put (fld “BaiKa2” - fld “GenKa”)/fld “BaiKa1” into fld “NeIre”」が先に実行され「fld “NeIre”」には「fld “BaiKa2” - fld “GenKa”)/fld “BaiKa1”」の結果がまず入力され表示されます。次に「put round(fld “NeIre” * 100,2) into fld “NeIre”」が「fld “NeIre”」から値を持ってきて、round関数を実行しその戻り値をまた「fld “NeIre”」に入力し表示します。但し、コンピュータの計算速度(クロック周波数)が余りにも速いので、その画面の書き変わりが人間には認識できないだけなのです。

処で、上で説明した二行には「into fld “NeIre”」という表現の重複があり、スクリプトとしては誤りはないのですが、読み直した時になにかエレガンスさにかける嫌いがあります。そこでこの点をすっきりさせるべく次の様に書き換えてみます。



on mouseUp
put empty into fld “NeIre”
put fld “BaiKa1” into fld “BaiKa2”
if fld “BaiKa1” is not empty and fld “BaiKa1” > 0 and fld “GenKa” is not empty and fld “GenKa” > 0 then
マル1-- put (fld “BaiKa2” - fld “GenKa”)/fld “BaiKa1” into fld “NeIre”
put round(((fld “BaiKa2” - fld “GenKa”) / fld “Baika1”) * 100,2) into fld “NeIre” into fld “NeIre”
else

answer “You’ve got an Error !!” as sheet
end if
end mouseUp

上のスクリプトのマル1の部分にみられる「--」は、スクリプトの一行をコメントとする為の目印です。この目印をつけられて、コメントとされた行はスクリプトとして機能しません。従って、上の①のある一行はスクリプト実行時には無視されます。
コメントというと何かメモ書きのようなものを想像するかも知れませんが、このようにスクリプトをデバグなどで書き換えていく時に、書き換え前まではエラー無く実行されていた部分をコメント扱いにして、変更した部分を新しく付け加えていく、といった方法をよくとります。そうすることで、新たに書き換えた部分でエラーが発生するような時に、確実に実行できていたスクリプトに戻ることができるからです。

さてもう一つ要注意、つまりエラー発生の原因となるが、中々特定できない種の原因が「カッコの数」です。「put round(((fld “BaiKa2” - fld “GenKa”) / fld “Baika1”) * 100,2) into fld “NeIre” into fld “NeIre”」のように、コマンドや関数にカッコ付けをした時に右カッコと左カッコの数があわないとエラーになってしまいます。が、なかなかこの原因、つまりカッコの数があわないというのが見つけ難いものなのです。この辺りがコンピュータのコンピュータらしさ……。人間ならこんなの見逃しても正しく答えを出してしまうのに、コンピュータは見逃してくれません。まるで小学校の時の算数の先生のようですネ


最終系……スクリプトを完成させよう!!
さていよいよスクリプトを完成させる準備ができました。次回はもう一つのエラーに関して説明してスクリプトを完成させることにします。

|

« 第7回 手順5 | トップページ | 第9回 完成 »