SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

既存のRDBシステムに会員情報の名寄せ機能を追加する

泣き別れしたデータの統合
―ASP.NETでの実装方法

既存のRDBシステムに会員情報の名寄せ機能を追加する 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

ロジックの定義

 「Unify.aspx.vb」にあり、主なプロシージャは以下のとおりです。

表8 主なプロシージャ一覧
プロシージャ名 処理内容
vwSearch_Activate 「検索条件設定画面」表示時にSession変数をクリアする
vwTarget_Activate 「対象会員選択画面」表示時にSession変数をクリアする
Page_PreLoad 名寄せ処理用「指示表」を動的に生成する
btnVerify_Click 「指示表」をチェックし「確認表」を表示する
btnBackDirect_Click 「確認表」から「指示表」に戻る処理を行う
btnUnify_Click 「確認表」を基に、名寄せ処理を行う

 vwSearch_ActivateとvwTarget_Activateは、各ViewがActiveになった時に発生するイベントで、Session変数をクリアします(コードは省略)。

 Page_PreLoadが今回のポイントとなるプロシージャです。

リスト2 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次元配列に格納して準備をします。

図9 会員テーブルから2次元配列にデータを格納
図9 会員テーブルから2次元配列にデータを格納

 (4)2次元配列を基にTable、TableRow、TableCell、RadioButtonコントロールを使って、変数tblUnifyに「指示表」を組み立てます。

図10 2次元配列のデータから「指示表」を組み立てる
図10 2次元配列のデータから「指示表」を組み立てる

 コントロールは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画面に進むことです。

リスト3 btnVerify_Click(抜粋)
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コントロールを取得できます。

図11 RadioButtonの探索
図11 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と同様に、確認表から選択値を取り出して、配列に格納しておきます。

図12 選択値の取り出し
図12 選択値の取り出し

 次に、会員テーブルを更新します。(1)配列に格納した選択値を基にレコードを新規に追加し、(2)自動連番で取得された新会員IDを取得します。(3)名寄せ元のレコードを「状況='U'」、「名寄せ先ID=新会員ID」として更新します。

 テーブルに対して複数の処理を行っていますので、厳密にはトランザクション処理(全部成功しなければ元に戻す仕組み)が必要ですが、ここでは省略しています。トランザクション処理を用いる方法については、次回取り上げる予定です。

図13 会員テーブルの更新
図13 会員テーブルの更新

 処理が正常に終了したら、続けて名寄せができるようvwTargetに戻りますが、処理結果を反映するため、対象会員一覧gvUnifyを更新しておきます。

まとめ

 今回は、Tableコントロールを動的に生成することにより、より実践的な名寄せ処理を紹介しました。定型処理に威力を発揮するASP.NETですが、独自のコントロールでの処理に挑戦してみてはいかがでしょうか。次回は、会員IDを外部キーに持つ関連テーブルの修正を含め、名寄せに関連して必要になる事柄についてまとめる予定です。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
既存のRDBシステムに会員情報の名寄せ機能を追加する連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 遠藤 存(エンドウ アリ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6804 2012/11/02 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング