競馬成績表データベースを作る(ツール-HSP編)

1.概要

競馬成績表データベースを作るの最終回です。第四弾で競馬成績表データベースを作る(ツール-Excel編)では、 データベースをExcel VBAにて作成したプログラムで操作しましたが、今回の記事では、HSPスクリプト言語で同等の機能のものを作ります。 実行形式(exe)ファイルとしているので、扱いも簡単でExcel版よりも、やや高速に動作します。HSPに付属しているSQLite3のラッパーモジュールで SQLite3のデータベースを操作できます。


2.ソースコード

まずは、raceseiseki.exeを起動します。使い方は、Yahoo競馬レース成績表検索.xlsmと同様に検索条件の 「競馬場」、「距離」、「コース」のプルダウンをそれぞれクリックして条件を選択します。検索ボタンをクリックすれば、条件にヒットしたものを全件出力します。 出力ボタンをクリックするとカンマ区切りのテキスト形式で出力します。
ソースコードの大部分は画面作成部分であり、実際にデータベースを操作する部分は、154行目から184行目となります。 また、最大抽出件数は、SQL文でLIMIT=20000件と制限しています。ページ制御もしていないので、Excel版と比べて非常にコンパクトです。 実際、筆者は約25万件のデータベースを作成して利用しています。

raceseiseki.hsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
  ;*****  (raceseiseki.hsp) *****
 
  #include "sqlele.hsp"
 
  ;***** 実行ファイル自動作成 ****
  #packopt type 0
  #packopt name "raceseiseki"
  #packopt runtime "hsprt"
  #packopt hide 1
 
  #module
  #uselib "kernel32.dll"
  #cfunc CreateMutex  "CreateMutexA" int,int,sptr
  #cfunc GetLastError "GetLastError"
 
  ;***** 二重起動防止 *****
  #deffunc wexapend str prm1
  strname=prm1
  ;***** 名前の文字列が省略された場合 *****
  if strlen(strname)==0 : strname="HSPApiseisekiSearch"
  ret=CreateMutex(0,1,strname)
  ; 二重起動か?
  if GetLastError()==0   : return 0 ; 同じジョブが起動していない
  if GetLastError()==183 : return 1 ; 既に起動している
  return -1
  #global
 
  #uselib  "user32.dll"
  #func  EnableWindow "EnableWindow" int,int
  #uselib "gdi32.dll"
  #cfunc GetStockObject "GetStockObject" int
  #func  SetTextColor "SetTextColor" int,int
  #func  SetBkColor "SetBkColor" int,int
  #func  DeleteObject "DeleteObject" sptr
 
  #define WM_CTLCOLOREDIT   $00000133
  #define BLACK_BRUSH     $00000004
 
  wexapend "HSPApiseisekiSearch" : if stat : end
 
  ;***** 起動ディレクトリ取得 *****
  sdim Startdir,512
  if hspstat&1=0 { Startdir=dir_exe+"¥¥" : chdir dir_exe
  } else {
    Startdir=dir_cur+"¥¥"
  }
  chdir Startdir
 
  ;***** データベース存在確認 *****
  exist Startdir+"pegasus.db"
  if strsize ==-1 {
    dialog "データベースファイルが見つかりません。",0 : end
  }
  await
 
  ;***** データベースオープン *****
  sql_open Startdir+"pegasus.db"
 
  #define MAX_REC         20000
  #define VER_CONSTAPPRI      1.0
  #define EM_SETMARGINS     $000000D3
  #define EC_LEFTMARGIN     $00000001
  #define EC_RIGHTMARGIN      $00000002
  #define CB_GETCURSEL      $00000147
  #define WM_COPY         $00000301
  #define EM_SETSEL       $000000B1
  #define EM_SETREADONLY      $000000CF
  #define CB_GETLBTEXT            $00000148
  #define WM_CLEAR                $00000303
 
  #define ctype RGB(%1,%2,%3) (%1|(%2<<8)|(%3<<16))
  #define ctype MAKELONG(%1,%2) (%1&$ffff|(%2<<16))
 
  ;***** GUI画面作成 *****
  gosub *screengen
 
  sdim DBbuf,1000000
  sdim DBTmp,1000000
  sdim SQL,1024
  sdim Baba,12
  sdim sKyori,12
  sdim cource,12
  sdim fname,260
   
  syscolor 15 : boxf
  sysfont 17  : syscolor 8
  BarName="競馬成績データベース検索 Ver"+strf("%.1f",VER_CONSTAPPRI)
  title BarName
  ;***** 競馬場選択 *****
  font "MSP ゴシック",12,0 : objmode 2
  color 0,64,128 : boxf 4,5,56,26
  color 255,255,255 : pos 11,10 : mes "競馬場"
  comname0 = "東京¥n中山¥n京都¥n阪神¥n中京¥n札幌¥n函館¥n福島¥n新潟¥n小倉¥n¥n"
  objsize 60,14 : pos  60,5 : combox Babastr,50,comname0
  font "MSP ゴシック",12,0
  objsize 46,24 : pos 360,4 : button "検索", *Search
  ;***** 表示エリア (mesbox) *****
  font "Verdana",11,0
  pos 0,32 : mesbox DBbuf,ginfo_winx,ginfo_winy-32,5 : hedit=objinfo(2,2)
  sendmsg objinfo(2,2), EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN,MAKELONG(5,5)
  hBrush=GetStockObject(BLACK_BRUSH)
  ;***** 距離選択 *****
  font "MSP ゴシック",12,0
  color 0,64,128 : boxf 128,5,170,26
  color 255,255,255 : pos 137,10 : mes "距離"
  comname1 = "1000¥n1150¥n1200¥n1300¥n1400¥n1500¥n1600¥n1700¥n1800¥n1900¥n"
  comname1 += "2000¥n2100¥n2200¥n2300¥n2400¥n2500¥n2600¥n3000¥n3200¥n3400¥n3600¥n¥n"
  objsize 60,14 : pos  175,5 : combox Selstr,50,comname1
  ;***** コース選択 *****
  font "MSP ゴシック",12,0
  color 0,64,128 : boxf 244,5,292,26
  color 255,255,255 : pos 252,10 : mes "コース"
  font "Verdana",12,0
  comname2="ダート¥n芝¥n障害¥n¥n"
  objsize 50,14 : pos 300,5 : combox Defstr,40,comname2
  ;***** 外部出力 *****
  objsize 66,24  : pos 515,4 : button "出力", *CopyClip
  EnableWindow objinfo(5,2),0
  ;***** 抽出件数 *****
  pos 585,4 : input mnum,50,22
  sendmsg objinfo(6,2),EM_SETMARGINS,EC_LEFTMARGIN|EC_RIGHTMARGIN,MAKELONG(1,0)
  sendmsg objinfo(6,2),EM_SETREADONLY,1,0
  objsel 0 : gsel 0, 1
   
  onexit goto *owari
  oncmd gosub *OnWM_CTLCOLOREDIT, WM_CTLCOLOREDIT
  onkey gosub *onkeyFlag
  stop
 
