VB.net : マスタメンテサンプルコード解説(2)

  処理の流れ




ブラウザでダウンロード

Mtn_form

関連する記事




初期処理環境を整えて、画面が表示されると、第一パスの処理になります。

第一パス

  キー入力からデータの読み出し処理を行います。


第ニパス

  明細入力からデータの更新処理を行います。





  初期処理



データベースの準備が最も大きな処理となりますが、画面の簡単な初期処理等も行います
( Form の Load イベントの利用 )

  
' ******************************************************
' 【マスタメンテ初期処理】
'
' 目的    : FORM の LOAD に伴う初期処理
' 作成者   : lightbox
' ファイル名 : 初期処理.vb
' ※ アプリケーション開始後の処理はここで行う
' ******************************************************

Imports System.Text
Imports System.ServiceProcess

Partial Class Form1

    ' ******************************************************
    ' 初期処理
    ' ( フォームは表示されていない )
    ' ******************************************************
    Private Sub Form1_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.Load

        ' デバッグモードログ
        My.Application.Debug.Write("初期処理を開始しています")

        ' INI ファイル処理オブジェクトのインスタンスを作成
        ini = New INI(INI_PATH)
        msg = New INI(INI_PATH_MESSAGE)

        ' サービスが実行されていない場合にサービスを実行
        Dim sc As New ServiceController()
        If ini.GetDBType() = "1" Then
            sc.ServiceName = ini.GetValue("MySQL", "Service")
            If sc.Status = ServiceProcess.ServiceControllerStatus.Stopped Then
                sc.Start()
            End If
        End If

        ' DB 接続
        db = New DB( _
            ini.GetDBType(), _
            ini.GetServer(), _
            ini.GetDB(), _
            ini.GetUser(), _
            ini.GetPass() _
        )
        db.Connect()

        ' 処理区分の先頭を選択状態
        Me.処理区分.SelectedIndex = 0
        ' フォームを中央へ移動
        Me.CenterToScreen()

    End Sub

    ' ******************************************************
    ' フォーム表示後の初期処理
    ' ******************************************************
    Private Sub Form1_Shown(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles Me.Shown

        Me.社員コード.Focus()

    End Sub

End Class
  



  第一パス(会話)の処理

ここで重要なのは、Validating、Validated、Click イベントの関係です。

Validate という概念は、Visual Studio の前より存在するアプリケーション作成用の概念で、
フィールドに入力されたデータのチェックが目的です。

この発生タイミングは、データが変更されてフォーカスが他に移動する場合に発生し、特に最初の
Validating イベントでは、cancel が可能で、cancel すると、フォーカス移動がキャンセルされて、
元のフィールドへ戻り、きちんとアプリケーションを作成しないと、終了できない画面が作成される
可能性があるので注意して下さい。

確認ボタンへフォーカスが移ると、必然的に Validating イベントが発生して処理が起こります。
その後、キャンセルが発生しなければ、Validated イベントへと移行してデータの確定された処理
を行います。
( 実際はこの過程でエラーが発生する場合がありますが、その場合の復帰処理は別に考える必要があります。)

通常、次のパス用の画面の準備を行い、フォーカスを移動( または画面切り替え )して、第二パス( 会話 )
へと移行します。

もし、キャンセル処理が発生すると、Validated イベントは実行されませんし、Validating イベント
を引き起こした原因が、click イベントだった場合、click イベントも実行されません。


  
' ******************************************************
' 【第一パスの処理】
'
' 目的    : 画面定義と、アプリのエントリポイント
' 作成者   : lightbox
' ファイル名 : 01_Form.vb
' ******************************************************

Public Class Form1

    ' ******************************************************
    ' キー入力のチェック処理
    ' ******************************************************
    Private Sub 社員コード_Validating(ByVal sender As Object, _
    ByVal e As System.ComponentModel.CancelEventArgs) Handles 社員コード.Validating

        ' -------------------------------------------------
        ' 未入力チェック
        ' -------------------------------------------------
        If Trim(Me.社員コード.Text) = "" Then
            msg.DispError("001", Me.社員コード, e)    ' 必須入力
            Exit Sub
        End If

        ' -------------------------------------------------
        ' 数値チェック
        ' -------------------------------------------------
        If Not CheckInt(Me.社員コード.Text) Then
            msg.DispError("002", Me.社員コード, e)
            Exit Sub
        End If

        ' -------------------------------------------------
        ' キーコードの前ゼロ編集処理
        ' -------------------------------------------------
        'Me.社員コード.Text = num.ToString("0000")
        Me.社員コード.Text = String.Format("{0:0000}", Integer.Parse(Me.社員コード.Text))

        ' -------------------------------------------------
        ' DB 読み出し
        ' -------------------------------------------------
        Dim myQuery As String = GetSql(Me.SELECT_SQL, Me.社員コード.Text)

        myReader = db.Query(myQuery)
        Dim bExist As Boolean = myReader.HasRows

        ' 処理区分により、チェック
        Select Case Me.処理区分.SelectedIndex
            Case 0, 2 ' 修正または削除
                If Not bExist Then
                    msg.DispError("003", Me.社員コード, e)
                    myReader.Close()
                End If
            Case 1 ' 新規
                If bExist Then
                    msg.DispError("004", Me.社員コード, e)
                    myReader.Close()
                End If
        End Select

    End Sub


    ' ******************************************************
    ' キー入力のチェック完了時の処理
    ' ******************************************************
    Private Sub 社員コード_Validated(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles 社員コード.Validated

        ' -------------------------------------------------
        ' ボディ部のデータ編集
        ' -------------------------------------------------
        Select Case Me.処理区分.SelectedIndex
            Case 0 ' 修正
                Me.社員名.Text = db.Value(myReader, "氏名")
                Me.基本給.Text = db.Value(myReader, "給与")
                ' 日付の編集処理
                If (db.Value(myReader, "生年月日") = "") Then
                    Me.生年月日.Value = CDate(Today().Date)
                    Me.生年月日.Checked = False
                Else
                    Me.生年月日.Value = CDate(db.Value(myReader, "生年月日"))
                    Me.生年月日.Checked = True
                End If

            Case 1 ' 新規
                Me.社員名.Text = ""
                Me.基本給.Text = ""
                Me.生年月日.Value = CDate(Today().Date)
                Me.生年月日.Checked = False
            Case 2 ' 削除
                Me.社員名.Text = db.Value(myReader, "氏名")
                Me.基本給.Text = db.Value(myReader, "給与")
                ' 日付の編集処理
                If (db.Value(myReader, "生年月日") = "") Then
                    Me.生年月日.Value = CDate(Today().Date)
                    Me.生年月日.Checked = False
                Else
                    Me.生年月日.Value = CDate(db.Value(myReader, "生年月日"))
                    Me.生年月日.Checked = True
                End If

        End Select

        myReader.Close()

    End Sub

    ' ******************************************************
    ' 確認
    ' ******************************************************
    Private Sub 確認_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles 確認.Click

        Select Case Me.処理区分.SelectedIndex
            Case 0, 1 ' 修正・新規
                Me.ヘッド部.Enabled = False
                Me.ボディ部.Enabled = True
            Case 2 ' 削除
                Me.ヘッド部.Enabled = False
                Me.ボディ部.Enabled = True

                Dim obj As Object

                For Each obj In Me.ボディ部.Controls
                    If obj.GetType().ToString() = "System.Windows.Forms.TextBox" Then
                        CType(obj, System.Windows.Forms.TextBox).Enabled = False
                    End If
                Next
                Me.生年月日.Enabled = False
        End Select

        Me.社員名.Focus()
        Me.社員名.SelectAll()

    End Sub

End Class
  



  第二パス( 会話 )の処理

第一パスと同じく、基本的にはデータのチェックを行って、問題が無ければ更新処理を行って、
その後初期画面へと移行( 画面遷移 ) します。

しかし、第二パスなので、第一パスへ戻るという選択肢もあり、通常「キャンセル」処理として
実装します

  
' ******************************************************
' 【第ニパスの処理】
'
' 目的    : 主なデータの画面入力処理
' 作成者   : lightbox
' ファイル名 : 02_Body.vb
' ******************************************************

Partial Class Form1

    ' ******************************************************
    ' 社員名のチェック
    ' ******************************************************
    Private Sub 社員名_Validating(ByVal sender As Object, _
    ByVal e As System.ComponentModel.CancelEventArgs) Handles 社員名.Validating

        ' -------------------------------------------------
        ' 未入力チェック
        ' -------------------------------------------------
        If Trim(Me.社員名.Text) = "" Then
            msg.DispError("101", Me.社員名, e)
            Exit Sub
        End If

    End Sub

    ' ******************************************************
    ' 基本給のチェック
    ' ******************************************************
    Private Sub 基本給_Validating(ByVal sender As Object, _
    ByVal e As System.ComponentModel.CancelEventArgs) Handles 基本給.Validating

        ' -------------------------------------------------
        ' 未入力チェック
        ' -------------------------------------------------
        If Trim(Me.基本給.Text) = "" Then
            msg.DispError("102", Me.基本給, e)
            Exit Sub
        End If

    End Sub

    ' ******************************************************
    ' キャンセル
    ' ******************************************************
    Private Sub キャンセル_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles キャンセル.Click

        UserControl.validateNone = True

        Me.ヘッド部.Enabled = True
        Me.ボディ部.Enabled = False

        Dim obj As Object

        For Each obj In Me.ボディ部.Controls
            If obj.GetType().ToString() = "System.Windows.Forms.TextBox" Then
                CType(obj, System.Windows.Forms.TextBox).Clear()
                CType(obj, System.Windows.Forms.TextBox).Enabled = True
            End If
        Next
        ' -------------------------------------------------
        ' DateTimePicker の初期化
        ' -------------------------------------------------
        Me.生年月日.Enabled = True
        Me.生年月日.Value = CDate(Today().Date)
        Me.生年月日.Checked = False

        Me.社員コード.Focus()
        Me.社員コード.SelectAll()


    End Sub

End Class
  



  更新処理

第二パス内の処理ではありますが、最も重要で長くなる処理なので通常は別ソースコードで
管理される事が多いと思います。仕様変更が発生した場合、最も中心的な変更場所となる
はずです。

  
' ******************************************************
' 【更新処理】
'
' 目的    : 更新
' 作成者   : lightbox
' ファイル名 : 更新処理.vb
' ******************************************************

Partial Class Form1

    ' ******************************************************
    ' 更新確認
    ' ******************************************************
    Private Sub 更新_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles 更新.Click

        ' -------------------------------------------------
        ' 更新前の妥当性チェック
        ' -------------------------------------------------
        Dim dummy As Object = Nothing
        Dim arg As System.ComponentModel.CancelEventArgs = _
            New System.ComponentModel.CancelEventArgs()
        arg.Cancel = False
        基本給_Validating(dummy, arg)
        If arg.Cancel Then
            Exit Sub
        End If


        ' -------------------------------------------------
        ' 更新確認用メッセージボックス
        ' -------------------------------------------------
        If MessageBox.Show("更新しますか?", "", _
            MessageBoxButtons.OKCancel, _
            MessageBoxIcon.Question, _
            MessageBoxDefaultButton.Button2) = _
                Windows.Forms.DialogResult.Cancel Then
            Exit Sub
        End If

        ' -------------------------------------------------
        ' 更新値として NULL を必要とする場合の前処理
        ' -------------------------------------------------
        Dim dtString As String = SS(Me.生年月日.Value)
        If Not Me.生年月日.Checked Then
            dtString = "NULL"
        End If

        ' -------------------------------------------------
        ' 初期化子による配列設定
        ' -------------------------------------------------
        'Dim rpl2 As String() = New String() _
        '{ _
        '    Me.社員コード.Text, _
        '   Me.社員名.Text, _
        '    Me.基本給.Text, _
        '    dtString _
        '}

        ' -------------------------------------------------
        ' 更新 SQL用置換データの準備
        ' -------------------------------------------------
        Dim rpl As String() = New String() {}
        Array.Resize(rpl, 4)
        rpl(0) = Me.社員コード.Text
        rpl(1) = Me.社員名.Text
        rpl(2) = Me.基本給.Text
        rpl(3) = dtString

        ' -------------------------------------------------
        ' 更新 SQLの取得
        ' -------------------------------------------------
        Dim myQuery As String = ""
        Select Case Me.処理区分.SelectedIndex
            Case 0 ' 修正
                myQuery = GetSql2(UPDATE2_SQL, rpl)
            Case 1 ' 新規
                myQuery = GetSql2(INSERT_SQL, rpl)
            Case 2 ' 削除
                myQuery = GetSql(DELETE_SQL, Me.社員コード.Text)
        End Select

        ' -------------------------------------------------
        ' 更新
        ' -------------------------------------------------
        MsgBox(myQuery)
        db.Execute(myQuery)

        ' -------------------------------------------------
        ' 第一パスへの移行準備
        ' -------------------------------------------------
        Me.ヘッド部.Enabled = True
        Me.ボディ部.Enabled = False

        ' -------------------------------------------------
        ' テキストフィールドの一括クリア
        ' -------------------------------------------------
        Dim nControls As Integer = Me.ボディ部.Controls.Count
        Dim obj As Object

        For Each obj In Me.ボディ部.Controls
            If obj.GetType().ToString() = "System.Windows.Forms.TextBox" Then
                CType(obj, System.Windows.Forms.TextBox).Clear()
                CType(obj, System.Windows.Forms.TextBox).Enabled = True
            End If
        Next
        ' -------------------------------------------------
        ' DateTimePicker の初期化
        ' -------------------------------------------------
        Me.生年月日.Enabled = True
        Me.生年月日.Value = CDate(Today().Date)
        Me.生年月日.Checked = False

        ' -------------------------------------------------
        ' 第一パスへの移行
        ' -------------------------------------------------
        Me.社員コード.Clear()
        Me.社員コード.Focus()

    End Sub

End Class
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