MZ Platform工程管理作成チュートリアルⅤ

このチュートリアルは工程管理チュートリアル 5.mzax ファイル を基に説明しています。

7.積上棒グラフ表示部の作成

1.この章での完成画面

 『工程管理アプリケーション作成チュートリアルⅣ』では、積上げ棒グラフを用いて負荷状況を視覚的に把握できるようにしました。
設定されるデータはデータベースにあるtaskテーブルの全期間のデータを取得しています。
ここでは[日付入力フィールド]などを用いて検索期間の指定を行い、where句を検索SQL文に付加して実行し、期間を限定したデータを表示できる ようにします。

  1. 期間指定チェックボックス
  2. プロジェクトの納期を期間を指定して検索を実行するか、チェックの有無によって指定することができます。
    チェック有無を切り替える度に、グラフの表示は一旦クリアします。
  3. 日付入力フィールド
  4. 納期の期間指定の開始日と終了日を入力します。
    自由に編集可能ですが、開始日時か終了日時どちらか一方だけの指定はできず、必ず両方を指定します。
    最初に期間指定のチェックを入れたときに、初期日付として開始日時にはその日の午前0時の日付を、 終了日時には約1か月先の23時59分59秒の日付が入るように設定しています。
    日付が既に入っているときは、チェックを切り替えても、日付は上書きされません。
  5. 日時選択ダイアログの表示
  6. 日付の入力が簡単になるように、ボタンを押すと日時選択のダイアログを表示できます。
    納期のデータは日付のみなので、時間選択の部分は属性設定で表示しない設定になっています。

7.5.表示期間の設定

ここまでの設定では、全ての期間のデータを取得してグラフ表示しています。
日付の設定の画面を作成し、設定期間内の検索データを取得するSQLを発行できるようにします。

1.画面の作成

コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
    (数が多いので、画面編集画面で新規コンポーネント一括追加を使うと便利です)
    基本操 作 2>コンポーネント一括追加
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー/テキスト
    パネル 1 画面構成部品>パネル 表示期間指定
    ラベル 画面構成部品>ラベル From
    To
    日付入力フィールド 2 画面構成部品>テキスト 期間開始
    期間終了
    ボタン 画面構成部品>ボタン 📅(カレンダーの絵文字)
    期間開始
    期間終了
    チェックボックス 画面構成部品>チェックボックス 表示期間を指定する
画面編集
複合コンポーネント内の画面編集画面に入ります。
  1. 複合コンポーネント画面編集画面にパネルを追加します。
  2. 画面編集画面のツリー領域の[パネル]名をクリックします。
    編集領域がパネルの領域に変わります。
  3. [ラベル]、[日付入力フィールド]等、必要なコンポーネントをパネルに配置します。
    配置方法は「横方向整列」で、ツリー領域のコンポーネント名をドラッグして順番を入れ替えます。
  4. 複合コンポーネント画面編集領域に移動します。
    コンポーネントが重なっている場合はドラッグして移動し、位置を整えます。
  5. 「実行(設定可)」ボタンで実行し、[チェックボックス]、[ラベル]のテキストを変更します。
    [チェックボックス]のテキストは「表示期間を指定する」、[ラベル]は「From」,「To」です。
  6. [ボタン]のテキストに📅(絵文字)を設定します。
    その後、属性情報設定画面でComponentKeyの項をそれぞれ「期間開始」、「期間終了」と変更します。
  7. 2つの[日付入力フィールド]の表示モードを「日付と時間」に変更します。
    [日付入力フィールド]の上で右クリック>[表示モード]>[日付と時間]を選択します。
画面編集例
画面作成例

チェックボックスを選択状態にしたときの日付や、画面のクリア処理などを設定します。

1.日付入力フィールドへの初期日付設定

チェックボックスを選択状態にしたときには、[日付入力フィールド]にデータが設定されていないときは、日付の入力がしやすいように初期設定の日付を 表示します。
開始は実行当日、終了は一か月先の日付とします。
コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
    ※サブルーチンは先に1つだけ追加し、後でコピーします。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー/テキスト
    サブルーチン 2 処理部品>サブルーチン 開始日付設定
    終了日付設定
    カレンダー 1 処理部品>システム または
    処理部品>ユーティリティ
    日付設定用
