2019年 秋期 応用情報技術者試験 問6
健康応援システムの構築
W社は,ソフトウェアパッケージの開発を行う企業である。デスクワークが多いことから,従業員が生活習慣病に陥る比率が高く問題となっていた。そこでW社の人事部では,従業員の健康増進のために,通信機能をもつ体重計と,歩数や睡眠時間を記録するリストバンド型活動量計(以下,リストバンドという)を配布し,そのデータを活用する健康応援システム(以下,本システムという)を構築することになった。
【本システムのシステム構成】
本システムは,次の二つのサブシステムから構成される。
・健康応援データサービス
本システムのデータを管理するプログラム。各データを登録・更新・削除するためのインタフェースと定期的にデータを集計する機能をもつ。
・健康応援スマホアプリ
スマートフォン用のアプリケーションプログラム。体重計やリストバンドとデータ通信を行い,健康応援データサービスとデータ連携させる機能をもつ。
【本システムの機能概要】
本システムでは,従業員の日々の体重や歩数,睡眠時間などを記録して,その推移を可視化する。さらに,従業員間で記録を競わせるイベントを開催することで,従業員の積極的な利用を狙う。その機能概要は次のとおりである。
・手動データ登録機能
電子メールアドレスや身長をスマートフォンの画面から登録する。
・データ連携機能
体重計やリストバンドから取得したデータを登録する。
・データ公開機能
身長や体重などのそれぞれの情報について,自分以外の従業員にも閲覧を許可する場合,公開情報として設定する。
・月次レポート作成機能
毎月,従業員ごとのBMI(肥満度を表す体格指数)と肥満度判定,月間総歩数,平均睡眠時間を集計する。
・歩数対抗戦イベント
部署ごとの従業員一人当たり平均の月間総歩数を競う。
検討した健康応援データサービスで用いるデータベースのE-R図を図1に示す。このデータベースでは,E-R図のエンティティ名を表名にし,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。

【月次レポート作成機能の実装】
月次レポートを作成する処理手順を次に示す。
(1) 月次レポート表に従業員番号と集計する対象年月だけがセットされたレコードを挿入する。
(2) (1)で挿入したレコードについて,次の処理を行う。
① 身長と体重を,最新の測定値で更新する。
② BMIを算出して更新する。
③ BMIから肥満度を判定してその結果を更新する。
④ 対象年月の月間総歩数を集計して更新する。
⑤ 対象年月の睡眠時間を集計して1日当たりの平均睡眠時間を求め,その値で更新する。
処理手順(1)及び(2)④で用いるSQL文を,図2及び図3にそれぞれ示す。ここで,"レポート年月"は,集計する対象年月を格納する埋込み変数である。
なお,関数COALESCE(A, B)は,AがNULLでないときはAを,AがNULLのときはBを返す。関数TOYMは,年月日を年月に変換する関数である。
INSERT INTO 月次レポート (従業員番号, レポート年月)
e
FROM 従業員
UPDATE 月次レポート SET 月間総歩数 = (SELECT COALESCE(f, 0) FROM 歩数 WHERE g AND TOYM(歩数.測定日) = :レポート年月 ) WHERE レポート年月 = :レポート年月
【データ連携機能の不具合】
リストバンドに記録された睡眠データを用いてデータ連携機能のテストを行ったところ,睡眠データの登録処理でエラーが発生した。その際に用いたデータを図4に示す。
なお,この睡眠データはCSV形式で,先頭行はヘッダである。
"従業員番号", "測定日", "睡眠開始日時", "睡眠終了日時" EMP00001, 2019-10-02, 2019-10-02 22:30:00, 2019-10-03 06:30:00 EMP00001, 2019-10-03, 2019-10-03 23:15:00, 2019-10-04 03:45:00 EMP00001, 2019-10-04, 2019-10-04 04:30:00, 2019-10-04 07:00:00 EMP00001, 2019-10-04, 2019-10-04 23:45:00, 2019-10-05 06:45:00 EMP00001, 2019-10-05, 2019-10-05 23:30:00, EMP00001, 2019-10-06, 2019-10-06 22:30:00, 2019-10-07 05:45:00
まず,睡眠データの登録処理を確認したところ,その処理では,睡眠データの各行を順次取り出して,ヘッダと同名の睡眠表の各列に値をセットし,1行ずつ睡眠表に挿入していた。
次に,睡眠データを調査したところ,二つの想定外のパターンが判明した。
一つ目は,今回のエラーの原因ではなかったが,就寝中にリストバンドが外れてしまい睡眠終了日時が取得できないパターンで,このパターンに対応するために月次レポート作成機能を修正した。
二つ目が①今回のエラーを引き起こしたパターンで,このエラーを回避して全ての睡眠データを登録するために,②ある表に列の追加以外の変更を加え,月次レポート作成機能を修正することで,今回のエラーを解消することができた。