OpenOffice/競馬の研究7

とここまでで作ったデータベースを実際に使ってみたのですが、一日分のデータ入力中に挫折してしまいました。単にフォームに入力するだけとはいえ同じ操作を繰り返さなくてはならず、思っていたより過酷な作業でした。

問題点を少しずつ改善してみたいと思います。

目次

カラム構成の変更

実際に使ってみると、新聞予想データのテーブルは汎用性がある代わりに(分類項目が自由に増やせる)分類ごとにレコードが分かれていて入力が大変でした。フォーム入力で直前に入力した値を引き継いだりというのは出来ないため(マクロを使用したりしてそれっぽい機能は実装できないこともないらしい)数が多いと大変苦痛な作業になってしまうのです。

そこで私自身の実情に合わせて分類は4つ!と決め打ちして1つの馬番あたり1レコードとなるように、データの持ち方を変えることにしました。

基本の方針

既にいくつか入力したデータもあるし専用に作ってしまったフォームあるので最初から作り直し、入力し直しはしたくありません。互換性のある形でカラム構成を変えた上で、以前のデータを消していく方法を採ることにします。

入力済みのデータをいじるのでファイルのバックアップを取っておきましょう。

カラムを追加する

現在のテーブルデザインは下図のようになっています。

この内、マーク分類とマークIDカラムを未使用として、代わりにマーク1, マーク2, マーク3, マーク4というカラムを追加します。

追加だけなので入力したデータが消えることはありません。

データの移行

今までマーク分類とマークIDを使用して入力したデータを、新形式に変換しなくてはなりません。旧方式のデータを新方式で入力し直した後、旧方式のデータを消すという手順を採ることにします。

SQL文を直接実行して一気に変換することにします。まずは変換後のカラム・データ構成のイメージと一致するような出力を得られるSELECT文を作ります。まだ改良の余地があるかもですが、今回は繰り返し使うものでもないのでこのまま使用します。

新形式データの生成

やっていることは、新聞ID・レースID・馬番でグループ化して1レコードにまとめてます。分類=1はマーク1、分類=2はマーク2、というようにしています。

マーク1〜4の各カラムの取得では集計関数を使わなければならないので、とりあえずSUM関数としています。重複が無いことが前提としてあるので、MAX関数などでも構いません。

SELECT
 ss.新聞ID,
 ss.レースID,
 ss.馬番,
 sum(case ss.マーク分類 when 1 then ss.マークID else NULL end) as マーク1,
 sum(case ss.マーク分類 when 2 then ss.マークID else NULL end) as マーク2,
 sum(case ss.マーク分類 when 3 then ss.マークID else NULL end) as マーク3,
 sum(case ss.マーク分類 when 4 then ss.マークID else NULL end) as マーク4
FROM 新聞予想データ  as ss
GROUP BY 新聞ID, レースID, 馬番
ORDER BY 新聞ID, レースID, 馬番

この抽出結果をそのまま追加します。ツール(T)→SQLの実行(F)...で「SQLステートメントの実行」ダイアログを開き、以下のSQL文を実行します。

INSERT INTO 新聞予想データ
  ( 新聞ID, レースID, 馬番, マーク1, マーク2, マーク3, マーク4)
  SELECT
   ss.新聞ID,
   ss.レースID,
   ss.馬番,
   sum(case ss.マーク分類 when 1 then ss.マークID else NULL end) as マーク1,
   sum(case ss.マーク分類 when 2 then ss.マークID else NULL end) as マーク2,
   sum(case ss.マーク分類 when 3 then ss.マークID else NULL end) as マーク3,
   sum(case ss.マーク分類 when 4 then ss.マークID else NULL end) as マーク4
  FROM 新聞予想データ  as ss
  GROUP BY 新聞ID, レースID, 馬番
  ORDER BY 新聞ID, レースID, 馬番

ここでテーブルの内容を確認してみてください。旧形式データの後ろに新形式のデータが追加されているでしょうか。

旧形式データの削除

今度は不要となった旧形式のデータを削除します。旧形式のデータと新形式のデータの違いは、マーク分類・マークIDカラムの使用の有無ですから、これを条件としてDELETE文を実行することにします。

先ほどの「SQLステートメントの実行」ダイアログより、次のSQL文を実行します。

DELETE FROM 新聞予想データ WHERE マーク分類 <> NULL

マーク分類カラムに値が入っているものを削除対象としました。

期待通りの結果が得られたでしょうか。

フォームの修正

不要になったカラムの入力部の削除と、追加されたカラムへの入力部の作成を行います。

まずは私仕様の完成品を見てください。

新聞予想を入力する部分だけ切り抜いています。新しいカラム構成に合わせてテーブルコントロールの列名を変えています。

マーク1〜4はリストボックスとしてマークマスタの内容を選べるようにしています。

でも目を引くのはテーブルの左側のラジオボタンと下の枠ですね。

左側のラジオボタンは馬番と連携しています。数値を直接入力したりスピンボタンで増減するより、こうしてあらかじめ配置しておくとマウスでの入力に有利です。

下部の枠はドロップダウンを無効にしたリストボックスです。上のテーブルのマーク1〜4と対応しています。

全てのマークが表示されるように縦に広げてあります。馬番のラジオボタンと同じく、直感的にマウスで入力が可能です。ドロップダウンのリストは簡単そうですが、数をこなすとなると意外と使いにくいものです。

さらに左の単独のラジオボタンは、新聞の種類を設定するために用意しました。意味は説明しにくいので理由は省略します。

このように一つのレコードに対し複数の入力手段を設けることが出来ます。


2007-09-13 komina