接続処理設定
  1. 開始日時の設定
  2. [サブルーチン(初期日付設定)]を先頭に処理を作成します。
    アプリケーション実行当日の日付とします。
    1. 【接続14-1】[カレンダー]に現在日時を設定します。
    2. 【接続14-2】時刻の部分は「00:00:00」に設定します。
    3. 【接続14-3】[日付入力フィールド(期間開始)]に日付を設定します。
  3. 終了日時の設定
  4. 約一か月先の日付にします。
    ただし一秒減らし、日付当日の「23時59分59秒」までを範囲としたいので、一か月先の日付は含みません。
    [カレンダー]で加減を行います。
    1. 編集画面上で[サブルーチン(開始日付設定)]をコピーし貼り付けます。
      接続処理ごと貼り付けられています。
      属性情報でコンポーネントキーを「終了日付設定」に変更します。
    2. 【接続14-1】、【接続14-2】はそのまま使用します。
    3. 【接続14-4】[カレンダー]の日付データの「月」を「1」増やします。
    4. 【接続14-5】[カレンダー]の日付データの「秒」を「1」減らします。
    5. 【接続14-6】【接続14-3】([日付入力フィールド(期間開始)]「日付を設定する(Date)」)を一番下【接続14-5】 の次にドラッグして移動します。
      接続先コンポーネントを[日付入力フィールド(期間終了)]に日付を設定します。
      メソッドは変更しません。

2.日付のNULL判定

[チェックボックス(期間設定)]が選択されたときに、[日付入力フィールド]に日付が既に入っている と きは上書きしないことにします。
[日付入力フィールド(期間開始)]の値が設定されていない(NULL)かどうかで、[サブルーチン(初期日付設定)]を呼び出す判断をします。
コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加します。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー
    NULL判定 1 処理部品>条件制御 開始日付
    終了日付
接続処理設定
  1. NULL判定
    1. 【接続15-1】[日付入力フィールド(期間開始)]の日付データがNULLかどうか演算します。
      イベント番号1(チェックボックスが選択状態になったとき)を設定します。
    2. 【接続16-1】演算結果が「true」のとき、[サブルーチン(開始日付設定)]を呼び出します。
      イベント番号1(演算結果がtrue=日付がNULLのとき)を設定します。
    3. 【接続15-2】[日付入力フィールド(期間終了)]の日付データがNULLかどうか演算します。
      イベント番号1(チェックボックスが選択状態になったとき)を設定します。
    4. 【接続17-1】演算結果が「true」のとき、[サブルーチン(終了日付設定)]を呼び出します。
      イベント番号1(演算結果がtrue=日付がNULLのとき)を設定します。

[編集画面図1]

[編集画面図2]

[チェックボックス]の選択状態が変わったときに、グラフ表示画面は一旦クリアします。
今まで終了処理としていたものを画面クリア処理としてまとめ、[日付入力フィールド]のクリアなどを終了処理に追加します。

1.終了処理からクリア処理へ変更

コンポーネント追加
    新規追加ではなくコピー&ペーストで追加します。
    コンポーネント名 必要数 カテゴリー コンポーネントキー/テキスト
    サブルーチン 1 処理部品>サブルーチン 画面クリア
  1. 複合コンポーネント内で[サブルーチン(終了処理)]コンポーネントを右クリック>コピーを選択します。
  2. 編集領域内で右クリック>貼り付けを選択すると、接続処理ごと貼り付けられます。
    新しく貼り付けた[サブルーチン]のコンポーネントキーを「終了処理」から「画面クリア」に変更します。
接続処理設定
  1. 画面クリア処理の呼び出し
  2. [チェックボックス]の選択状態が変わったときに呼び出します。
    接続元コンポーネントは [チェックボックス(期間を指定する)]です。
    1. 【接続15-3】[サブルーチン(画面クリア)]の処理を呼び出します。

2.終了処理の設定

  1. 終了処理の変更・設定
  2. 接続元は[サブルーチン(終了処理)]です。
    1. [サブルーチン(終了処理)]のアクションイベントの処理【13-1】から【13-6】までは削除します。
    2. 【接続13-7】[日付入力フィールド]にNULL値を設定します。
    3. 【接続13-8】[日付入力フィールド]にNULL値を設定します。
    4. 【接続13-9】[チェックボックス(期間選択)]を非選択にします。
    5. 【接続13-10】画面クリア処理を呼び出します。
      元の終了処理をコピーした[サブルーチン]です。

[編集画面図3]接続元コンポーネントは [チェックボックス(期間を指定する)]です。

[編集画面図4]【接続13-1】~【接続13-6】の起動メソッド情報画面図は省略します。

日時の入力が簡単になるように、ボタンを押して[日時選択ダイアログ]を表示し、その選択日を[日付入力フィールド]に設定できる よう にします。

1.日時選択ダイアログの設定

コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー/テキスト
    日時選択ダイアログ 2 画面構成部品>ダイアログ 期間開始
    期間終了
接続処理設定

それぞれのボタンを押したら、[日時選択ダイアログ]が表示されるようにします

  1. 【接続18-1】[日時選択ダイアログ(期間開始)]の時刻部分を「0時0分0秒」に設定し ます。
    期間指定開始日の正時から始まるように設定します。
    ※アプリケーションを起動したタイミングでは既定で現在日時が設定されています。
  2. 【接続18-2】[日時選択ダイアログ]を表示します。
    ※引数の取得方法を「コンポーネント」とすると、コンポーネント欄で指定したコンポーネントの中央にダイアログが表示されます。
  3. 【接続19-1】[日時選択ダイアログ(期間終了)]の時刻部分を「23時59分59 秒」に設定します。
    日付が変わる直前の時刻が設定されるようにします。
  4. 【接続19-2】[日時選択ダイアログ]を表示します。

確認ボタンを押して[日時選択ダイアログ]を表示し、時 刻部 分が設定されているか確認します。

画面編集
  1. [日時選択ダイアログ]の「コンポーネント属性情報設定」画面で「TimeInvisible」の項を「true」にしま す。
    ダイアログの時刻選択部は表示されなくなります。
接続処理設定
  1. 【接続20-1】[日時選択ダイアログ(期間開始)]の日付が選択されたら、[日付入力フィールド(期間開始)]に日付を設 定し ます。
    イベント番号は1(適用ボタンが押されたとき)を設定します。
  2. 【接続21-1】[日時選択ダイアログ(期間終了)]の日付が選択されたら、[日付入力フィールド(期 間終了)]に日付を設定します。
    イベント番号は1を設定します。
日時選択ダイアログ表示例1
日時選択ダイアログ属性設定の変更
日時選択ダイアログ表示例2

[編集画面図5]

7.6.期間を指定して検索

上位階層にイベントを伝播する前に複合コンポーネント内で検索SQL文字列を作成し、その検索SQLを上位階層で実行します。

1.文字列の設定

コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー
    等価演算(=) 1 処理部品>条件制御 期間指定有無
    文字列格納変数 1 処理部品>変数 検索SQL
    イベント生成 1 処理部品>イベント 検索
接続処理設定

まず、Where句の付いていない検索SQL文字列を設定します。

  1. 検索文字列の設定
    1. 【接続1-1】「イベントを伝播させる」処理を削除します。
      この後「処理要求イベント」を発生させデータベースの接続、SQL文の実行を行うので不要になります。
    2. 【接続1-2】[チェックボックス(期間を指定する)]がチェックされているかどうか、等価演算を行います。
      ※次の項で演算結果による条件分けを行いたいので、この処理を先に設定しておきます。
    3. 【接続22-1】[等価演算(=)]が完了したら、検索文字列を[文字列格納変数(検索SQL)]に設定します。
      上位階層で実行していたのと同じ「select id, dateStart, dateEnd, workingTime, projectLabel, process from task」を設定します。
      期間指定の有無に関わらずこの文は実行するので、イベント番号は設定しません。
    4. 【接続22-2】[イベント生成]で処理要求イベントを発生させます。
      [文字列格納変数]内の検索SQL文字列をイベントと一緒に上位階層に伝播するために、処理要求イベントを発生させます。
    5. 【接続23-1】「処理要求イベント」を上位階層に伝播します。
      ※[イベント生成]からは「処理要求イベント」の他にもイベントが選択できるので、イベント選択を間違えないようにします。
  2. 検索文字列の実行
  3. 上位階層に戻り、[積上棒グラフ表示部]のアクションイベント処理をコピーして、処理要求イベントに貼り付けます。
    アクションイベントの処理は不要になります。

    1. 上位階層の編集画面上で[積上棒グラフ表示部]を右クリック>イベント処理追加>処理要求イベントを選びます。
      データ設定イベントが追加されます。
    2. [積上棒グラフ表示部]のアクションイベント上で右クリック>コピーを選択します。
    3. [積上棒グラフ表示部]の処理要求イベントを示す赤い丸に移動し、右クリック>貼り付けを選択します。
      コピーした処理が全て貼り付けられます。
    4. 【接続9-2変更】メソッド「検索SQLを実行する(Object)」の引数を変更します。
      固定値で指定していたものを、取得方法:イベント内包、メソッド/値:処理要求データに変更します。

確認ここまで設定して、グラフが表示されるか確認します。
Where句を指定していないので、今まで通り期間を区切らない全体データが表示されます。

