Lesson-3:JV-Dataの内容を読み出す

Lesson-3:JV-Dataの内容を読み出す

当コーナーでは、Microsoft Visual Basic 2022 Professional Edition(以下VB 2022と省略)で「JRA-VAN Data Lab.」サービス対応の競馬ソフトを作成していく過程をステップアップ形式で解説していきます。
前回は、実際にJV-Dataをダウンロードする仕組みを実装しました。今回は、前回ダウンロードしたJV-Dataを読み込む処理を盛り込んでみましょう。さらに、JRA-VAN SDKに同梱されているJV-Data構造体を用いて、読み込んだJV-Dataを「意味のある区切り」ごとに切り出して表示してみましょう。

【 今回の目標 】

ダウンロードしたJV-Dataを読み出す。
読み出したJV-Dataを「意味のある区切り」で切り出し、表示する。

具体的には、取得したJV-Dataのうち、レース詳細(レコード種別ID「RA」)情報の一部(開催年、開催月日、競馬場コード、開催回、開催日、レース番号、競走名略称10文字)をRichTextBoxに表示します。

JV-Linkに実装されている以下のメソッドの使い方を理解する。

JVReadメソッドで取得したJV-Dataを読み出す

【 やってみよう 】

① Lesson-2までを実装したフォーム(frmMain)を含むプロジェクトを開きます。
(前回のレッスンの続きから開始するのであれば、この作業は必要ありません。)

フォームにテキスト表示エリア(RichTextBox)を追加します。




追加したRichTextBoxの各プロパティを以下のように変更します。

「(Name)」 :rtbData
「Multiline」 :True
「WordWrap」 :False

② 読み出したJV-Dataは1レコード毎に連続した固定長の文字列となっています。この文字列を「意味のある区切り」ごとに分割するためには、JV-Data仕様書を参考に、「○○バイト目から●●バイト分は◇◇情報」のように順次切り出していく必要があります。
今回は、JRA-VAN SDKに同梱されている「JV-Data構造体」(正確には構造体+構造体への格納関数)を用いて、複雑なコーディングをすることなく、簡単に「意味のある区切り」ごとに切り出してみましょう。

ソリューションエクスプローラーより右クリックにて「追加(D)」→「既存の項目(G)」を選択してダイアログを表示し、「JRA-VAN SDK」の解凍後ディレクトリの下の「\JV-Data構造体\VB2019版」にある「JVData_Structure.vb」を選択して、「追加」クリックします。


③ ソリューションエクスプローラーに「JVData_Structure.vb」が追加されます。

④ レース詳細情報の一部をリッチテキストボックスに表示するように「データ取得」ボタンクリック時の処理を修正しましょう(**部分は前回コーディング済)。

*Private Sub btnGetJVData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGetJVData.Click*

*    Dim lReturnCode As Long*

*    Try*
*        Dim strDataSpec As String        '' 引数 JVOpen:ファイル識別子*
*        Dim strFromTime As String        '' 引数 JVOpen:データ提供日付*
*        Dim lOption As Long              '' 引数 JVOpen:オプション*
*        Dim lReadCount As Long           '' JVLink 戻り値*
*        Dim lDownloadCount As Long       '' JVOpen:総ダウンロードファイル数*
*        Dim strLastFileTimestamp As String '' JVOpen: 最新ファイルのタイムスタンプ゚*

        Const lBuffSize As Long = 110000  ''JVRead:データ格納バッファサイズ
        Const lNameSize As Integer = 256  ''JVRead:ファイル名サイズ
        Dim strBuff As String             ''JVRead:データ格納バッファ
        Dim strFileName As String         ''JVRead:ダウンロードファイル名
        Dim RaceInfo As JV_RA_RACE        ''レース詳細情報構造体 ***Point1***

*        '引数設定*
*        strDataSpec = "RACE"*
*        strFromTime = "00000000000000"*
*        lOption = "2"*

*        ' JVLinkダウンロード処理*
*        lReturnCode = Class1.AxJVLink.JVOpen(strDataSpec, strFromTime, lOption, _*
*                            lReadCount, lDownloadCount, strLastFileTimestamp)*

