VB.NETでJVLinkからデータ取得 4 コーディング 2
JVLink入手
https://jra-van.jp/dlb/#tab5
DataLab.(データラボ) 会員サービス ソフト開発サポート
https://jra-van.jp/dlb/sdv/sdk.html
JRA-VAN Data Lab.開発ガイド(Ver.4.2.2)
https://jra-van.jp/dlb/sdv/sdk/DataLab422.pdf
JV-Data 仕様書PDF版(Ver.4.9.0)
https://jra-van.jp/dlb/sdv/sdk/JV-Data490.pdf
JV-Linkインターフェース仕様書(Ver.4.9.0)
https://jra-van.jp/dlb/sdv/sdk/JV-Link490.pdf
Microsoft Visual Studio Community 2019
https://visualstudio.microsoft.com/ja/vs/older-downloads/
前回のコーディングで取得したJV-Dataはいわゆる速報データだったので、レース後時間が経つと取得できなくなります。
これは、速報データから蓄積データへ移されるためであり、今コードを実行すると
このようなエラーになります。
基本的にJVLinkの戻り値が負の値の場合、何らかのエラーが発生しているわけですが、今回はすでに速報データから蓄積データへ移動してしまっているので
このレースIDのデータは無いというエラーでした。
今回はこのような簡単なエラーでしたが、今後ご自分で開発をされるようになるとそういったエラーと戦っていくことになります。
Visual Studio2019(以降エディターと称す)上のコーディングで文法ミスが無くて、JVLinkへの指示で引数を間違ったり足りなかったりした時、その解決方法はただ一つです。
インターフェース仕様書とJV-Data仕様書を検索し正しい書式に直す
これに尽きます。
※インターフェース仕様書へのリンクを貼っていなかったので追記しました。
例えば、今回のエラーでは、JVRTOpenエラー -1だったので
ここを見ると、データが無い事がわかります。
なぜ無いのか?
こちらはインターフェース仕様書ではなく、JV-Data仕様書です。
これを見ると、速報系のOB31のデータの保持は一週間となっています。
なので、当該レースIDではもうデータが取得できないとわかります。
なので、今回のエラーの解決法は、そもそも取得元テーブルを蓄積系ものに変えるか、今扱っているリアルタイム人気オッズ取得のテストプロジェクトで考えるならば、レースIDを新しいものに変えてやればいいという事になります。
コード調整
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 取得したいレースIDを指定
Dim raceNum As String = "2024031007010211"
' JVLinkからの戻り値を格納する変数を定義
Dim retval As Long
' 定数としてretvalのバッファサイズを指定
Const buffSize As Long = 1000
' JVLink初期化を実施
Me.AxJVLink1.JVInit("UNKNOWN")
' 0B31からレースIDを引数にして人気オッズを読み込みを開始
retval = Me.AxJVLink1.JVRTOpen("0B31", raceNum)
' retvalが負の値だと何かしらのエラーが発生しているので処理を中断
If retval < 0 Then
MsgBox("JVRTOpenエラー。RC=" & retval)
Exit Sub
End If
' JVRTOpenが成功した事をTextBoxにを表示
TextBox1.AppendText("JVRTOpen成功。RC=" & retval & Environment.NewLine)
' データ読み込みのためのループを開始
Do
' データを格納するためのバッファを準備
Dim rawRaceData As String = New String(vbNullChar, buffSize)
' JVLinkからデータを読み込む
retval = AxJVLink1.JVRead(rawRaceData, buffSize, Nothing)
If retval = -1 Then ' データの終端に達したらループを終了
Exit Do
ElseIf retval < 0 Then ' JVReadエラー処理
MessageBox.Show("JVReadエラー。RC=" & retval)
Exit Do
ElseIf retval > 0 Then ' データが正常に読み込まれたら表示変換を行う
'↓↓↓
' 必要なデータのみを抽出するためのロジック
' "O" 以降のデータを抽出する
'Dim datastartindex As Integer = rawRaceData.IndexOf("O"c) + 1
'If datastartindex > 0 Then
' Dim validdata As String = rawRaceData.Substring(datastartindex).Trim()
' ' 空白文字が出現する位置を見つける
' Dim endindex As Integer = validdata.IndexOf(" "c)
' If endindex > 0 Then
' validdata = validdata.Substring(0, endindex)
' End If
' TextBox1.AppendText("抽出データ: " & validdata & Environment.NewLine)
'End If
'↑↑↑
' ※※※ ↓この1行は生の取得データを確認したらコメントアウトし、上の矢印内のコメントアウトを解除する
TextBox1.AppendText("取得データ: " & rawRaceData & Environment.NewLine)
End If
Loop While retval <> 0
' JVCloseを呼び出してセッションを終了
Me.AxJVLink1.JVClose()
End Sub
End Class
レースIDを
"2024031007010211" (3/10の金鯱賞)に変えてやりました。
これでエラー解消です。
皆さんが試すタイミングはそれぞれだと思いますし、私の書いたコードはもはや過去の物なので、新しいレースIDを皆さんに生成(取得)してもらって、引き続きリアルタイム人気オッズ取得までやっていきましょう!
レースID
今回は最後にレースIDの仕組みについて説明して終わります。
TARGETのマニュアルにそれらしいものがあったので貼っておきましたが、
このように書かれています。
つまり、西暦~レース番号までが今回レースを一意に特定するのに使っているレースIDとなります。
それに馬番号が付くと各馬を一意に特定するフルのレースIDとなりますが、それは後程の過程で別の処理に使います。
どこで手に入る?
https://race.某有名競馬サイト様.com/race/result.html?race_id=202407010211&rf=race_list
一番簡単なのは某有名競馬サイト様でレース情報を検索する事です。
アドレスバーに入っている race_id から &rf までの間にある数字がそれです。
※某有名競馬サイト様のアドレス内のIDは不完全で、西暦の後に日付を4桁で足してください。
202407010211 → 2024031007010211
JVLinkを使える方であればTargetも使っていると思いますので、Targetの表示項目で確かレースID(新)というのを追加すれば良かったと思います。
では次回は生データを意味のある形に変えていく作業に入ります。