ゴミの日トップ|手順0|手順1手順2手順3
プログラムを作成する前に・・・考えましょう
この辺はサラリと・・・
「何がしたいか・何を作りたいか」を、考えましょう。漠然とでいいです。
結構これで、完成までの近道が見つかります。
 今回の例で説明すると、最初はカレンダーを作成し、途中から表の表示場所を追加します。
これが、最初の構想段階で「後で表部分を追加する」が無い場合、画面一杯のカレンダーを作成するかも知れません。
オブジェクトの配置やサイズ・フォントのサイズなど全面的な見直しの必要が出てきます。これは大事ですね。

 変数名やオブジェクト名。できるだけ名前を見て内容のわかるものにしましょう。確かに「A・B・C」や「1・2・3」などが簡単ですが、あとで、修正する事になると大変苦労します。特にイベントの名前まで利用していた場合、エラーが出ず、ただ実行されない場合もあります。
このエラー(?)は、なかなか見つけづらいものです。

 逆に、計算式で利用するような事が想定されれば、連番が便利な場合もあります。

 変数の利用方法。「わかりやすい名前を」と、書きましたが、桐には配列変数もあります。

例えば、月々の売り上げを変数に代入する場合を考えてみましょう。変数を「&売上1・&売上2・・&売上12」の12個準備して
 &売上1=1月の売り上げ
 &売上2=2月の売り上げ
 &売上3=3月の売り上げ
     ・・・
 &売上12=12月の売り上げ ・・・このようにすることも可能ですが、

通常は、配列変数「&売上[12]」を準備して
 &売上[1]=1月の売り上げ
 &売上[2]=2月の売り上げ
 &売上[3]=3月の売り上げ
     ・・・
 &売上[12]=12月の売り上げ ・・・このように書きます。

今回のカレンダーの日付やゴミの日の区分は配列変数を利用して設定していきます

