Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2146 / 2272 ツリー ←次へ | 前へ→

【3721】あいまい条件を含んだレコード数のカウントは?? こもれび 04/10/19(火) 15:23 質問[未読]
【3723】Re:あいまい条件を含んだレコード数のカウン... ぬぅ 04/10/19(火) 15:52 発言[未読]
【3725】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/19(火) 16:47 発言[未読]
【3727】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/19(火) 17:12 お礼[未読]
【3728】Re:あいまい条件を含んだレコード数のカウン... クロ 04/10/19(火) 17:51 回答[未読]
【3730】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/20(水) 1:08 発言[未読]
【3731】Re:あいまい条件を含んだレコード数のカウン... Gin_II 04/10/20(水) 2:14 回答[未読]
【3732】Re:あいまい条件を含んだレコード数のカウン... クロ 04/10/20(水) 7:47 回答[未読]
【3734】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/20(水) 10:27 発言[未読]
【3738】Re:あいまい条件を含んだレコード数のカウン... YU-TANG 04/10/20(水) 12:55 発言[未読]
【3740】Re:あいまい条件を含んだレコード数のカウン... クロ 04/10/20(水) 13:33 発言[未読]
【3741】Re:あいまい条件を含んだレコード数のカウン... YU-TANG 04/10/20(水) 14:54 発言[未読]
【3742】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/20(水) 15:11 お礼[未読]
【3743】Re:あいまい条件を含んだレコード数のカウン... YU-TANG 04/10/20(水) 16:04 質問[未読]
【3746】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/21(木) 10:00 お礼[未読]
【3724】Re:あいまい条件を含んだレコード数のカウン... Gin_II 04/10/19(火) 16:37 回答[未読]
【3726】Re:あいまい条件を含んだレコード数のカウン... こもれび 04/10/19(火) 17:05 お礼[未読]

【3721】あいまい条件を含んだレコード数のカウン...
質問  こもれび  - 04/10/19(火) 15:23 -

引用なし
パスワード
   こもれびです

ご存知の方教えてください。


SQL文にて、WHERE句のなかで 「Like〜」を使用すると、このSQLを元に作製した
レコード数をVBAでカウント表示させようとすると0になってしまいます。

SQL文中にてCount関数を使用してもなぜか0となってしまいました。
同じSQL文をクエリーオブジェクトに貼り付けると得たいカウント数が表示されました。

1の時

SQL="SELECT 〜 FROM [tbl名] WHERE [フィールド名]= Like 'KOMOREBI*';"

Set cnn = currentproject.connection

rs.open SQL,cnn,adOpenKeyset,adLockOptimistic
Debug.print rs.Recordcount

結果は0 (ところが、このSQLを元にしたリストボックスはデータが表示されている)

2の時

SQL="SELECT Count([フィールド名]) as CNT FROM [tbl名] HAVING [フィールド名]= Like 'KOMOREBI*';"

Set cnn = currentproject.connection

rs.open SQL,cnn,adOpenKeyset,adLockOptimistic
Debug.print rs!CNT

結果はこちらも0

なぜにこのような結果になってしまうのでしょうか??

 

【3723】Re:あいまい条件を含んだレコード数のカウ...
発言  ぬぅ  - 04/10/19(火) 15:52 -

引用なし
パスワード
   こもれび さん、こんにちは!

SQL="SELECT * FROM [tbl名] WHERE [フィールド名] Like 'KOMOREBI%' ;"

どういう結果になるか試していただけますか?

【3724】Re:あいまい条件を含んだレコード数のカウ...
回答  Gin_II  - 04/10/19(火) 16:37 -

