ノーツでアプリを作ていると、時間帯をチャートで表示したいってことがまれにありますよね。例えば以下のようなビューです。
実際に作成しようと思うと、なかなか面倒です。列ごとに式が微妙に変わりますし、バグも出しやすい設計と言えます。以前作ったときに再利用しやすいよう、整えた式があります。今回はそれを紹介します。
この式は、画面の通り1時間ごとに列を作成し、その列にあった式を記述します。列ごとで違う部分については、式の最初にパラメータとしてセットするようにしています。準備したパラメータは以下の6種類です。
パラメータ変数 | 用途 |
xTargetH | 何時の列かを指定 |
xUnitMins | 何分を1文字で表示するか |
xST | 開始時刻 |
xED | 終了時刻 |
xSTR_Null | 開始-終了時刻 範囲外のあらわす文字 |
xSTR_Fill | 開始-終了時刻 範囲内のあらわす文字 |
各列にセットする実際の式は以下の通りです。
xTargetH := 9; となっているので、9 時台の列用の式で、10分間を1文字で表すようしています。StatTime と EndTime は文書内に保存された時刻情報(フィールド)となります。
REM {パラメータセット}; xTargetH := 9; xUnitMins := 10; xST := StartTime; xED := EndTime; xSTR_Null := "-"; xSTR_Fill := "*"; REM {分割数を算出}; xUnits := @Integer(60/xUnitMins+0.99); REM {開始時刻が何個目か算出}; xST_Units := ((@Hour(xST)*60 + @Minute(xST)) - (xTargetH*60))/xUnitMins; xST_Units := @If( xST_Units < 0; @Integer(xST_Units-0.99); @Integer(xST_Units) ); REM {終了時刻が何個目か算出}; xED_Units := ((@Hour(xED)*60 + @Minute(xED)) - (xTargetH*60))/xUnitMins; xED_Units := @If( xED_Units < 0; @Integer(xED_Units-0.99); @Integer(xED_Units) ); REM {開始と終了が同じ場合マークを表示するよう修正}; xED_Units := @If(xST_Units = xED_Units; xED_Units + 1; xED_Units); REM {表示する文字列を算出}; @If( xST_Units <= 0; @If( xED_Units < 0; @Repeat(xSTR_Null; xUnits); xED_Units >= xUnits; @Repeat(xSTR_Fill; xUnits); @Repeat(xSTR_Fill; xED_Units) + @Repeat(xSTR_Null; xUnits-xED_Units) ); xST_Units >= xUnits; @Repeat(xSTR_Null; xUnits); @If( xED_Units < xST_Units; @Repeat(xSTR_Null; xUnits); xED_Units >= xUnits; @Repeat(xSTR_Null; xST_Units) + @Repeat(xSTR_Fill; xUnits-xST_Units); @Repeat(xSTR_Null; xST_Units) + @Repeat(xSTR_Fill; xED_Units-xST_Units) + @Repeat(xSTR_Null; xUnits-xED_Units) ) ) |
少し長い式にはなりますが、パラメータのセット以降は、変更する必要がないようにして、メンテナンス性を向上させています。このような構造にしておくと、8時 ~ 18時、24時間表示など要望が変わっても、簡単に対応できます。
また、5分間を1文字で表すような仕様変更も、xUnitMins := 5; とパラメータを変更して列幅を整えるだけで対応できますね。
0 件のコメント:
コメントを投稿