[編集画面図6]

[編集画面図7] 【接続9-2】以外のメソッド設定画面図は省略

[チェックボックス]が選択状態の時にWhere句を付加する[サブルーチン]の処理を作成します。
今回はtaskテーブルのdateStart(開始予定日時)が指定期間内にあるデータを検索します。

1.where句の書式

  1. between演算子
  2. 検索SQL文の後ろに「where 列名 between 下限値 and 上限値」という条件句を設定します。
    検索範囲には上限値と下限値の値自体を含みます。
  3. MySQL日付書式
  4. MySQLのDATETIME型の基本の書式は「YYYY-MM-DD hh:mm:ss」です。
    (日付を表すアルファベットの大文字、小文字の意味はMZPlatformで使用しているJavaの書式とは違い、大文字は日付部分を小文字 は時 刻部分を表しています)

2.where句の追加

コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー
    サブルーチン 1 処理部品>サブルーチン where句
    文字列格納変数 1 処理部品>変数 where句
接続処理設定
  1. Where句の作成
  2. サブルーチンを先頭に処理を作成します。
    1. 【接続24-1】[文字列格納変数(where句)]にwhere句の雛形を設定します。
      「 where dateStart between 'HAJIMARI 'and  'OWARI' 」と設定します。
      後で[文字列格納変数(検索SQL)]内の文字列と連結するときにスペースが必要なため、「where」の直前にはスペースを入れま す。
    2. 【接続24-2】[日付入力フィールド(期間開始)]から[カレンダー]に日付を設定します。
    3. 【接続24-3】[カレンダー]から書式を指定して、日付文字列を取得します。
      書式は「yyyy-MM-dd HH:mm:ss」を指定します。
    4. 【接続24-4】雛形の文字列を置換えます。
      取得した期間開始日時の文字列と「HAJIMARI」を置換えます。
    5. 【接続24-5】[日付入力フィールド(期間終了)]から[カレンダー]に日付を設定します。
    6. 【接続24-6】[カレンダー]から書式を指定して、文字列を取得します。
    7. 【接続24-7】取得した終了日付文字列と雛形の文字列を置換えます。
      取得した期間終了日時の文字列と「OWARI」を置換えます。
      ※引数1の「メソッド処理結果」の「メソッド/値」は、選択窓の2番目にある「書式指定によるカレンダー文字列表現の取得」を選択し ま す。
    8. 【接続24-8】[文字列格納変数(検索SQL)]の文字列と[文字列格納変数(where句)]の文字列とを連結します。
      例えば「select id, dateStart, dateEnd, workingTime, projectLabel, process from task where dateStart between '2023-07-28 00:00:00 'and  '2023-08-27 23:59:59' 」といった文字列になります。
  3. サブルーチンの呼び出し
    1. 【接続22-3】期間が選択されている時、where句追加の処理を呼び出します。
      イベント番号は1(演算結果がtrue=チェック有のとき)を設定します。
      ※【接続22-2】の処理要求イベント発生の処理より先になるように、ドラッグして順番を入れ替えます。

[編集画面図8]【接続22-1】、【接続22-2】の起動メソッド情報画面図は省略します。

1.検索結果テーブル行数の確認

検索期間を設定することで、期間内のデータ件数が0の場合も有り得ます。
該当のデータが無い場合も、行数「0」のテーブルデータが検索結果として取得されます。
ここまでは[テーブル格納変数]にデータが設定されたタイミングでデータの取得などを行っているので、行データが無いテーブルを対象 に処 理を行うとエラー が発生する可能性があります。
そこで、検索結果が[テーブル格納変数]に設定されたときに演算し、行数が「0」より大きい場合のみ処理を呼び出すようにします。

コンポーネント追加

  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー
    比較演算(>) 1 処理部品>条件制御 テーブル行数
    メッセージダイアログ 1 画面構成部品>ダイアログ

接続処理設定

  1. 接続のコピー、貼り付け
    1. 【接続2-1】~【接続2-6】[テーブル格納変数(検索結果)]のデータ設定ベントの接続処理を全てコピーします。
      イベントを示す赤丸の上で右クリック>コピーを選択します。
    2. 【接続2-1】~【接続2-6】を[比較演算(>)]の処理完了イベントに全て貼り付けます。
      イベントを示す赤丸の上で右クリック>貼り付けを選択します。
    3. 【接続2-1】~【接続2-6】にイベント番号を設定します。
      演算の結果が「true」(検索テーブルの行数が0より大きい)のとき処理が行われるようにイベント番号1を設定します。
      shiftキーを押しながら全て選択し、一度にイベント番号を設定できます。
  2. 演算処理の設定
    1. 【接続2-7】検索結果のテーブル行数が「0」より大きいか演算します。
      [テーブル格納変数(検索結果)]のデータ設定イベントの【接続2-1】~【接続2-6】は削除し、【接続2-7】の接続の み追 加しま す。

