見出し画像

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(新)というのを追加すれば良かったと思います。 


では次回は生データを意味のある形に変えていく作業に入ります。

この記事が気に入ったらサポートをしてみませんか?