*screengen
  sql_q "SELECT * FROM SValue WHERE ID = "+1
  xpos=sql_v("wxpos") : ypos=sql_v("wypos")
  screen 0,640,480,2,int(xpos),int(ypos)
  return
 
*OnWM_CTLCOLOREDIT
  ;***** mesboxの背景色と文字色を変更 *****
  if ( lParam == hedit ) {
    SetTextColor wParam, RGB(255,255,255)
    SetBkColor wParam, RGB(0,8,12)
    return (hBrush)
  }
  return
 
*Search
  ;///////////////// 検索処理 (クエリー実行) /////////////////
  sendmsg objinfo(0,2), CB_GETLBTEXT, Babastr, varptr(Baba)
  sendmsg objinfo(3,2), CB_GETLBTEXT, Selstr, varptr(sKyori)
  sendmsg objinfo(4,2), CB_GETLBTEXT, Defstr, varptr(cource)
 
  font "MSP ゴシック",12,0
  color 200,0,0 : pos 420,10 : mes "検索中"
 
  ;***** 抽出件数をLIMIT=20000件に制限する *****
    SQL = ""
    SQL = "SELECT * FROM seisekidb WHERE KeiBabajyou = '"+ Baba +"'"
    SQL += " AND Cource COLLATE NOCASE LIKE '%"+ cource +"%'"
    SQL += " AND Kyori COLLATE NOCASE LIKE '%"+ sKyori +"%'"
    SQL += " ORDER BY ID ASC LIMIT 20000"
    sql_q SQL
 
  ;***** 抽出件数 *****
  DBTmp = ""
  count = stat : objprm 6,count
  if count==0 {
    DBTmp += "¥nData Not Found¥n"
    EnableWindow objinfo(5,2),0
    DBbuf = DBTmp
    objprm 2,DBbuf
    color 255,255,255 : boxf 415,4,470,26
    stop
  }
 
  ;***** DBからデータ切り出し *****
  repeat count
    DBTmp += sql_v("RaceDate")+","+sql_v("BabaCode")+","+sql_v("RaceNo")+","+sql_v("KeiBabajyou")+","+sql_v("Kaisai")+","+sql_v("StartTime")+","
    DBTmp += sql_v("Tenki")+","+sql_v("Baba")+","+sql_v("RaceName")+","+sql_v("Cource")+","+sql_v("Kyori")+","
    DBTmp += sql_v("TanSyou")+","+sql_v("Wakulen")+","+sql_v("Umalen")+","+sql_v("UmaTan")+","+sql_v("SanlenTan")+","
    DBTmp += sql_v("OneUma")+","+sql_v("TwoUma")+","+sql_v("ThreeUma")+","+sql_v("Tousu")+"¥n"
    if cnt>MAX_REC-2 : DBTmp += "¥n; Data Max = "+MAX_REC+" Over.....¥n" : break
    sql_next
  loop
  DBbuf = DBTmp
  objprm 2,DBbuf
  EnableWindow objinfo(5,2),1
  color 255,255,255 : boxf 415,4,470,26
  stop
 
