2023/05/17

ビューに文字でチャートもどきを表示

ノーツでアプリを作ていると、時間帯をチャートで表示したいってことがまれにありますよね。例えば以下のようなビューです。

実際に作成しようと思うと、なかなか面倒です。列ごとに式が微妙に変わりますし、バグも出しやすい設計と言えます。以前作ったときに再利用しやすいよう、整えた式があります。今回はそれを紹介します。


この式は、画面の通り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 件のコメント:

コメントを投稿