となかい一朗さんの競馬日記

競馬 SQLでビッグデータ分析-ACCESSのFORMから回収率分析(1)

 公開

397

 さて、本日から、回収率を分析できるAccessのFORMを作成しながら、SQL文についての解説を加えていきたいと思います。

 回収率を分析できるFORMというのは、例えば、一つ目のコーナーで先頭の馬が、どのくらいの勝率・回収率を示すのか、といったことを、テキストボックスに入力してボタンを押すと出力してくれるような、分析の道具です。

 それを作るために、今回は、まずは、ACCESSのフォーム機能を使って入れ物を作るところをやります。

(1)前回作ったaccessのmdbファイル(またはaccdbファイル)を開いて、上の方にある「作成」→「フォームデザイン」でフォームを作りましょう。

(2)上の方の「デザイン」をクリックすると、「コントロール」というのがでてきます。
左から2番めの、「ab|」という絵になっている「テキストボックス」を、2つ作ります。一つは分析対象のfield名を入れるものです。もう一つは分析の結果を出力するものです。テキストボックスウィザードというのがでてきますが、設定はあとでいじりますので、次へ、次へ、とやって先に進みましょう。
クリックしたら、テキストボックスは適宜配置します。大きさなども自由に変更できます。

(3)今度は「コントロール」の左から4番め、「xxxx」というアイコンになっているところを押して、「ボタン」を作ります。
 コマンドウィザードというのがでてきますが、(ここは、変なボタンの絵にされたくないので、)キャンセルを押します。

(4)あとは、テキストボックスの表示を、「分析するフィールド名」、「結果」、ボタンの表示を「計算」にします。クリックして入力すれば変更できます。それから、後々のために、テキストボックスとボタンの名前自体も変更しておきましょう。テキストボックス・ボタンを選択して右クリック → プロパティで、右側にプロパティシートというのがでてきます。「名前」のところが「テキスト1」とかになっていますので、テキストボックスを、それぞれ、「FieldName」「Result」に、ボタンを「Calc」とします。

次に、ADOというのを使えるようにします。(DAOというのを使うこともできますが、ADOの方が、accessに限ったものでないので汎用性が高いと思いましたので、ADOで解説しています。)
(1)「データベースツール」 → 「visual Basic」というのをクリックして、visual Basic エディターを開きましょう。
(2)「ツール」 → 「参照設定」を押すといろいろでてきますが、「Microsoft ActiveX Data Objects x.x Library」をチェックしましょう。バージョンについては迷いますが、accessの古いのを使っている人もあるかもしれませんので、各自で選んでもらう必要があります。ちなみに、私は、少し前までaccess2000を使っていたこともあって、バージョンは、2.1でした。それでも問題なく動きますたぶん。このADOを有効にしていないと、以降で扱うVBのコードでエラーが出ると思います。





さて、ここからが本題です。今回は、上で作ったフォームに、RaceUmaテーブルのfieldを指定して「計算」を押したら、ある条件での、勝率までを出せるようにしたいと思います。

ボタンを右クリックして、「イベントのビルド」 → 「コードビルダー」を選択しましょう。

Private Sub Calc_Click()

End Sub

というのが出てきたと思います。


そこに、以下のように書き込みます。
VBAというプログラムを使いますのでちんぷんかんぷんかもしれませんが、とりあえず、入力してみましょう。一応、なにをしているかの解説を後ろに加えています。(行頭を「'」にしている部分です。)

Private Sub Calc_Click()

Dim FieldNametext As String
'テキストボックスの「FieldName」の中のデータの入れ物を作っています。

Dim rs As ADODB.Recordset
'「rs」という名前の、SQLで抽出したデータの入れ物を作っています。

FieldNametext = Me!FieldName
'FieldNametext に、テキストボックス「FieldName」に入力した内容を代入しています。

Set rs = New ADODB.Recordset
rs.Open "SELECT " & FieldNametext & " AS 区分,count(*) AS n, count(RaceUma.確定着順 =1 or null) AS 勝数, int(count(RaceUma.確定着順 =1 or null)/count(*)*1000)/10 AS 勝率 FROM RaceUma GROUP BY " & FieldNametext, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
'データベースの「RaceUma」テーブルを開いて、FieldNameの値別に集計した結果を、「rs」という入れ物に入れています。

Me!Result = ""
'テキストボックス「result」に何も入っていない状態にしています。

Do Until rs.EOF
If IsNull(rs.Fields!区分) Then Kubun = "なし " Else Kubun = rs.Fields!区分
Me!Result = Me!Result & Kubun & ":  n=" & Format(rs.Fields!n, "@@@@@@") & " 勝数 " & Format(rs.Fields!勝数, "@@@@") & " 勝率 " & Format(rs.Fields!勝率, "@@@@") & vbCrLf
rs.MoveNext
Loop
'rsのデータを一行ずつテキストボックス「result」に入力していっています。

rs.Close: Set rs = Nothing
'計算終わったので「rs」という入れ物を空にしています。

For i = 1 To 10
Beep
Next i
'音を出して終わったことを知らせています。
End Sub

 いちおう、これで、計算できました。「コ1」というのがコーナー1での順位が入っているfield名です。やっぱり、先手を取った馬の勝率が高いんですね。

 今回はここまでで、次回は、今回書いた、SQL文とVBの解説を少し詳しくしていきたいと思います。

関連キーワード

この日記へのコメント

となかい一朗 となかい一朗|2020年10月30日 14:56 ナイス! (1)

コメントありがとうございます。そうですね。テーブル構造の紹介もあったほうがいいですよね。わかりやすいように、今後工夫していきたいと思います。

朧月 朧月|2020年10月30日 14:49 ナイス! (2)

テーブルがどういう構成か という記載があると、分かりやすいです。

新着競馬日記

人気競馬日記