[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/05/30(Tue) 10:13
投稿者名:インテグラ
Eメール:
URL :
タイトル:
Accessレコードの抽出処理
初投稿失礼いたします。
プログラマ暦半年のヒヨッコです。
私の全力をかけて改善方法を模索してみましたが
一向に解決方法が見つからないので、どうかご教授願います。

 環境
 ・OS WindowsXP
 ・VB6.0
 ・Access2003

Access2003の"REC001"という名簿の中から条件に一致した
フィールドを取り出し印刷をしたいのですが、うまく抽出できません。
以下のようなコードになります。


Private Sub Form_Load()
    Dim Conn        As New ADODB.Connection
    Dim RS          As New ADODB.Recordset

    Conn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;DATA source=D:\abc.mdb"
    Conn.Open
    
    sql = "SELECT * FROM REC001 ORDER BY KA01, KA02, KA03"
    RS.CursorLocation = adUseClient
    RS.Open sql, Conn, adOpenDynamic, adLockPessimistic

    RS.Filter = " KA01 Not Like '○○*' "  '@
    RS.Filter = " KA01 Like '*○○' "  'A
Debug.Print RS.RecordCount
'    〜〜〜印刷処理〜〜〜
    RS.Close
    Conn.Close
End Sub


@の所でエラー
 「実行時エラー'3001':
  引数が間違った型、許容範囲外、または競合しています」
がでてしまいます。
先頭が「○○」以外のデータを抽出したいのですがなんともうまくいかない状況です。
実際のコードでは@の上にも処理が入るのでOpen時のSQLとは別で抽出したいと思っております。

また、Aでは最後が「○○」で終わるデータを抽出したいのですが
これも上記エラーメッセージが発生し抽出できません。
MSDNではFilterプロパティのワイルドカードは
「○○*」もしくは「*○○*」という使い方しかできない。
と表記されていますが、他にいい抽出の仕方はないでしょうか?

稚拙な文章で大変読みにくいとは思いますが、どうか救いの手を差し伸べてください。。

投稿時間:2006/05/30(Tue) 12:18
投稿者名:KG
Eメール:
URL :
タイトル:
Re: Accessレコードの抽出処理
こんにちは、インテグラさん

>     RS.Filter = " KA01 Not Like '○○*' "  '(1)
>     RS.Filter = " KA01 Like '*○○' "  '(2)
この部分をSQLのWhere句の中にいれてしまって、
(1)の場合と(2)の場合とで2回処理するわけにはいかないのでしょうか?

投稿時間:2006/05/30(Tue) 14:08
投稿者名:インテグラ
Eメール:
URL :
タイトル:
Re^2: Accessレコードの抽出処理
KGさん、こんにちは
早速のレスありがとうございました。

Open時のSQLにWhere句で抽出という処理も考えたのですが
実際のコードでは(1)とOpenの間で行わなければならない処理もあり。
なんとかFilterプロパティで抽出できないか苦心していた次第です。

投稿時間:2006/05/30(Tue) 14:44
投稿者名:かずちん
Eメール:
URL :
タイトル:
Re: Accessレコードの抽出処理
こんにちは、インテグラさん

> また、Aでは最後が「○○」で終わるデータを抽出したいのですが
> これも上記エラーメッセージが発生し抽出できません。
> MSDNではFilterプロパティのワイルドカードは
> 「○○*」もしくは「*○○*」という使い方しかできない。
> と表記されていますが、他にいい抽出の仕方はないでしょうか?

ワイルドカードは「%○○%」「○○%」も使用可能です。
エラーとなるのは「%○○」「*○○」のような後方一致検索です。

投稿時間:2006/05/30(Tue) 21:12
投稿者名:インテグラ
Eメール:
URL :
タイトル:
Re^2: Accessレコードの抽出処理
こんにちは、かずちんさん
レスありがとうございます

> エラーとなるのは「%○○」「*○○」のような後方一致検索です。

そうですか・・
やはり、Filterプロパティを使って後方一致条件での抽出は無理なんですね。
となるとSQLしかないんでしょうかねぇ・・・

投稿時間:2006/05/30(Tue) 16:47
投稿者名:りん
Eメール:
URL :
タイトル:
Re: Accessレコードの抽出処理
>     RS.Filter = " KA01 Not Like '○○*' "  '@
>     RS.Filter = " KA01 Like '*○○' "  'A

単純に
  RS.Filter = " Left(KA01,2) <> '○○' "
  RS.Filter = " right(KA01,2) ='○○' "

では駄目ですか?

投稿時間:2006/05/30(Tue) 21:17
投稿者名:インテグラ
Eメール:
URL :
タイトル:
Re^2: Accessレコードの抽出処理
こんにちは、りんさん
レスありがとうございます。

Left,Right の使用は出来ないようです。
「""」の中になるので「Left,Right」も文字列として認識されてしまうようです。

投稿時間:2006/06/27(Tue) 01:28
投稿者名:ちゃんこ
Eメール:
URL :
タイトル:
Re: Accessレコードの抽出処理
はじめまして。
お役にたてるかどうかわかりませんが
一つの方法を提案します。

一度、SQLの結果を構造体にセットし

印刷処理の所は構造体をループで回し
if文で条件を入れる方法はどうでしょう?
if Right(文字列,2)<>"○○" then
等で簡単に回避出きると思います。

処理時間が気になる場合はお勧めできませんが・・・


> 初投稿失礼いたします。
> プログラマ暦半年のヒヨッコです。
> 私の全力をかけて改善方法を模索してみましたが
> 一向に解決方法が見つからないので、どうかご教授願います。
>
>  環境
>  ・OS WindowsXP
>  ・VB6.0
>  ・Access2003
>
> Access2003の"REC001"という名簿の中から条件に一致した
> フィールドを取り出し印刷をしたいのですが、うまく抽出できません。
> 以下のようなコードになります。
>
>
> Private Sub Form_Load()
>     Dim Conn        As New ADODB.Connection
>     Dim RS          As New ADODB.Recordset
>
>     Conn.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;DATA source=D:\abc.md
b"
>     Conn.Open
>    
>     sql = "SELECT * FROM REC001 ORDER BY KA01, KA02, KA03"
>     RS.CursorLocation = adUseClient
>     RS.Open sql, Conn, adOpenDynamic, adLockPessimistic
>
>     RS.Filter = " KA01 Not Like '○○*' "  '@
>     RS.Filter = " KA01 Like '*○○' "  'A
> Debug.Print RS.RecordCount
> '    〜〜〜印刷処理〜〜〜
>     RS.Close
>     Conn.Close
> End Sub
>
>
> @の所でエラー
>  「実行時エラー'3001':
>   引数が間違った型、許容範囲外、または競合しています」
> がでてしまいます。
> 先頭が「○○」以外のデータを抽出したいのですがなんともうまくいかない状況です。
> 実際のコードでは@の上にも処理が入るのでOpen時のSQLとは別で抽出したいと思っております。
>
> また、Aでは最後が「○○」で終わるデータを抽出したいのですが
> これも上記エラーメッセージが発生し抽出できません。
> MSDNではFilterプロパティのワイルドカードは
> 「○○*」もしくは「*○○*」という使い方しかできない。
> と表記されていますが、他にいい抽出の仕方はないでしょうか?
>
> 稚拙な文章で大変読みにくいとは思いますが、どうか救いの手を差し伸べてください。。