CodeZine(コードジン)

特集ページ一覧

SQLによる条件付き重複データの抽出と単純な名寄せ

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/09/13 14:00
目次

画面の定義

 画面定義は「Unify.aspx」にあります。MultiViewコントロール「mtvw」にViewコントロール「vwSearch」(検索条件設定画面)と「vwTarget」(削除対象会員選択画面)を順に配置し、「vwSearch」ビューには、図6の上の画面のようにコントロールを配置します。

表6 主なコントロール(ID)
対象列 CheckBox TextBox
姓(漢字) chbSeiKanji txtSeiKanji
名(漢字) chbMeiKanji txtMeiKanji
姓(カナ) chbSeiKana txtSeiKana
名(カナ) chbMeiKana txtMeiKana
住所1 chbAddress1 txtAddress1
電話番号 chbTelNum txtTelNum
携帯番号 chbMobileNum txtMobileNum
図8 「vwSearch」ビューに配置されたコントロール
図8 「vwSearch」ビューに配置されたコントロール

 「vwTarget」ビューにはGridViewコントロールを配置し、データソースの指定では、ビジネスオブジェクトとして作成済の「Unify」クラスを選択、[データメソッドの定義]では[SELECT]タブにある[メソッドの選択]で作成済みの「getWMemberDataReader~」関数を選択します。[パラメーターの定義]では「氏名(姓)漢字」に関する2個は下表のように選択します。残り12個のパラメーターについても同様に選択してください。

表7 パラメーターの定義
名前 パラメーターソース ControlID
blnSeiKanji Control chbSeiKanji
strSeiKanji Control txtSeiKanji

 次に図6の下の画面のように、列を設定します。まず、ユーザが選択できるよう、GridViewの一番左にCheckBox列を追加し、TemplateFieldに変換します(名前は「CB1」)。

 2列目に主キーであるMemberID列をBoundField列として追加します。

 後は、表3のうち表示したい列をBoundField列として追加してください。

 最後に、余分な列を削除するため、[自動生成フィールド]のチェックを外します。

図9 GridViewの配置(完成形)
図9 GridViewの配置(完成形)

ロジックの定義

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

 第1の「btnSearch_Click」は、検索条件設定画面で[検索する]ボタンがクリックされた時の処理で、条件に従いデータ取得に成功すれば、削除対象会員選択画面に遷移します。

リスト5 「btnSearch_Click」の処理(一部)
    '(1)検索条件で重複チェック列が最低1つ指定されているか
    If Not (chbSeiKanji.Checked Or chbMeiKanji.Checked Or chbSeiKana.Checked Or chbMeiKana.Checked Or chbAddress1.Checked Or chbTelNum.Checked Or chbMobileNum.Checked) Then
(略)
    '(2)指定された検索条件で抽出した結果セットをGridViewにバインドする
    gvUnify.DataBind()
    If gvUnify.Rows.Count = 0 Then
(略)

 (1)全チェックの有無をORで繋いだ条件がTRUEなら、最低1つは選択されています。その否定(Not)がTRUEならすべて未選択なので、重複値チェックをせず、処理を中断します。

 (2)GridViewにバインドした抽出行数が0であれば、処理を中断します。

 第2の「btnUnify_Click」は、削除対象会員選択画面で[名寄せ処理実行]ボタンがクリックされた時の処理で、チェックされた会員について会員テーブルから削除します。

リスト6 「btnUnify_Click」の処理(一部)
(略)
    '(1)検索された会員一覧(GridView)を走査し、チェック数を数える
    For Each row As GridViewRow In gvUnify.Rows 'GridView各行について繰り返す
        If CType(row.FindControl("CB1"), CheckBox).Checked Then
            aryIdx += 1
            ReDim Preserve aryMemberID(aryIdx)
            aryMemberID(aryIdx) = row.Cells(1).Text 'GridViewの2列目が会員ID
        End If
    Next
(略)
    '(2)チェックされた会員IDについて、会員テーブルから削除する
    strSQL = "DELETE Member WHERE MemberID IN (" & Join(aryMemberID, ",") & ")"
(略)

 (1)重複値チェックの結果を表示したGridViewの各行について、チェックが付けられたかどうかを走査します。GridViewのチェック状況は、GridViewRowオブジェクト変数で各行を取得し、FindControlメソッドで見つけた"CB1"をCheckBoxオブジェクトに変換した上、そのCheckedプロパティの論理値で判断できます。これがTRUEなら該当行はチェックされているので、該当行のCellsプロパティの2番目(インデックスは0始まり)のTextプロパティにある会員IDを取得し、用意したaryMemberID配列を拡張して格納します(上記の結果、一人もチェックされていなければ、処理を中断します)。

 (2)チェックされた会員IDを持つレコードを会員テーブルから削除します。

まとめ

 銀行口座や年金問題などで話題の名寄せ処理ですが、通常の会員管理や顧客管理のシステムでも定常的に必要になります。皆様のシステムに応用されてはいかがでしょうか。

 次回は、名寄せ処理の部分をもう少し実践的にして、ASP.NETでは、標準のサーバーコントロールではできない実装方法の例を紹介する予定です。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

著者プロフィール

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

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

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5