質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

2回答

18346閲覧

ASP.NET VB.NET 重複チェックの効率のいいロジックについて 

DgRp_08

総合スコア56

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/02/27 04:34

編集2016/02/27 04:37

申し訳ありません。
二重投稿になりましたもう一つの同タイトル質問はスルーして下さい。

GridViewを使用しているデータで重複禁止の項目があります。しかし、主キー項目ではありません。
Eval を使用して表示しているデータですが、そもそも重複入力禁止にできたら重複チェックも必要ありませんが可能でしょうか?
処理として、入力されたデータをDB更新したいのですが重複禁止の項目の重複データをチェックし、且つ何行目と何行目が重複しているのか行数を示さなければなりません。
重複入力禁止が可能でない場合、読み取る過程でチェックしなければなりませんが、効率のいいロジックを組めません。。。
Excelデータとかでなら一旦昇順にして……など考えてできたのですが。

項目は A B C とし、重複禁止項目はBです。
エラーになる仕様は以下の通り。

  • 全て空白の行は無視するが、それ以外で一つでも空白があればエラー
  • Bのデータが他の行と重複していたらエラー

エラーを見つけた段階でエラー終了ではなく、全行チェックしてエラー箇所を全行ピックアップしなければなりません。

現在出来ているおおまかな処理の流れ的には以下の様な感じです。
実際のコードをコピペしているわけじゃないのでスペルミス等はスルーして下さい。

VB.NET

1For li = 0 to レコード数 2 '全項目空白の行は無視 3 If A="" AND B="" AND C="" Then 4 Continue For 5 End if 6 7 'どれか一つでも空白だったらエラー 8 If A="" then 9 blnErrFlg = true 10 End if 11 If B="" then 12 blnErrFlg = true 13 End if 14 If C="" then 15 blnErrFlg = true 16 End if 17 18 if blnErrFlg then 19 'エラー行取得 20 strErrRow = strErrRow & "," & i & "行目" 21End if 22 23 24Next 25 26if blnErrFlg then 27 '例外スローで Mid(strErrRow,2)を表示させる。(X行目,X行目,X行目) 28End if 29 30'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 31' ここに項目Bの重複チェック処理を組みたい 32'※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 33 34For li = 0 to レコード数 35 'A,B,Cの項目のデータを取得 36 'Update処理 37Next

アドバイス等宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

For文ですべての行を調べることにしました。

投稿2016/02/29 14:11

DgRp_08

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のサンプル内容でいかがでしょうか。

VBNET

1'◆項目Bの重複チェック処理サンプル 2'B列重複情報抽出(gv=GridViewコントロール, B列位置=1(2列目) 3Dim dupeGroups = gv.Rows.OfType(Of GridViewRow).GroupBy(Function(row) row.Cells(1).Text) _ 4 .Where(Function(g) g.Count() > 1).ToArray() 5 6If dupeGroups.Count() > 0 Then 7 '重複あり 8 For Each dupeGroup In dupeGroups 9 '※重複情報はお好きに処理してください。以下はサンプルとして出力ウィンドウに表示しています。 10 Debug.WriteLine("重複B列値:{0}, 重複行位置:{1}" _ 11 , dupeGroup.Key _ 12 , String.Join(",", dupeGroup.Select(Function(r) r.RowIndex).ToArray())) 13 Next 14 '※上記ループでメッセージを作成してここで例外スロー? 15End If 16

投稿2016/02/27 17:49

nakit

総合スコア410

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DgRp_08

2016/02/29 14:14

本日、勤務先にてサンプルを試させていただきましたが、私のやりかたがまずかったのかまだよく解ってませんが、全行の行番号を取得するだけで、上手く実現できませんでした。 For文をネストして全行を調べることにしました。 回答有り難うございました。
nakit

2016/02/29 15:04 編集

あらら……おそらくB列が単純な「BoundField」ではなく「TemplateField」などのため、「row.Cells(1).Text」(※単純なTextプロパティ値)では有効な値が取得できず全件重複扱いになってしまったのでしょう。 グループ化したい値に置き換えると動作するはずです。 例えばItemTemplateでLabelの値でグループ化するのであれば「row.Cells(1).Text」の代わりに「CType(row.Cells(1).FindControl("Label1"), Label).Text」とする等。 ※ラベル名は適当です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問