tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルaccessでの空白の扱いについて
記事No14273
投稿日: 2009/11/19(Thu) 11:23
投稿者たく
vb初心者です。
環境は、xp professional version2002 servicepack3
vb6.0
access2000です。

はじめまして。どなたかお分かりになる方、教えていただけないでしょうか?

アクセスのある列のあるデータが何も入っていない(空白)だとして、
sqlで、sql=select * from 表 where 列 = ""
のようにして、
Set daoRec = daoDBs.OpenRecordset(sql,dbOpenDynaset)
If daoRec.Recordcount > 0 Then …
のようにして、件数を調べると、件数が正しく認識されない、という現象が起こるのですが、(やや簡略化したソースを示していますが)どうすれば正しくカウントされるでしょうか?ほかに""をNULLにしてもうまくカウントされませんでした。

よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: accessでの空白の扱いについて
記事No14276
投稿日: 2009/11/19(Thu) 14:54
投稿者花ちゃん
> アクセスのある列のあるデータが何も入っていない(空白)だとして、
> sqlで、sql=select * from 表 where 列 = ""
> のようにして、
> Set daoRec = daoDBs.OpenRecordset(sql,dbOpenDynaset)
> If daoRec.Recordcount > 0 Then …
> のようにして、件数を調べると、件数が正しく認識されない、という現象が起こるのですが、(やや簡略化したソースを示していますが)どうすれば正しくカウントされるでしょうか?ほかに""をNULLにしてもうまくカウントされませんでした。

検索すれば、色々見つかりますが、それらを試して見てもダメだったという事でしょうか?
http://www.google.com/search?q=access%82%C5%82%CC%8B%F3%94%92&num=50&hl=ja&filter=0&lr=lang_ja&ie=Shift_JIS

件数が正しく認識されない との事ですが、一部はカウントされ、カウントされないセルも
あるという事でしょうか?
そのセルの中身の違いは調べられたのでしょうか?

http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2007-02-23.htm

[ツリー表示へ]
タイトルRe^2: accessでの空白の扱いについて
記事No14277
投稿日: 2009/11/19(Thu) 17:07
投稿者へへへ
カウントしたいのは、空白ですか?
空文字ですか?
NULLですか?
まずはそこをはっきりさせた方がいいかと。

おそらく、nz関数で検索すると幸せになれる気がしますが。

[ツリー表示へ]
タイトルRe: accessでの空白の扱いについて
記事No14279
投稿日: 2009/11/19(Thu) 18:30
投稿者魔界の仮面弁士
> Set daoRec = daoDBs.OpenRecordset(sql,dbOpenDynaset)
> If daoRec.Recordcount > 0 Then …
そもそも何故、dbOpenDynaset を用いているのでしょうか?


> のようにして、件数を調べると、件数が正しく認識されない、という現象が起こるのですが、
下記 Vol.3 の Page.1 を参照してみてください。
http://www.canalian.com/DenRe/

[ツリー表示へ]
タイトルRe^2: accessでの空白の扱いについて
記事No14281
投稿日: 2009/11/20(Fri) 10:21
投稿者たく
皆様、ご回答ありがとうございます。

→花ちゃんさん

検索すれば、色々見つかりますが、それらを試して見てもダメだったという事でしょうか?
→だめでした。

件数が正しく認識されない との事ですが、一部はカウントされ、カウントされないセルも
あるという事でしょうか?
→全くカウントされません。

そのセルの中身の違いは調べられたのでしょうか?
→プログラム的に、Nullを入れるようになっていました。だから、sqlで、

xSQL1 = xSQL1 & "and 制作会社 = Null"

のようにしてみたのですが、カウントされませんでした。

→へへへさん

カウントしたいのは、空白ですか?
空文字ですか?
NULLですか?
まずはそこをはっきりさせた方がいいかと。
→Nullです。

おそらく、nz関数で検索すると幸せになれる気がしますが。
→テキスト型なので使えないようです。

→魔界の仮面弁士さん

そもそも何故、dbOpenDynaset を用いているのでしょうか?
→結合による選択クエリで作成したり、Recordsetのレコードが変更されると、もとになっているテーブルのレコードも更新され、もとになっているテーブルのレコードが更新されると、Recordsetも変更されるようにしたく、スナップショット作成ではないことからです。

→また、dbOpenDynasetを使った例がご紹介のページに出ていましたが、

  Sub RecordCountDynaset()
  Dim dbs As DAO.Database
  Dim rst As DAO.Recordset

  On Error GoTo Err_Sub

  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset("SELECT * FROM tblCustomer", dbOpenDynaset)
  rst.MoveLast
  Debug.Print "レコード数は: " & rst.RecordCount & " です."
  rst.Close
  Set rst = Nothing
  Set dbs = Nothing
