競馬成績表データベースを作る(ツール-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) *****

	#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ファイルの作成

HSPでコマンドプロンプトを制御する

TOP