tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルDAOで重複している商品レコードにフラグを立てたい
記事No15618
投稿日: 2012/11/06(Tue) 15:45
投稿者ep
MDBにテーブルは1つでテーブル名は「商品情報」としています。
そのテーブルの中に商品レコードが、10,000件程あるのですが、
その内、数十件、商品コードが重複しているレコードがあると思われます。
その重複しているレコードにフラグを立てたいのです。
丸1日考えましたがだめでした。

最初にMDBに重複なしの設定をすればよかったのですが、
許可したままの設定であとのまつりです。

どなたかよい方法をお教えください。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: DAOで重複している商品レコードにフラグを立てたい
記事No15619
投稿日: 2012/11/06(Tue) 22:34
投稿者魔界の仮面弁士
> その重複しているレコードにフラグを立てたいのです。
> 丸1日考えましたがだめでした。

SELECT 商品コード FROM テーブル GROUP BY 商品コード HAVING COUNT(*) >= 2

のような SQL を使えば、重複している商品コードを取り出せるので、
これと繋いで UPDATE してやれば、フラグを更新できるかと。

[ツリー表示へ]
タイトルRe^2: DAOで重複している商品レコードにフラグを立てたい
記事No15620
投稿日: 2012/11/07(Wed) 10:23
投稿者ep
> SELECT 商品コード FROM テーブル GROUP BY 商品コード HAVING COUNT(*) >= 2
>
> のような SQL を使えば、重複している商品コードを取り出せるので、
> これと繋いで UPDATE してやれば、フラグを更新できるかと。

ご回答ありがとうございます。

商品コード以外にフレキシブルグリッドにフィールドを表示したいと、

  Dim Db      As Database
    Dim Res     As Recordset
    
    strSQL = "SELECT 商品ID,商品コード,商品名 FROM 商品情報 GROUP BY 商品コード HAVING COUNT(*) >= 2"
    
    Set Db = OpenDatabase(ItemPath)
    Set Res = Db.OpenRecordset(strSQL, dbOpenDynaset)
    Set Data1.Recordset = Res

    Res.Close
    Db.Close
    Set Db = Nothing
    Set Res = Nothing
    Set Data1.Recordset = Nothing

してみたのですが、「集計関数の一部として'商品ID'を含んでないクエリを実行使用としました」とエラーが出ます。

よい方法をお教えいただけないでしょうか。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: DAOで重複している商品レコードにフラグを立てたい
記事No15621
投稿日: 2012/11/07(Wed) 14:07
投稿者らせつ
分からなかったらACCESSのクエリとかで作ってみるといいですよ。(重複抜き出す部分)
おのずと分かってきます。
SELECTの参照項目とGROUPで指定した項目を見比べて下さい。

> してみたのですが、「集計関数の一部として'商品ID'を含んでないクエリを実行使用としました」とエラーが出ます。

[ツリー表示へ]
タイトルRe^3: DAOで重複している商品レコードにフラグを立てたい
記事No15622
投稿日: 2012/11/07(Wed) 14:17
投稿者魔界の仮面弁士
> strSQL = "SELECT 商品ID,商品コード,商品名 FROM 商品情報 GROUP BY 商品コード HAVING COUNT(*) >= 2"

GROUP BY しているのが、商品コードだけだからでしょう。
集計関数(COUNT)を使っているのに、商品ID はグループ化されていませんよね。


集計関数(COUNT)の使い方を御存知無いようであれば、必要列に対して
ORDER BY でソートしておき、その Recordset を順に MoveNext していって
「ひとつ前の行と、現在の行が同じ内容だったら重複と見なす」
という形で処理することもできるかと思います。効率は落ちますけれどね。

[ツリー表示へ]
タイトルRe^4: DAOで重複している商品レコードにフラグを立てたい
記事No15623
投稿日: 2012/11/07(Wed) 20:01
投稿者ep
> GROUP BY しているのが、商品コードだけだからでしょう。
> 集計関数(COUNT)を使っているのに、商品ID はグループ化されていませんよね。
>
>
> 集計関数(COUNT)の使い方を御存知無いようであれば、必要列に対して
> ORDER BY でソートしておき、その Recordset を順に MoveNext していって
> 「ひとつ前の行と、現在の行が同じ内容だったら重複と見なす」
> という形で処理することもできるかと思います。効率は落ちますけれどね。

ご回答有難うございます。

SELECT 商品情報.商品ID,商品情報.商品名,商品情報.商品コード FROM 商品情報 WHERE (((商品情報.商品コード) In (SELECT [商品コード] FROM [商品情報] As TEMP GROUP BY [商品コード] HAVING Count(*)>1 )))

上記のクエリで重複を絞り込んだ上で必要なフィールドを表示できました。

お教えくださった、皆様有難うございました。

[ツリー表示へ]