見出し画像

VB.NETでJVLinkからデータ取得 8 コーディング 5

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/


前回記事

ここまでやってきてJVLinkを使ったデータ取得の核心に触れたという事はおわかりでしょうか。

1 取得したいデータの属性を調べる
2 レースIDを設定する
3 JVOpen or JVRTOpenで生データを取得
4 JVReadで取得したデータを読み込む
5 表示用にデータを加工

実のところこれだけです。
あとは、やりたいことに合わせて落とし込む先を変えてやったり、第三者が使う事を考えて更に細かいエラーハンドリングや、便利機能をふんだんに使ってもっと簡潔に書いてみたり。
もっと処理を増やすのならば、処理だけ切り分けて後で呼び出して使うオブジェクト指向など、やっていけば必ずやることになります。

今回のシリーズでは最後にExcelに落としてみるところまでしかやるつもりはありませんが、まずは最低限動くコードを書き、引数を変えるとどうなるかを見ながらコードを調整していってみてくださいね。


では今回は

このメモを元に、前回のコードを書き換えていきます。
コメントに内容が書かれていますので、上から順番にじっくり読んでみてください。
わからなくても調べれば簡単に意味は引けますので、何をやろうとしているかが日本語を読むように読み進められるようになったら一旦OKで先に進みましょう。

Public Class Form1
    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
        ' 取得したいレースIDを指定
        Dim raceNum As String = "2024031707010403"
        ' 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 strBuff As String = New String(vbNullChar, buffSize)
            ' JVLinkからデータを読み込む
            retval = AxJVLink1.JVRead(strBuff, buffSize, Nothing)

            If retval = -1 Then ' データの終端に達したらループを終了
                Exit Do
            ElseIf retval < 0 Then ' JVReadエラー処理
                ' エラー内容表示
                MessageBox.Show("JVReadエラー。RC=" & retval)
                Exit Do
            ElseIf retval > 0 Then ' データが正常に読み込まれた場合、解析を行う
                Dim dataStartIndex As Integer = strBuff.IndexOf("O"c) + 1
                If dataStartIndex > 0 Then
                    Dim validData As String = strBuff.Substring(dataStartIndex).Trim()
                    Dim endIndex As Integer = validData.IndexOf(" "c)
                    If endIndex > 0 Then
                        validData = validData.Substring(0, endIndex)
                    End If

                    ' データの成形と表示
                    Dim i As Integer = 0
                    While (42 + i * 8 + 6) <= validData.Length ' 馬番の位置と単勝人気の位置を考慮
                        Dim horseNumber = validData.Substring(42 + i * 8, 2) ' 馬番の頭の0を保持

                        ' 単勝オッズを正しい形式に変換して表示させる
                        Dim winOddsRaw = validData.Substring(44 + i * 8, 4) ' 単勝オッズの生データ
                        Dim winOddsValue As Decimal = CInt(winOddsRaw) / 10D ' オッズを適切な小数に変換
                        Dim winOdds As String = winOddsValue.ToString("0.0") ' 小数第一位までの文字列にフォーマット

                        ' 単勝人気を取得
                        Dim winPopularity = validData.Substring(48 + i * 8, 2)

                        ' R_IDの正確な生成
                        Dim raceDate As String = validData.Substring(10, 8) ' 日付
                        Dim venueCode As String = validData.Substring(18, 2) ' 競馬場コード
                        Dim holdingNumber As String = validData.Substring(20, 2) ' 開催回
                        Dim dayNumber As String = validData.Substring(22, 2) ' 開催日数
                        Dim raceNumber As String = validData.Substring(24, 2) ' レース番号
                        Dim R_ID As String = raceDate & venueCode & holdingNumber & dayNumber & raceNumber & horseNumber ' 最終的なレースID

                        ' TextBoxに表示
                        Dim displayText = $"{R_ID}," & $"{horseNumber}," & $"{winOdds}," & $"{winPopularity}"
                        TextBox1.AppendText(displayText & Environment.NewLine)

                        i += 1
                    End While
                End If
            End If
        Loop While retval <> 0
        ' JVCloseを呼び出してセッションを終了
        Me.AxJVLink1.JVClose()

    End Sub
End Class


このようにR_ID、馬番、単勝オッズ、単勝人気の並びで取得できました。

次は取得したデータをExcelに落とす方法の紹介です。

次の記事


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