*        'エラー判定*
*        If lReturnCode <> 0 Then*
*            MsgBox("JVOpenエラー:" & lReturnCode)*
*        Else*
*            MsgBox("戻り値 : " & lReturnCode & vbCrLf & _*
*               "読み込みファイル数 : " & lReadCount & vbCrLf & _*
*               "ダウンロードファイル数 : " & lDownloadCount & vbCrLf & _*
*               "タイムスタンプ : " & strLastFileTimestamp)*
            If lReadCount > 0 Then
                Do
                  'バッファ作成
                  strBuff = New String(vbNullChar, lBuffSize)
                  strFileName = New String(vbNullChar, lNameSize)

                    'JVReadで1行読み込み ***Point2***
                    lReturnCode = Class1.AxJVLink.JVRead(strBuff, lBuffSize, _
 strFileName)

                    'リターンコードにより処理を分枝 ***Point3***
                    Select Case lReturnCode
                        Case 0      ' 全ファイル読み込み終了
                            Exit Do
                        Case -1 ' ファイル切り替わり
                        Case -3     ' ダウンロード中
                        Case -201   ' Initされてない
                            MsgBox("JVInitが行われていません。")
                            Exit Do
                        Case -203   ' Openされてない
                            MsgBox("JVOpenが行われていません。")
                            Exit Do
                        Case -503   ' ファイルがない
                            MsgBox(strFileName & "が存在しません。")
                            Exit Do
                        Case Is > 0 ' 正常読み込み
                            'レコード種別IDの識別 ***Point4***
                            If Mid(strBuff, 1, 2) = "RA" Then
                                'レース詳細のみ処理
                                'レース詳細構造体への展開 ***Point5***
                                RaceInfo.SetData(strBuff)

                                'データ表示
                                rtbData.AppendText( _
                                   "年:" & RaceInfo.id.Year & _
                                   " 月日:" & RaceInfo.id.MonthDay & _
                                   " 場:" & RaceInfo.id.JyoCD & _
                                   " 回次:" & RaceInfo.id.Kaiji & _
                                   " 日次:" & RaceInfo.id.Nichiji & _
                                   " R:" & RaceInfo.id.RaceNum & _
                                   " レース名:" & RaceInfo.RaceInfo.Ryakusyo10 _
 & vbCrLf)
                            End If
                    End Select
                Loop While (1)
            End If
*       End If*

*    Catch*
*        Debug.WriteLine(Err.Description)*
*        Exit Sub*

*    End Try*

*    'JVLink終了処理*
*    lReturnCode = Me.AxJVLink1.JVClose()*
*    If lReturnCode <> 0 Then*
*        MsgBox("JVClseエラー:" & lReturnCode)*
*    End If*

*End Sub*

・Point1
③~④で組み込んだ「JV-Data構造体」で定義されている「レース詳細情報構造体(JV_RA_RACE)」型の構造体「RaceInfo」を宣言。

・Point2
Do~Loop While 内でJVReadを繰り返し、JV-Dataを1レコードずつ読み込み「Buff」に格納。

・Point3
Select Case を用いてJVReadの戻り値に応じた処理を実行(JVReadの戻り値に関しては、「JV-Linkインターフェース仕様書」の「3.コード表」を参照)。

・Point4
レコード種別IDが「RA」(レース詳細)のレコードのみ処理を実行。

・Point5
「Buff」に格納されたレコードを構造体「RaceInfo」に展開。

【 確認しよう 】

それでは、実際に動かしてみましょう。
① メニューから「デバッグ」→「デバッグ開始」を選択し、プログラムを実行します。エラーが発生した場合は、タスク一覧にエラーメッセージが表示されるので、正しく修正してエラーが無くなるまでビルドします。前回までに「利用キー」を設定していない場合は、フォーム上のメニューから「設定」→「JV-Linkの設定」を選択して「JV-Link設定」ダイアログを表示し、「利用キー」を設定します。

② フォームの「データ取得」ボタンをクリックすると、前回実装したコーディングにより、メッセージボックスがポップアップします。メッセージボックスには、リターンコードや読み込みファイル数、ダウンロードファイル数、最新読み込みファイルのタイムスタンプが表示されます。これらの数値は、実行するタイミングによって異なります。詳しくは、Lesson-2をご覧下さい。

③ メッセージボックスを「OK」で閉じるとレース詳細情報のうち「開催年、開催月日、競馬場コード、開催回、開催日目、レース番号、競走名略称10文字」がRichTextBoxに表示されます。
表示するレコード種別や項目などを変更して色々試してみましょう。

[ ワンポイントメモ ]
実際に競馬ソフトを作成する際には、取得した情報をデータベースやテキストファイルなどに格納しておきます。

「いいね!」 1