次に変数の種類。桐には変数の種類は「文字列・数値・通貨・整数・日時・時間」他が、あります。

 ・文字列:文字の代入(4000 文字まではいります)
 ・数値 :数値の代入(±10の124乗(有効桁数:16 桁)
 ・通貨 :数値の代入(ただし通貨記号処理、3桁区切りコンマ処理がことなります範囲は同等です)
 ・整数 :整数の代入(-32768 〜 32767の範囲ないです)
 ・日時 :日時の代入(西暦 1年 1月 1日 0時 0分 0.000秒 〜 西暦 65535年 12月 31日 23時 59分 59.999秒の範囲)
 ・時間 :時間の代入(- 65535日 23時 59分 59.999秒 〜 65535日 23時 59分 59.999秒の範囲)
 他(長整数・実数)は、ヘルプ参照下さい

計算式の例。通常の四則計算(+−×÷)他、たくさんの関数を利用した計算も行えます。

 ・計算例1・・普通の計算
  「3+5=8、4×5=20」小学校で習ったような計算もできます(もちろん複雑な計算もできます)
  ただ、式の書き方が、プログラム風です。左側に答えが入り、右側に式を書きます
  &数値変数a=5
  &数値変数b=3
  &数値変数c=&数値変数a+&数値変数b・・・これで、&数値変数cに8が入ります

 ・計算例2・・文字列も計算できます
  &文字列変数d="東京"
  &文字列変数e="駅"
  &文字列変数f=&文字列変数d+&文字列変数e・・・これで、&文字列変数fに"東京駅"が、入ります
  ただし「引き算・掛け算・わり算」は出来ません

 ・計算例3・・文字と数字の足し算は、・・・・できません。
  &数値変数g=95
  &文字列変数h="windows" このような場合
  「&文字列変数h+&数値変数g」は、出来ませんが、いったん数値を文字列に直す「#文字列(&数値変数g)」を利用して
  「&文字列変数h+#文字列(&数値変数g)」とすることで、"windows95"という答えを出すことが、できます

 ・計算例4・・文字と数字の引き算は、・・・・これもできません。
  &数値変数i=5
  &文字列変数j="95" このような場合
  「&文字列変数j−&数値変数i」は、出来ませんが、いったん文字列を数値に直す「#数値(&文字列変数j)」を利用して
  「#数値(&文字列変数j)−&数値変数i」とすることで、「90」という答えを出すことが、できます

  
これだけで? ラッキー!!他にもまだ、たくさんありますが、上記の数値と文字の相互変換関数を覚えるだけで、90%くらいの式を利用出来ます。是非覚えてください

また、変数は、一度代入したら次に変更するまで同一値で利用できる物や、コマンド(プログラム)の内容や操作で随時更新されるものもあります。ご注意下さい。その他の変数や、計算式は、利用するとき説明致します


プログラム流れの説明

プログラム開始 フォーを開く。これで、表・フォーム・イベントが、開かれ実行されます
自動実行は、「名札 メイン」・「フォーム開始」などです
1.初期設定 変数設定・・常に使用する変数は、イベントの、「名札 メイン」。ここで、設定します
(ある手続き内で使用する場合は、その手続きに入ってから設定してもけっこうです)
変数の初期値を設定
(たとえば最初に起動したとき、○年△月を表示するとか、決めておきます)
2.フォーム表示 既存設定データの読み込み
(表データを配列変数へ読み込みます)
カレンダーの表示・・注1
(変数に日付を代入します)
通常ここで、画面表示後とまっています。以下のコマンドボタンの選択により処理を行います
3.月・年の増減 現在表示されている年月変数を、1ヶ月または1年の増減を行いカレンダーの表示を呼び出します
4.印刷 印刷ボタン(2種類)の選択により、データを書き出す→印刷表へ読み込む→レポート印刷の順に処理を行います
5.設定 画面右側・表編集エリアの入力を可能にし、修正・追加などの会話処理が、できるようにします
6.更新 入力されたデータを判断し、再度データを読み込みカレンダーの表示を行います
判断処理は、
・週のところに、「毎週」の文字があれば、「1〜5」へ変更します
・配列変数の大きさとデータの行数をチェックします
・同じ日(曜日)に、複数の設定がされてないかを調べます
・最後に、配列変数にデータを読み込みます(この処理は2.フォーム表示のデータ読み込みと同じです)
ここで、重大なエラー時は、エラーフラグをたてます。
7.終了 プログラムを終了します
その他 イベントの処理が一部あります
注1.
カレンダー表示
年月日のデータを参照し、カレンダーの表示を行います
カレンダー表示後、ゴミの日を表示するプログラムを呼び出します。
ただし、エラーフラグがたってる場合はゴミの日の表示は行いません
※ エラーフラグは、後半のゴミの区分入力時から有効です

本当はフローの方がわかりやすいのでしょうが申し訳ございません。


桐の日時操作関数の、主なものを紹介します<抜粋>
#日時値 現在の日付と時刻を取り出します。
#曜日( 【 str | tmst 】 ) 曜日を求めます。
#月末( 【 str | tmst 】 ) 月末の日付を求めます。
#西暦年( 【 str | tmst 】 ) 西暦年の値を取り出します。
#元号年( 【 str | tmst 】 ) 元号年の値を取り出します。
#年( 【 str | tmst 】 ) 年の値を取り出します。
#月( 【 str | tmst 】 ) 月の値を取り出します。
#日( 【 str | tmst 】 ) 日の値を取り出します。
#年数加算( 【 str | tmst 】 , num ) num 年後の日付を求めます。
#月数加算( 【 str | tmst 】 , num , n ) num か月後の日付を求めます。
#日数加算( 【 str | tmst 】 , num ) num 日後の日付を求めます。
#日時値生成( y , m , d , h , n , s ) 年、月、日、時、分、秒の各数値から、日時値を生成します。
上記紹介関数は、桐で使用できる中のごく一部です。本当にカレンダーを作るために桐があるみたいですね。
桐には、他にも便利な関数が揃ってます。ヘルプなどで参照下さい。


桐の関数以外の計算式

計算式の説明 カレンダー用計算式の説明の前に、円の面積の公式は覚えてますか?。円周率は・・・・・
別に、覚えてなくてもいいんです。「必要な内容が異なるからその都度作成していけば」と、安直な考え方でとりかかります。

それでは、安直な説明

説明用
カレンダー
             
             
             
    ←ここで、37個

桐では、年月日がわかれば、その日の曜日を求める関数があります。それを利用して、1日〜月末までのカレンダーを作成することにします

カレンダーは、1日の曜日によって、内容が変わりますが、土曜日から始まって、31日までの月でも、左の水色の中に入ります。したがって、配列変数は、37個準備しています


それでは、イベント(kev)で使用されてる計算式を紹介いたします

カレンダー表示用
計算式
  繰り返し &i=1,37
    if(&i+1-&月初曜>=1 .and &i+1-&月初曜<=&月末)
      &日t[&i]=&i+1-&月初曜
    else
      &日t[&i]=#u
    end
  繰り返し終了


 <カレンダー用計算式>
プログラムの詳細は、イベント説明の中に記載してありますが、計算式「&i+1-&月初曜」の説明を、簡単に紹介します
&iは、「ABCDEFG」が順にはいります。1〜37は、変数が設定してある数です。
&月初曜には、「日=1・月=2・・・土=7」が、入ります。そして、Aの場所(変数1)〜順に、計算を行い、1日から月末まで変数代入します。仮に、その月の1日が「木曜日」の場合、計算式は

Aの場所=A(1)+1−&月初曜(5)・・・−3
Bの場所=B(2)+1−&月初曜(5)・・・−2
Cの場所=C(3)+1−&月初曜(5)・・・−1
Dの場所=D(4)+1−&月初曜(5)・・・ 0
Eの場所=E(5)+1−&月初曜(5)・・・ 1
Fの場所=F(6)+1−&月初曜(5)・・・ 2
Gの場所=G(7)+1−&月初曜(5)・・・ 3
Hの場所=H(8)+1−&月初曜(5)・・・ 4

以上のように、「Eの場所」が、1日ということがわかります。

画面の変数がA(1)〜始まっていて、その月の開始曜日がわかる条件で、どこから始まるかを計算式にしているだけです。
あまり式はのことは深く考えず、公式程度にお考え下さい


ゴミの日表示用
計算式例1

手続き定義開始 設定表示()
  変数宣言 自動,整数{&damy}
  繰り返し &i=1,37
    &ごみ[&i]=#u
  繰り返し終了
  &i=1
  繰り返し(&内容[&i]<>#u)
    &damy=(&週数[&i]-1)*7+#MOD(&曜数[&i]-&月初曜+7,7)+&月初曜
    if(&damy>=1 .and &damy<=37)
      if(&日t[&damy]>0)
        &ごみ[&damy]=&内容[&i]
      end
    end

    &i=&i+1
  繰り返し終了
手続き定義終了


 <計算式例1>の説明
この計算式は少し苦労しました。上記、1日が木曜の場合、第一火曜は「J」になりますが、どうしても「C」になってしまいます。
また、1ヶ月が28日で終わっても、第五○曜日が有ったりして・・・そして

最初に思いついた計算式が次ですです。イベントの中は、この例1の説明を記載してあります
どうしても、if(&damy>=1 .and &damy<=37 .and &日t[&damy]>0)が、配列エラーのため、処理できませんでした。いくら考えてもわからないときは全部忘れて他のことを考えましょう。ある日、なにか閃くときもあります。
上記、式で満足いかなかったのは、「if文」が、2重にあることです

答えは正しい物がでます・・・が、・・・こだわりでしょう!


ゴミの日表示用
計算式例2

手続き定義開始 設定表示1()
  変数宣言 自動,整数{&damy}
  繰り返し &i=1,37
    &ごみ[&i]=#u
  繰り返し終了
  &i=1
  繰り返し(&内容[&i]<>#u)
    &damy=(&週数[&i]-1)*7+#MOD(&曜数[&i]-&月初曜+7,7)+&月初曜
    if(&damy>=1 .and &damy<=37 .and &damy+1-&月初曜<=&月末)
      &ごみ[&damy]=&内容[&i]
    end

    &i=&i+1
  繰り返し終了
手続き定義終了


 <計算式例2>の説明
次に、3個目の比較式を変更してみました。「&日t[&damy]>0」→「&damy+1-&月初曜<=&月末」です。
わかってしまえば、「コロンブスの卵ですね」。これで、1行に書くことができるようになりました。

これだけでも、結構苦労しました。が、

ゴミの日表示用
計算式例3

手続き定義開始 設定表示2()
  変数宣言 自動,整数{&damy}
  繰り返し &i=1,37
    &ごみ[&i]=#u
  繰り返し終了
  &i=1
  繰り返し(&内容[&i]<>#u)
    &damy=#int((7-#mod(&重複[&i]-1,7)+&月初曜-2)/7)*7+&重複[&i]
    if(&damy>=1 .and &damy<=37 .and &damy+1-&月初曜<=&月末)
      &ごみ[&damy]=&内容[&i]
    end

    &i=&i+1
  繰り返し終了
手続き定義終了


 <計算式例3>の説明
でも、なにかが違う・・・よくわからないが・・そして最後に作成した計算式が、
>&damy=#int((7-#mod(&重複[&i]-1,7)+&月初曜-2)/7)*7+&重複[&i]です。
変数を追加しましたが、自分では、すっきりの感じです。

でも、まだ、いい方法があるかもしれませんね。

計算式の使用例
たくさんの生徒がいるなかで、「1年生・男子・数学が100点」・・・・を、選択する場合の例

式1  if(1年生)
  if(男子)
    if(数学が100点)
      ・・・・
    end
  end
end

式2  if(1年生 .and 男子 .and 数学が100点)
  ・・・・
end

 <式の説明>
「式1・式2」どちらも同じ答えがでます。あえて「式2」の方式にする必要はありません。

計算式がエラーの時、桐で行番号を返してくれます。そのとき1行にかいてあると、どの式がエラーか判断できません。そのよう場合、「式1」の方法で書いて有ればすぐわかりますね。そのほかにも、作成中の確認用に次のように書くこともあります。、

>if(1年生)
 確認 ・・・・
>  if(男子)
   確認 ・・・・
>    if(数学が100点)
     確認 ・・・・
このように書いておけば、途中で確認ができます。では、「式2」の利用方法はまちがいか?というとそうでもありません
行数が少なくてすむ・・あとは、思いつきませんが、これも好みの程度に。

top