ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
【VB.NET】社員マスタメンテ、変更仕様と手順 ( バージョン3モード )
日時: 2013/05/01 23:30
名前: lightbox



バージョン3
http://lightbox.on.coocan.jp/r205/2008/DB_ACCESS_CLASS_03.lzh
( ※ MDB をDB として使用していますが、MySQL、Oracle、SQLServer でも環境を作成すれば処理可能です )


★ 社員マスタメンテのダイアログは、「社員マスタメンテ」ボタンで表示されます
★ ここでの変更コードのサンプルは、関数等を使用せずにできるだけ自力で書くコードを使用しています
★ 現在実装されているのは、処理区分=2 でとりあえずデータが表示される程度です
★ 変更仕様の内容は、新規・修正・削除の更新と最低限のチェックの実装です





コントロールGroupCheckTypeDataTypeDbTypeDbDefaultEditFormat
社員コードLboxText102文字列または日付-
氏名LboxText210文字列または日付-
フリガナLboxText200文字列または日付-
性別LboxCombo21-数値-
生年月日LboxText201文字列または日付-
所属LboxCombo20-文字列または日付-
管理者LboxText202文字列または日付-
給与LboxText203数値としてNULLの時0-#,0
手当LboxText203数値としてNULLの時0-#,0
メンテナンス

(1) 所属コンボボックスに初期データの追加 ( No.1 )
日時: 2008/07/01 17:09
名前: lightbox


日時: 2008/07/01 17:09
名前: lightbox
場所 : MyBase.Load

拡張子:
' ************************
' 性別コンボボックス
' ************************
db.Query("SELECT コード,名称 from コード名称マスタ where 区分 = 1 order by コード")
Do While db.Read()
	' DB よりデータセット
	Me.性別.Add(db.GetValue("名称"), db.GetValue("コード"))
Loop
Me.性別.SelectedIndex = -1

' ************************
' 所属コンボボックス
' ************************
db.Query("SELECT コード,名称 from コード名称マスタ where 区分 = 2 order by コード")
Do While db.Read()
	' DB よりデータセット
	Me.所属.Add(db.GetValue("名称"), db.GetValue("コード"))
Loop
Me.所属.SelectedIndex = -1
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(2) 読み込まれた所属コードによる所属コンボボックスの選択と、管理者の氏名表示 ( No.2 )
日時: 2008/07/01 17:09
名前: lightbox
場所 : 確認.Click