*CopyClip
  ;***** 検索結果を出力 *****
  objsel 2
  fname = Startdir + "成績" + Baba + sKyori + cource + ".txt"
  notesel DBTmp
  notesave fname
  sendmsg objinfo(2,2), EM_SETSEL, 0, -1
  sendmsg objinfo(2,2), WM_CLEAR, 0, 0
  stop
 
*onkeyFlag
  ;***** 入力ボックスでEnterを押すと検索 *****
  if iparam == 13 {
    objsel -1
    if stat == 0 {
      gosub *Search
    }
  }
  return
 
*owari
  ;***** 終了処理 (DB CLOSE) *****
  onexit 0 : oncmd 0
  DeleteObject hBrush
  wxpos=str(ginfo_wx1)  ; 画面左上 X 座標
  wypos=str(ginfo_wy1)  ; 画面左上 y 座標
  sql_q "UPDATE SValue SET wxpos=" + prm_text(wxpos) + ", wypos=" + prm_text(wypos)+ "WHERE ID="+1
  sql_close
  end

3.ダウンロード

提供するソースコードのライセンスは、CC0 (クレジット表示不要、改変可、商用可) とします。自由に利用して頂いてかまいません。
下記のファイルをアーカイブにして提供します。データは、著作権に触れる恐れがあるため、配布することができません。 動作確認のテスト用のサンプルとして100件のみ入れてあります。実際に利用する場合は、各自で取得して新規に作成願います。 尚、データの取得やプログラム実行において損害等が生じた場合は、筆者は一切の責任も負いません。全て自己責任でお願いします。
ダウンロードアーカイブは、「ツール-Excel編」と同じものです。
    ・import.bat
    ・pegasus.db
    ・raceseiseki.exe
    ・raceseiseki.hsp
    ・sqlite3.dll (raceseiseki.exeを実行するのに必要)
    ・Yahoo競馬結果リンク先取得.xlsm
    ・Yahoo競馬レース結果取得.xlsm
    ・Yahoo競馬レース成績表検索.xlsm
    ・ヘッダー名.txt
「ツール-Excel編」で掲載している「Yahoo競馬レース成績表検索.xlsm」も同梱しています。

ダウンロード

■関連記事
・Excelでデータベース(SQLite3)を扱う
・複数のファイルをマージする
・競馬成績表データベースを作る(事前準備編)
・競馬成績表データベースを作る(データ取得編)
・競馬成績表データベースを作る(データベース編)
・競馬成績表データベースを作る(ツール-Excel編)

コメント

このブログの人気の投稿

Excelアドインで日本語形態素解析

階層構造JSONファイルの作成

キーボードのキーコードの一覧表