2.メッセージダイアログの表示

該当データが無い場合グラフは表示されず、検索SQLが実行されたかどうか判りにくいので、メッセージを表示することにします。

  1. メッセージダイアログの表示
    1. 【接続2-8】メッセージダイアログを表示します。
    2. [メッセージダイアログ]の属性設定で「Message」の項に『該当するデータはありません』と設定します。

確認ここまで設定すると、期間を設定した検索ができるよ うに なります。

メッセージダイアログ表示例

[編集画面図9]【接続2-1】~【接続2-6】の起動メソッド情報画面図は省略します。

7.7.数値軸表示の固定

グラフの数値軸の最大値や最小値は、既定では設定されるデータに合わせて調整されるようになっています。
項目別やプロジェクト別に変えて表示すると最大値や表示間隔が変わってしまうため、検索で取得されたテーブルデータの最大値に合わせて変わら ない ように設定します。
数値軸の最大値は自動調整のままなので、検索期間を変更したり新規データが追加されたときは、データに合わせて最大値は変わります。

1.最大値とグリッド間隔の設定

コンポーネント追加
  1. 複合コンポーネント内に以下のコンポーネントを追加し、コンポーネントキーを変更します。
  2. コンポーネント名 必要数 カテゴリー コンポーネントキー
    任意精度実数格納変数 2 処理部品>変数 数値軸最大値
    数値軸間隔
    比較演算(>) 1 処理部品>条件制御 最大値比較
接続処理設定

全体データの最大値とグリッド間隔を格納しておきます。

  1. 数値の初期化
  2. [ボタン(積上棒グラフ表示)]のボタンを押す都度、一旦初期化します。

    1. 【接続1-3】変数に0を設定します。
      [任意精度実数格納変数]内の数値を初期化する意味で「0」を設定します。
    2. 【接続1-4】変数に0を設定します。

    ※ドラッグして【接続1-2】の前に来るように順番を入れ替えます。

  3. 最大値とグリッド間隔の格納
  4. 検索SQLを実行し、1件以上の検索テーブルデータが設定されたときに、最大値とグリッド間隔を格納しておきます。
    接続イベントは[比較演算(>)]の処理完了イベント(【接続2のコピー】)です。

    1. 【接続2-9】最大値を変数に格納します。
    2. 引数の「メソッド/値」は「getNumberAxisMaximum」です。
      全メソッド対象にチェックを入れ選択します。
      イベント番号1(演算結果が「true」のとき)を設定します。
    3. 【接続2-10】グリッド間隔を変数に格納します。
    4. 引数の「メソッド/値」は「getNumberAxisInterval」です。
      全メソッド対象にチェックを入れ選択します。
      イベント番号1(演算結果が「true」のとき)を設定します。
  5. 最大値とグリッド間隔の設定
  6. グラフにデータが設定されたタイミングで変数内の数値と比較し、グラフの最大値の方が小さい場合は、大きい方の変数内の数値を最大値と して 設定しま す。

    1. 【接続4-6】グラフの最大値と変数内の数値とを比較します。
      接続元コンポーネントは[イベント生成(項目選択)]です。
      グラフから取得する数値軸の最大値と、変数内に格納してある最大値を比較します。
    2. 【接続25-1】数値軸の最大値を設定します。
      [任意精度(BigDecimal)格納変数(数値軸最大値)]の値の方が大きいとき、数値軸の最大値を変数内の値で置き換えます。
      比較演算の結果がtrueの時実行したいので、イベント番号は1を設定し ます。
    3. 【接続25-2】数値軸のグリッド間隔を設定します。
      イベント番号は1を設定し ます。

確認ここまで設定すると、自動調整設定のままで細かく系列を変更 して 表示し ても、入っている全体データに合わせて数値軸の最大値は固定されます。

[編集画面図10]実際には【接続2のコピー】には【接続2-1】~【接続2-8】までの接続処理が設定されています。
【接続1-2】の起動メソッド情報設定画面図は省略します。

[編集画面図11] 【接続4-6】の接続元コンポーネントは[イベント生成(項目選択)]です。

工程管理アプリケーション作成チュートリ アルⅥ へ