VB Web マスターデータクラス

基本クラス・派生クラス、構造体

クラス(拡張子.vbのファイル)をプロジェクトに追加して、ファイル名をClsTokuisakiに変更します。このClsTokuisaki.vbクラスファイルに得意先基本クラスとその派生クラスを実装します。

さらに、このClsTokuisaki.vbファイルに、得意先データ構造体TokuisakiData を宣言しておきます。

【基本クラスメンバー】

基本クラス(基底クラス)ClsTokuisakiBase は抽象クラスとするので、コンストラクタを実装しません。

  • 定数メンバー:得意先マスター表、得意先コード
  • 変数メンバー:得意先データ構造体
  • プロパティ:得意先名称、得意先郵便番号、得意先住所
  • メソッド:得意先コードのエラーチェック

【得意先派生クラスメンバー】

基本クラス(基底クラス)ClsTokuisakiBase から派生した ClsTokuisaki クラスには、得意先マスター表の選択・更新・削除処理に必要な共通メンバーを実装します。

  • コンストラクタ
  • プロパティ:得意先コード

【得意先得意先データ構造体】

得意先データは構造体として宣言します。これがシンプルでいちばん分かりやすいと思います。

VB ソースリスト

マスター照会・更新・削除で使うメンバーは、派生クラスとして実装します。基本クラスからはインスタンスを生成できません。基本クラスには、共通のメンバーを実装します。

Option Strict On
Imports System.Data             ' DataTable型

'%%%%%%%%%%%%%%%%%%%%%% 得意先データ構造体 %%%%%%%%%%%%%%%%%%%%%%%%
Public Structure TokuisakiData
  Public tCode As String      ' 得意先コード
  Public tName As String      ' 得意先名称
  Public tJusho As String     ' 得意先住所
  Public tYuBango As String   ' 得意先郵便番号
End Structure

'%%%%%%%%%%%%%%%% 基本抽象クラス:得意先データ %%%%%%%%%%%%%%%%%
Public MustInherit Class ClsTokuisakiBase

  '--------------------< 定数メンバー>--------------------
  Protected Const TABLE_NAME As String = "得意先マスター表"
  Protected Const KEY_FIELD As String = "得意先コード"

  '--------------------< 変数メンバー>--------------------
  Protected tokuisakiValue As TokuisakiData    ' 得意先データ

  ' MustInheritなのでコンストラクタを宣言しない

  '-------------------------------------------------------
  ' プロパティ:得意先名
  '-------------------------------------------------------
  Public Property TokuisakiMei() As String

    ' Getプロパティ
    Get
        Return tokuisakiValue.tName
    End Get
    ' Setプロパティ
    Set(ByVal tMeisho As String)
        ' 未入力ならエラー
        If tMeisho.Length> 0 Then
            tokuisakiValue.tName = tMeisho
        Else
            Throw New TokuisakiMeiException _
            ("得意先名が未入力です")
        End If
    End Set

  End Property

  '-------------------------------------------------------
  ' プロパティ:得意先住所
  '-------------------------------------------------------
  Public Property TokuisakiJusho() As String

    ' Getプロパティ
    Get
        Return tokuisakiValue.tJusho
    End Get

    ' Setプロパティ
    Set(ByVal tJusho As String)
        ' 未入力ならエラー
        Dim jusho() As String
        jusho = tJusho.Split(","c)
        If jusho(0).Length> 0 And jusho(1).Length> 0 And
            jusho(2).Length> 0 Then
            tokuisakiValue.tJusho = tJusho
        Else
            Throw New TokuisakiJushoException _
            ("得意先住所が未入力です")
        End If
    End Set

  End Property

  '-------------------------------------------------------
  ' プロパティ:郵便番号
  '-------------------------------------------------------
  Public Property YubinBango() As String

    ' Getプロパティ
    Get
        Return tokuisakiValue.tYuBango
    End Get

    ' Setプロパティ
    Set(ByVal tYuBango As String)
        ' 数字7桁以外はエラー
        If Regex.IsMatch(tYuBango, "^[0-9]{7}$") Then
            tokuisakiValue.tYuBango = tYuBango
        Else
            Throw New YubinBangoException _
            ("郵便番号を7桁数字で入力してください")
        End If
    End Set

  End Property

  '*******************************************************
  ' 機能:得意先コードエラーチェックメソッド
  ' 引数:得意先コード
  ' 戻値:なし
  ' 補足:エラーがあれば例外をスロー
  '*******************************************************
  Protected Sub CheckTokuisakiCode(ByVal tCode As String)

    ' 引数設定チェック
    If tCode.Length = 0 Then
        Throw New TokuisakiCodeException _
        ("得意先コードが未入力です")
    End If
    ' 数字以外はエラー
    If Not Regex.IsMatch(tCode, "^[0-9]+$") Then
        Throw New TokuisakiCodeException _
        ("得意先コードに数字以外の文字があります")
    End If
    ' 得意先コード長さチェック(4桁以外はエラー)
    If Not tCode.Length = 4 Then
        Throw New TokuisakiCodeException _
        ("得意先コードの桁数が正しくありません")
    End If

  End Sub

End Class

'/////////////// 派生クラス:得意先選択更新削除 ////////////////
Public Class ClsTokuisaki
  Inherits ClsTokuisakiBase

  '=======================================================
  ' 機能:コンストラクタ
  ' 引数:得意先コード
  '=======================================================
  Public Sub New(ByVal tCode As String)

    ' 最初に基本クラスのコンストラクタを呼び出す
    MyBase.New()
    ' 得意先コードエラーチェック
    CheckTokuisakiCode(tCode)
    ' 得意先マスター表からレコード取得
    Dim dbIO As New ClsTokuisakiTableIO()
    Dim dt As DataTable = dbIO.GetKeyRecord(tCode)
    If dt.Rows.Count = 1 Then
        ' レコードがあった時は正常
        tokuisakiValue.tCode = tCode          ' 得意先コード
        tokuisakiValue.tName = CStr(dt.Rows(0)("得意先名称"))
        tokuisakiValue.tJusho = CStr(dt.Rows(0)("得意先住所"))
        tokuisakiValue.tYuBango = CStr(dt.Rows(0)("郵便番号"))
    Else
        ' レコードがなかった時は例外スロー
        Throw New TokuisakiCodeException _
        ("得意先マスター表にレコードがありません")
    End If

  End Sub

  '-------------------------------------------------------
  ' プロパティ:得意先コード(読取専用)
  '-------------------------------------------------------
  Public ReadOnly Property TokuisakiCode() As String

    ' Getプロパティ
    Get
        Return tokuisakiValue.tCode
    End Get

  End Property

End Class

独自例外

Throw New TokuisakiCodeException("得意先コードに数字以外の文字があります") や、Throw New TokuisakiMeiException("得意先名が未入力です") の例外は、メッセージを表示するために、独自の例外クラスを実装しています。

独自例外クラス