End Sub

を参考にしてみても、
rst.MoveLast
のところで、レコード数が0の場合、カレントレコードがありません。とエラーが出てしまいます。

よきアドバイスをいただけるとうれしいです。

[ツリー表示へ]
タイトルRe^3: accessでの空白の扱いについて
記事No14282
投稿日: 2009/11/20(Fri) 12:47
投稿者花ちゃん
> 検索すれば、色々見つかりますが、それらを試して見てもダメだったという事でしょうか?
> →だめでした。

そう言ってしまっては、どうしょうもないのでは?

Null の調べ方で、Is Not Null や IS Null って使っているのがありませんでしたか?

何と何をどのように試したが、どうだったか位は書かないと。
又は、Null を取得したいなら、[Access Null] のキーワードで検索して調べて見るとか
して見たのですか?
http://hanatyan.sakura.ne.jp/logbbs1/wforum.cgi?mode=allread&no=2239&page=0#2312

それに、他の人に教えを乞うなら、[やや簡略化したソースを示していますが]ではなく
実際に試したコードを投稿しないと、試した、コードが間違っているのかどうかも判断
出来ないでしょう。

[ツリー表示へ]
タイトルRe^3: accessでの空白の扱いについて
記事No14285
投稿日: 2009/11/20(Fri) 14:07
投稿者魔界の仮面弁士
> rst.MoveLast
先に EOF チェックを行ってください。

> のところで、レコード数が0の場合、カレントレコードがありません。
それは概要説明のための“簡単なプログラム・コード”に過ぎないので、さほど細かく
記述されているわけでは無いのでしょう。On Error の処理もおかしいですしね。

[ツリー表示へ]
タイトルRe: accessでの空白の扱いについて
記事No14283
投稿日: 2009/11/20(Fri) 13:49
投稿者魔界の仮面弁士
> アクセスのある列のあるデータが何も入っていない(空白)だとして、

まず、元データが本当に「空白」であるのかどうかを確認してみてください。
Access 上では何も無いように見えても、実は不可視文字が入っていたという
可能性もあるかも知れません。(vbCrLf/vbTab/vbNullChar等)

確認のため、「Null データ」「空文字列データ」などを数件ずつ追加して、
それらが目的の SQL で取得できるかどうかを確認してみてください。


その結果、追加したデータは取得できるという事であれば、
コードの問題と言うよりも、先に入力されているデータが
そもそも「空白」では無かったという可能性が出てきます。

その場合には、テーブルタイプでの全件取得に切り替えて、該当行まで
移動した後、その空白データの内容が Null なのか、"" なのか、それ以外なのかを
調査してみては如何でしょう。SQL を直すのはデータの正体を把握した後の方が良いかと。

[ツリー表示へ]
タイトルRe^2: accessでの空白の扱いについて
記事No14284
投稿日: 2009/11/20(Fri) 14:05
投稿者へへへ
私の経験からすると、テキスト型であれば、
where nz(列) = ""
で抽出すれば、NULLと空文字どちらであっても抽出されるはずなのですが。

後学のため、どういった状況でどのようにnz関数を使用してダメだったのか、
教えていただけないでしょうか。

[ツリー表示へ]
タイトルRe^3: accessでの空白の扱いについて
記事No14286
投稿日: 2009/11/20(Fri) 14:10
投稿者魔界の仮面弁士
> 私の経験からすると、テキスト型であれば、
> where nz(列) = ""
> で抽出すれば、NULLと空文字どちらであっても抽出されるはずなのですが。

Nz(列) は、結果を Empty に変換します。
Nz(列, "") は、結果を "" に変換します。


条件式だけでみれば、Nz(Null) = "" も Nz("") = "" も成立しますが、
今回の空データが Null でも "" でも無かったとすれば、
抽出されない可能性はあるかも知れません。

[ツリー表示へ]
タイトルRe^4: accessでの空白の扱いについて
記事No14292
投稿日: 2009/11/21(Sat) 09:36
投稿者たく
皆様、いつもありがとうございます。

ひとつ、大切なことを言い忘れていました。対象となる列がキー項目ということです。上司に教わりました。空白を許すということは一意に特定することができなくなる可能性があり、データの整合性が取れなくなる可能性があるとのことでした。

申し訳ございませんでした。いろいろアドバイスを頂いたのに、自分の認識の甘さ、コミュニケーションスキルの無さで皆さんを混乱させてしまったかもしれません。

とりあえずは、空白を許さない方向で客と話を進めるつもりです。また解らなくなったらそのときはよろしくお願いいたします。

ありがとうございました。

[ツリー表示へ]