引用なし
パスワード
   直接の回答ではありませんが (^^ゞ

>SQL="SELECT Count([フィールド名]) as CNT FROM [tbl名] HAVING [フィールド名]= Like 'KOMOREBI*';"

レコード数を出すだけなら、DCount 関数を使ってもいいと思います。

Debug.Print DCount("[フィールド名]","[tbl名]","[フィールド名] Like 'KOMOREBI*'")

【3725】Re:あいまい条件を含んだレコード数のカウ...
発言  こもれび  - 04/10/19(火) 16:47 -

引用なし
パスワード
   こもれびです

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

>SQL="SELECT * FROM [tbl名] WHERE [フィールド名] Like 'KOMOREBI%' ;"

「*」(アステリスク)を「%」(パーセント)に変更することですね。
試してみましたが結果は同じく0でした。
アステリスクでリストボックスに1レコード表示されていたのですが、
パーセントではリストボックスに表示されなくなりました。(T_T)

確かにVB Scriptでは「%」にしないと受け付けてくれないんですよね。

【3726】Re:あいまい条件を含んだレコード数のカウ...
お礼  こもれび  - 04/10/19(火) 17:05 -

引用なし
パスワード
   こもれびです

回答ありがとうございます。<m(__)m>

>レコード数を出すだけなら、DCount 関数を使ってもいいと思います。
>
>Debug.Print DCount("[フィールド名]","[tbl名]","[フィールド名] Like 'KOMOREBI*'")

なるほど…
いぜんより関数の名前は見聞きしていましたが、使用したことは一度もありませんでした。
結果はOKです。得たい数字を得ることができました。
ありがとうございました。

ただ、なぜ0になるかという問題が残りました。
アプリケーションとしてはバージョンアップできることになりましたが
SQLとVBAの関係ということでは?が…
ADOの制限ということも考えられますので、追えるときに追ってみます。

ところで…
GinIIさん忘年会にはおいでになれますか?
石鹸箱のほうで谷さんが回答をお待ちになっています。(^^;

【3727】Re:あいまい条件を含んだレコード数のカウ...
お礼  こもれび  - 04/10/19(火) 17:12 -

引用なし
パスワード
   こもれびです

Gin_IIさんに教えていただきました、「DCount」を使用する方法
でアプリケーションのほうは解決できそうです。
お手数おかけしました。<m(__)m>

どうも問題は「ADOの制限」にあるのではないか?と考えておりますので
時間のあるときに追ってみます。
どうにも解せないので…
違いがわかりましたら目安箱に投稿することもかんがえております。
(このままで終わらせたら皆さんも気になると思いますので…)

【3728】Re:あいまい条件を含んだレコード数のカウ...
回答  クロ  - 04/10/19(火) 17:51 -

引用なし
パスワード
   Like演算子の使い方が...変でないですか?
Likeの前になして「=」があるのでしょうか?

ADOの制限ではぬぅさんの言われるようにワイルドカードが「*」でなく
「%」でないとLike演算子での抽出は行われません。

SQL = "SELECT * FROM テーブル1 WHERE [フィールド名] Like 'KOMOREBI%';"

の状態でちゃんとカウントされるはずですけど...

【3730】Re:あいまい条件を含んだレコード数のカウ...
発言  こもれび  - 04/10/20(水) 1:08 -

引用なし
パスワード
   こもれびです、こんばんは

▼クロ さん:
>Like演算子の使い方が...変でないですか?
>Likeの前になして「=」があるのでしょうか?

ごめんなさい、タイプミスです。
アプリケーションのコード中に「=」はありません

>ADOの制限ではぬぅさんの言われるようにワイルドカードが「*」でなく
>「%」でないとLike演算子での抽出は行われません。

ご指摘ありがとうございます、ぬぅさん(見ていらっしゃるかな…)
失礼しました。

実は曖昧の条件が複数ありまして、一部のみを「*」から「%」に変更
しただけでは成り立たなかったようです。
全てを「%」に変更しましたらカウントされました。
ただ…リストボックスのほうは「空っぽ」になってしまうのです。???

【3731】Re:あいまい条件を含んだレコード数のカウ...
回答  Gin_II  - 04/10/20(水) 2:14 -

引用なし
パスワード
   >全てを「%」に変更しましたらカウントされました。
>ただ…リストボックスのほうは「空っぽ」になってしまうのです。???

ADO で、SQL文を使うときには、% を使います。
リストボックスの値集合ソースに SQL文を使う場合は、 * のままで
いいです。

使い分けが必要ですね。

【3732】Re:あいまい条件を含んだレコード数のカウ...
回答  クロ  - 04/10/20(水) 7:47 -

引用なし
パスワード
   >ただ…リストボックスのほうは「空っぽ」になってしまうのです。???
これについてはどういう事なのでしょうか?SQLで抽出したものが
リストボックスの値集合ソースに反映されないということでしょうか?
その辺の事は書かれていないようなのですが....
※午前中は所用で離席してますので午後にのレスになります

【3734】Re:あいまい条件を含んだレコード数のカウ...
発言  こもれび  - 04/10/20(水) 10:27 -

引用なし
パスワード
   クロさん、こんにちは お世話になります

>これについてはどういう事なのでしょうか?SQLで抽出したものが
>リストボックスの値集合ソースに反映されないということでしょうか?
>その辺の事は書かれていないようなのですが....

そうなんです、反映されていません。
Gin_IIさんの回答によりますと、どうやら使い分けが必要
( ということは、それもADOの制限なのだろうか )
ということのようです。

>※午前中は所用で離席してますので午後にのレスになります

お手数おかけして申し訳ありません <m(__)m>
こちらでもヒントが得られましたので、いろいろやってみます。

投稿をお借りし、お話は変わりますが…
「忘年会」の話題が石鹸箱のほうで出ております。
クロさんのご予定(といってもまだ日程は決まっていません)は?
一度石鹸箱においでください。

【3738】Re:あいまい条件を含んだレコード数のカウ...
発言  YU-TANG WEB  - 04/10/20(水) 12:55 -

引用なし
パスワード
   こんにちは、YU-TANG です。

何となく思ったことをつらつら書いてみますが。

Access のネイティブオブジェクトの内部処理は、Access 2003 に
至るまで一貫して DAO/Jet-SQL で統一されています。したがって
リストボックスの RowSource などは Jet-SQL マナー(ワイルド
カードは * )になると私は理解しています。

Access 2002 以降は [ツール]-[オプション] に ANSI SQL モードと
SQL92 モード(ワイルドカードに % を使うのはこちら)の切り替え
箇所があると聞いていますが、私は Access 2000/DAO メインのユーザー
なので、その影響範囲がどこまで及ぶのかは知りません

MDB ファイルのデータベースエンジンはあくまで Jet ですから、
ADO 接続は仮にそれが自 MDB に対するものであったとしても、事実上
外部接続と理解しています。
例えるなら隣の部署の人に内線ではなく外線で電話をかけるような
ものでしょうか。
したがって、MDB 内の閉じた処理では(たとえ M$ がどんなに PR
しようと)ADO を使う意味はほとんど無いと考えています。

# Jet-SQL 4.0 の一部の新機能は ADOX からしか使えないものが
# 有るので、そのときは止むを得ず使うこともありますが。

% での SQL がなぜ ADO 接続で正しい RecordCount を返さないのか
については、私自身ほとんど ADO を使わないので分かりません。
何となく CursorLocation がアヤシく感じますが、根拠無しです。

【3740】Re:あいまい条件を含んだレコード数のカウ...
発言  クロ  - 04/10/20(水) 13:33 -

引用なし
パスワード
   >% での SQL がなぜ ADO 接続で正しい RecordCount を返さないのか

私も同じくADOは殆ど使いません...
ただ、今回の場合はADO内での「% での SQL」でレコードカウントはできているが
そのSQLをそのままリストボックスの値集合ソースに入れるとリストボックスに現
れないということではないでしょうか?

レコードカウントは「%」を使い、RowSourceの代入時には「*」を使うしかない
(Gin-IIさん曰く)と私も思います。
SQL変数を1つ増やして第1SQLはWHERE句前までとして
SQL = "SELECT * FROM テーブル1"

カウント前に
SQL2 = SQL & " WHERE [フィールド名] Like 'KOMOREBI%';"
RowSourceの代入時前は
SQL2 = SQL & " WHERE [フィールド名] Like 'KOMOREBI*';"
にしてみるとか...

【3741】Re:あいまい条件を含んだレコード数のカウ...
発言  YU-TANG WEB  - 04/10/20(水) 14:54 -

引用なし
パスワード
   こんにちは、YU-TANG です。

> ただ、今回の場合はADO内での「% での SQL」でレコードカウントは
> できているが、そのSQLをそのままリストボックスの値集合ソースに
> 入れるとリストボックスに現れないということではないでしょうか?

あ、読み落としていたようです。失礼。
最初の質問時に「% での SQL」でレコードカウントが出なかったのは、
単に「*」が混在していたから、ということですね。
では、まったく仕様通りに正常動作していただけ、ということで。

ゴミレス御免。

【3742】Re:あいまい条件を含んだレコード数のカウ...
お礼  こもれび  - 04/10/20(水) 15:11 -

引用なし
パスワード
   こもれびです

▼クロ さん:
>>% での SQL がなぜ ADO 接続で正しい RecordCount を返さないのか
>
>私も同じくADOは殆ど使いません...
>ただ、今回の場合はADO内での「% での SQL」でレコードカウントはできているが
>そのSQLをそのままリストボックスの値集合ソースに入れるとリストボックスに現
>れないということではないでしょうか?
>
>レコードカウントは「%」を使い、RowSourceの代入時には「*」を使うしかない
>(Gin-IIさん曰く)と私も思います。

いろいろご検討・ご教示ありがとうございます
SQL変数を増やすことも考えましたが、次の方法で表示することとしました。

複数のあいまい条件の結果を返すSQLを一つ作製します。

○ リストボックスへの表示
  1.SQLからRowSource文字列(;区切り)の変数を作る
  2.[リストボックス名].RowSourceType = "Value List"
  3.[リストボックス名].RowSource = RowSource文字列変数

○ レコードカウントの表示
    rs.Open SQL,cnn …
    rs.RecordCount

と、しました。
蛇足になってしまいますが、レコード数を数えさせている理由は
一度リストボックスにレコードを書き込むとレコード数に関わらず
IsNull([リストボックス名])がtrueになってしまい、レコード数
が0の時のみのメッセージ表示のつもりが毎度毎度表示されてしまう
ことの回避です。

ご回答してくださいました皆様、お手数おかけしました ありがとうございました。

【3743】Re:あいまい条件を含んだレコード数のカウ...
質問  YU-TANG WEB  - 04/10/20(水) 16:04 -

引用なし
パスワード
   こんにちは、YU-TANG です。

# なんか寝た子を起こすようで気が引けますが。

> 蛇足になってしまいますが、レコード数を数えさせている理由は
> 一度リストボックスにレコードを書き込むとレコード数に関わらず
> IsNull([リストボックス名])がtrueになってしまい、レコード数
> が0の時のみのメッセージ表示のつもりが毎度毎度表示されてしまう
> ことの回避です。

ここだけ読むと、[リストボックス名].ListCount でレコード数が
取れるので、ADO を使わなくても良さそうな気がするのですが、
何か特殊事情が有るのでしょうか?

【3746】Re:あいまい条件を含んだレコード数のカウ...
お礼  こもれび  - 04/10/21(木) 10:00 -

引用なし
パスワード
   こもれびです

▼YU-TANG さん:

># なんか寝た子を起こすようで気が引けますが。

(-o-)zzz → (*o*;)

ご発言ありがとうございます。

>ここだけ読むと、[リストボックス名].ListCount でレコード数が
>取れるので、ADO を使わなくても良さそうな気がするのですが、
>何か特殊事情が有るのでしょうか?

[リストボックス名].ListCount
改めて使ってみると使えるんですね(|||;)
いや、ListCountそのものは知っておりました。
しかし、リストボックスの初期状態(データが入っていない状態)でListCountを使うと
数字が1になってしまうので、てっきり空の状態では使えないとばかり考えていました。

以前に以下のコードを実行して数字が「1」になってしまい、散々悩まされたもので
トラウマ状態でした。( コードは抜粋です )

Private Sub Form_Open(Cancel As Integer)

  Msgbox [リストボックス名].ListCount

End Sub

リストボックスの「Null状態」と「空の状態」の違いなのでしょうね。
( 判りづらいなぁ… (--;)    )

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

2146 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078299
(SS)C-BOARD v3.8 is Free