ロジックの定義
「Unify.aspx.vb」にあり、主なプロシージャは以下のとおりです。
| プロシージャ名 | 処理内容 |
| vwSearch_Activate | 「検索条件設定画面」表示時にSession変数をクリアする |
| vwTarget_Activate | 「対象会員選択画面」表示時にSession変数をクリアする |
| Page_PreLoad | 名寄せ処理用「指示表」を動的に生成する |
| btnVerify_Click | 「指示表」をチェックし「確認表」を表示する |
| btnBackDirect_Click | 「確認表」から「指示表」に戻る処理を行う |
| btnUnify_Click | 「確認表」を基に、名寄せ処理を行う |
vwSearch_ActivateとvwTarget_Activateは、各ViewがActiveになった時に発生するイベントで、Session変数をクリアします(コードは省略)。
Page_PreLoadが今回のポイントとなるプロシージャです。
Protected Sub Page_PreLoad(sender As Object, e As System.EventArgs) Handles Me.PreLoad
'(1)vwSearchまたはvwTargetでの処理
tblUnify = New Table 'Tableコントロールの生成
If Session("tblUnify") Is Nothing Then '(2)Session変数にない場合
'(3)会員テーブルからデータを取得する
'(4)以下、Tableコントロールの組み立て
For row As Integer = 0 To aryHeader.Length - 1
Dim tRow As New TableRow
For col As Integer = -1 To aryMemberID.Length - 1
Dim tCell As New TableCell
If col = -1 Then '項目名
tCell.Text = aryHeader(row)
Else 'フィールド値
If row = 0 Then '主キー(選択不可)
tCell.Text = data(row, col)
Else
Dim rb As New RadioButton
rb.ID = "rb_" & row & "_" & col
rb.Text = data(row, col)
rb.GroupName = row
tCell.Controls.Add(rb)
End If
End If
tRow.Cells.Add(tCell)
Next col
tblUnify.Rows.Add(tRow)
Next row
Session("tblUnify") = tblUnify
Else '(5)エラー時、確認画面からの戻り時は、セッションから復元
tblUnify = CType(Session("tblUnify"), Table)
End If
'(6)Tableコントロールをプレイスホルダーへ配置
phDirect.Controls.Clear()
phDirect.Controls.Add(tblUnify)
End Sub
PreLoadは、どのイベントより先んじて呼ばれることを意識する必要があります。
(1)「mtvw.ActiveViewIndex」の値でどのビューから来たかが分かります。これが0の場合はvwSearchビューなので、何もせず処理を中断します。1の場合はvwTargetビューなので、検索された会員一覧を走査し、チェックされた会員が2人未満であればエラーとします。エラーがなければ、Session("aryMemberID")に会員IDの配列を設定します。
確認表を作成するため、まずTableコントロールを生成し、枠だけを準備します。(2)Session変数にない場合は未作成なので、(3)下図のように会員テーブルからデータを取得し、2次元配列に格納して準備をします。
(4)2次元配列を基にTable、TableRow、TableCell、RadioButtonコントロールを使って、変数tblUnifyに「指示表」を組み立てます。
コントロールはNewコマンドで生成します。各種設定を済ませたら、親コントロールにAddメソッドで追加していく要領で、Tableコントロールを組み立てていきます。
RadioButtonには後で参照できるよう、IDプロパティに「rb_行_列」とIDを設定します。同じ行での複数選択ができないよう、GroupNameプロパティに同じ値(何行目か)を設定します。項目名/値は、TableCell/RadioButtonのTextプロパティに設定します。
組み立ったら、再利用できるようにSession変数に保存しておきます。
(5)TableコントロールがSession変数にある場合(vwDirectでエラー、vwVerifyから戻ってきた)、すでに組み立て済みなので、そのまま変数tblUnifyに設定します。
(6)TableコントロールをvwDirectのプレイスホルダーphDirectへ配置します。
btnVerify_Clickの役割は指示表の選択項目を確認し、未選択の項目があればエラーメッセージを表示し、全項目が選択済ならばこれを確認表としてvwVerify画面に進むことです。
Protected Sub btnVerify_Click(sender As Object, e As System.EventArgs) Handles btnVerify.Click
'(1)指示表の確認のための準備
For row As Integer = 1 To aryHeader.Length - 1 '(2)会員ID以外の項目ごとの処理
selected = False '選択肢の初期化
For col As Integer = 0 To cols - 1 '(3)ラジオボタンの走査
Dim rb As New RadioButton
rb = tblUnify.FindControl("rb_" & row & "_" & col)
If rb.Checked Then 'チェックされていたら
'チェックされた値の強調表示
tblUnify.Rows(row).Cells(col + 1).BackColor = Drawing.Color.Aqua
selected = True 'チェック済
Exit For
End If
Next
'(4)エラーメッセージの設定
If Not selected Then '未チェックの場合
lblErrMsg.Text &= aryHeader(row) & "が未選択です。<br />"
End If
Next
'(5)未選択項目エラーがある場合
'(6)vwVerifyへ進む処理
End Sub
(1)Tableコントロールを準備し、Session変数から取り込み、確認の準備をします。
(2)指示表の会員ID以外の全部の行(項目)について、(3)RadioButtonを走査し、チェックの有無を確認します。Page_PreLoadで指示表を生成した際、RadioButtonには「rb_行_列」といったIDを付与しておいたので、FindControlメソッドにこのIDを渡すことによりRadioButtonコントロールを取得できます。
(4)未選択の行があれば、エラーメッセージを設定します。
(5)全部の行の確認終了後、未選択の行があれば、処理を中断します。
(6)全項目について選択済みなら、確認表としてvwVerifyのプレイスホルダーphVerifyに設定し、vwVerifyに進みます。
なお、確認表では、選択されたセルに着色して確認しやすくするとともに、再選択ができないように、TableコントロールのEnabled属性にFalseを設定します。
btnBackDirect_Clickの役割は、vwVerifyの確認表で修正箇所があった場合、vwDirectの指示表に戻るための処理です(コードは省略)。
処理方法はbtnVerify_Clickとほぼ同じです。確認表についてRadioButtonを走査し、チェックがあれば着色を解除します。指示表としてvwDirectのプレイスホルダーphDirectに設定し、vwDirectに戻ります。なお、再選択ができるように、TableコントロールのEnabled属性にTrueを設定します。
btnUnify_Clickの役割は、会員テーブルの名寄せ処理を行うことです(コードは省略)。
まずbtnVerify_Clickと同様に、確認表から選択値を取り出して、配列に格納しておきます。
次に、会員テーブルを更新します。(1)配列に格納した選択値を基にレコードを新規に追加し、(2)自動連番で取得された新会員IDを取得します。(3)名寄せ元のレコードを「状況='U'」、「名寄せ先ID=新会員ID」として更新します。
テーブルに対して複数の処理を行っていますので、厳密にはトランザクション処理(全部成功しなければ元に戻す仕組み)が必要ですが、ここでは省略しています。トランザクション処理を用いる方法については、次回取り上げる予定です。
処理が正常に終了したら、続けて名寄せができるようvwTargetに戻りますが、処理結果を反映するため、対象会員一覧gvUnifyを更新しておきます。
まとめ
今回は、Tableコントロールを動的に生成することにより、より実践的な名寄せ処理を紹介しました。定型処理に威力を発揮するASP.NETですが、独自のコントロールでの処理に挑戦してみてはいかがでしょうか。次回は、会員IDを外部キーに持つ関連テーブルの修正を含め、名寄せに関連して必要になる事柄についてまとめる予定です。