● 管理者の氏名を表示する為に、自己結合に変更
拡張子:
Dim Query As String = String.Format("select" + _
  " 社員マスタ.社員コード" + _
  ",社員マスタ.氏名" + _
  ",社員マスタ.フリガナ" + _
  ",社員マスタ.所属" + _
  ",社員マスタ.性別" + _
  ",社員マスタ.作成日" + _
  ",社員マスタ.更新日" + _
  ",社員マスタ.給与" + _
  ",社員マスタ.手当" + _
  ",社員マスタ.管理者" + _
  ",管理者参照.氏名 as 管理者名" + _
  ",社員マスタ.生年月日" + _
  " from 社員マスタ" + _
  " left outer join 社員マスタ 管理者参照" + _
  " on 社員マスタ.管理者 = 管理者参照.社員コード" + _
  " where 社員マスタ.社員コード = '{0}'", _
Me.社員コード.Text)
● 読み込んだデータによって、コンボボックスの初期選択 ● 結合によって取得した管理者データの追加
拡張子:
' ************************
' 修正
' ************************
If Me.処理区分.SelectedValue = 2 Then
	If Not db.QueryAndRead(Query) Then
		MessageBox.Show("入力された社員コードは存在しません    ", _
		"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Me.社員コード.Focus()
	Else
		Me.Protect(1, True)
		Me.Protect(2, False)
		Me.Protect(3, False)

		Me.氏名.InnerText = db.GetValue("氏名")
		Me.フリガナ.InnerText = db.GetValue("フリガナ")
		Me.性別.SelectByValue(db.GetValue("性別"))
		Me.所属.SelectByValue(db.GetValue("所属"))
		Me.給与.InnerText = db.GetValue("給与")
		Me.手当.InnerText = db.GetValue("手当")

		' 管理者データ追加ぶん
		Me.管理者.InnerText = db.GetValue("管理者")
		Me.管理者名.InnerText = db.GetValue("管理者名")

		Me.生年月日.InnerText = db.GetDate("生年月日")

		Me.氏名.Focus()
	End If

End If
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(3) 修正時の更新処理を作成する ( No.3 )
日時: 2008/07/01 17:10
名前: lightbox
場所 : 更新.Click

● イベントの最初で DB に接続して、最後で接続解除する
● いったん対象データを読み込んで、処理区分と矛盾が無いかチェック
● 更新に成功したら、表示データをクリアして第一会話へ移行する
拡張子:
' DB に接続
If Not db.Connect() Then
	MessageBox.Show("DB接続に失敗しました    ", "エラー", _
	MessageBoxButtons.OK, MessageBoxIcon.Error)
	Return
End If

Dim Query As String = String.Format("select" + _
 " * from 社員マスタ " + _
 " where 社員コード = '{0}'", _
Me.社員コード.Text)

' ************************
' 修正
' ************************
If Me.処理区分.SelectedValue = 2 Then
	If Not db.QueryAndRead(Query) Then
		db.Close()
		MessageBox.Show("入力された社員コードは他で削除されました    ", _
		"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Return
	Else
		Query = "update 社員マスタ set "
		Query += " 氏名 = '" + Me.氏名.InnerText + "'"
		If (Me.フリガナ.InnerText).Trim() = "" Then
			Query += " ,フリガナ = NULL"
		Else
			Query += " ,フリガナ = '" + Me.フリガナ.InnerText + "'"
		End If
		If Me.所属.SelectedIndex = -1 Then
			Query += " ,NULL"
		Else
			Query += " ,所属 = '" + Me.所属.SelectedValue + "'"
		End If
		Query += " ,性別 = " + Me.性別.SelectedValue
		Query += " ,更新日 = Now"
		If (Me.給与.InnerText).Trim() = "" Then
			Query += " ,給与 = NULL"
		Else
			Query += " ,給与 = " + Me.給与.InnerText
		End If
		If (Me.手当.InnerText).Trim() = "" Then
			Query += " ,手当 = NULL"
		Else
			Query += " ,手当 = " + Me.手当.InnerText
		End If
		If (Me.管理者.InnerText).Trim() = "" Then
			Query += " ,管理者 = NULL"
		Else
			Query += " ,管理者 = '" + Me.管理者.InnerText + "'"
		End If
		If (Me.生年月日.InnerText).Trim() = "" Then
			Query += " ,生年月日 = NULL"
		Else
			Query += " ,生年月日 = '" + Me.生年月日.InnerText + "'"
		End If
		Query += " where 社員コード = '" + Me.社員コード.InnerText + "'"

		If -2 = db.Execute(Query) Then
			db.Close()
			MessageBox.Show("データベースの更新に失敗しました   ", _
			"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Return
		End If
	End If
End If

' DB 接続解除
db.Close()

' キャンセル処理と同じ事をするので、再利用
キャンセル_Click(Nothing, Nothing)
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(4) 処理区分1( 新規 ) に対してチェック処理を作成する ( No.4 )
日時: 2008/07/01 17:10
名前: lightbox
場所 : 確認.Click

● 修正時の処理とは処理区分によって排他的に処理されます
拡張子:
' ************************
' 新規
' ************************
If Me.処理区分.SelectedValue = 1 Then
	If db.QueryAndRead(Query) Then
		MessageBox.Show("入力された社員コードは既に存在します    ", _
		"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Me.社員コード.Focus()
	Else
		Me.Protect(1, True)
		Me.Protect(2, False)
		Me.Protect(3, False)

		Me.氏名.Focus()
	End If

End If
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(5) 処理区分1( 新規 ) に対して更新処理を作成する ( No.5 )
日時: 2008/07/01 17:10
名前: lightbox
場所 : 更新.Click


● DB 接続とDB 接続解除の間に記述します。
● 修正処理に並ぶように記述します
拡張子:
' ************************
' 新規
' ************************
If Me.処理区分.SelectedValue = 1 Then
	If db.QueryAndRead(Query) Then
		db.Close()
		MessageBox.Show("入力された社員コードは他で作成されました    ", _
		"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Return
	Else

		If Me.性別.SelectedIndex = -1 Then
			db.Close()
			MessageBox.Show("入力された社員コードは他で削除されました    ", _
			"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Return
		End If

		Query = "insert into 社員マスタ ("
		Query += "社員コード,氏名,フリガナ,所属,性別,作成日"
		Query += ",更新日,給与,手当,管理者,生年月日) values("
		Query += "'" + Me.社員コード.InnerText + "'"
		Query += ",'" + Me.氏名.InnerText + "'"
		If (Me.フリガナ.InnerText).Trim() = "" Then
			Query += ",NULL"
		Else
			Query += ",'" + Me.フリガナ.InnerText + "'"
		End If
		If Me.所属.SelectedIndex = -1 Then
			Query += ",NULL"
		Else
			Query += ",'" + Me.所属.SelectedValue + "'"
		End If
		Query += "," + Me.性別.SelectedValue
		Query += ",Now"
		Query += ",Now"
		If (Me.給与.InnerText).Trim() = "" Then
			Query += ",NULL"
		Else
			Query += "," + Me.給与.InnerText
		End If
		If (Me.手当.InnerText).Trim() = "" Then
			Query += ",NULL"
		Else
			Query += "," + Me.手当.InnerText
		End If
		If (Me.管理者.InnerText).Trim() = "" Then
			Query += ",NULL"
		Else
			Query += ",'" + Me.管理者.InnerText + "'"
		End If
		If (Me.生年月日.InnerText).Trim() = "" Then
			Query += ",NULL"
		Else
			Query += ",'" + Me.生年月日.InnerText + "'"
		End If
		Query += ")"

		If -2 = db.Execute(Query) Then
			db.Close()
			MessageBox.Show("データベースの更新に失敗しました   ", _
			"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Return
		End If
	End If
End If
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(6) 処理区分1( 新規 ) に対して正しい更新処理を実行する為に、チェック処理を追加 ( No.6 )
日時: 2008/07/01 17:38
名前: lightbox
場所 : 更新.Click

● 処理区分=1 の更新処理直前に、チェックして更新をキャンセルさせます
● 論理的には、DB 接続前にすべきですが、他のエラー処理と同等にしています
( 常時接続仕様にすればこのままで OK )
拡張子:
If Me.性別.SelectedIndex = -1 Then
	db.Close()
	MessageBox.Show("性別を選択して下さい    ", "エラー", _
	MessageBoxButtons.OK, MessageBoxIcon.Error)
	Me.性別.Focus()
	Return
End If
※ キャンセルボタンの CausesValidation が False となっているので、 キャンセルボタンをクリックしても Validate は発生しません ※ 上記だけでは不十分ですが、ユーザコントロールが使用不可になっている状態では そのコントロールの Validate は発生しません
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(7) 処理区分3( 削除 ) に対してチェック処理とデータ表示処理を作成する ( No.7 )
日時: 2008/07/01 17:26
名前: lightbox
場所 : 確認.Click

● 削除処理の第二会話では、データを編集する事はできません( プロテクトされます )
拡張子:
' ************************
' 削除
' ************************
If Me.処理区分.SelectedValue = 3 Then
	If Not db.QueryAndRead(Query) Then
		MessageBox.Show("入力された社員コードは存在しません    ", _
		"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Me.社員コード.Focus()
	Else
		Me.Protect(1, True)
		Me.Protect(2, True)
		Me.Protect(3, False)

		Me.氏名.InnerText = db.GetValue("氏名")
		Me.フリガナ.InnerText = db.GetValue("フリガナ")
		Me.性別.SelectByValue(db.GetValue("性別"))
		Me.所属.SelectByValue(db.GetValue("所属"))
		Me.給与.InnerText = db.GetValue("給与")
		Me.手当.InnerText = db.GetValue("手当")
		Me.管理者.InnerText = db.GetValue("管理者")
		Me.管理者名.InnerText = db.GetValue("管理者名")
		Me.生年月日.InnerText = db.GetDate("生年月日")

		Me.更新.Focus()
	End If

End If
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(8) 処理区分3( 削除 ) に対して更新処理を作成する ( No.8 )
日時: 2008/07/01 17:27
名前: lightbox
場所 : 更新.Click

拡張子:
' ************************
' 削除
' ************************
If Me.処理区分.SelectedValue = 3 Then
	If Not db.QueryAndRead(Query) Then
		db.Close()
		MessageBox.Show("入力された社員コードは他で削除されました    ", _
		"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
		Return
	Else
		Query = "delete from 社員マスタ "
		Query += " where 社員コード = '" + Me.社員コード.InnerText + "'"

		If -2 = db.Execute(Query) Then
			db.Close()
			MessageBox.Show("データベースの更新に失敗しました   ", _
			"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
			Return
		End If
	End If
End If
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(9) 管理者を入力された場合、管理者名を表示する ( No.9 )
日時: 2008/07/01 17:34
名前: lightbox
場所 : 管理者.Validating
( エラーチェックを行う場所 )

● 入力されたコードが存在しなければエラー
● 上記の場合は、管理者名はクリアする
拡張子:
If Me.管理者.InnerText.Trim() = "" Then
	Return
End If

If Not db.Connect() Then
	MessageBox.Show("DB接続に失敗しました    ", _
	"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
	Return
End If

Dim Query As String = String.Format("select" + _
 " * from 社員マスタ " + _
 " where 社員コード = '{0}'", _
Me.管理者.Text)

If Not db.QueryAndRead(Query) Then
	Me.管理者名.InnerText = ""
	db.Close()
	MessageBox.Show("入力された管理者コードは存在しません    ", _
	"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
	' エラー扱い ( フィールドを離れられない )
	e.Cancel = True
	Return
End If
場所 : 管理者.Validated ( エラーが無かった場合の後処理 ) ● 未入力に変更された場合は、管理者名をクリアする ● コードが存在した場合は氏名をセットする
拡張子:
If Me.管理者.InnerText.Trim() = "" Then
	Me.管理者名.InnerText = ""
	Return
End If

Me.管理者名.InnerText = db.GetValue("氏名")

' Validating からの引継ぎ
db.Close()
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
(10) 社員コードの未入力チェックは、確認ボタンで行う ( No.10 )
日時: 2008/07/01 17:37
名前: lightbox
場所 : 確認.Click

● Validate で行うと、処理区分を変更できなくなるので注意して下さい
拡張子:
If Me.社員コード.InnerText.Trim() = "" Then
	MessageBox.Show("必須入力です    ", "エラー", _
	MessageBoxButtons.OK, MessageBoxIcon.Error)
	Me.社員コード.Focus()
	Return
End If
このアーティクルの参照用URLをクリップボードにコピー メンテナンス