PRB: エラー 3001 比較フィールドとしてレコード セットをフィルター処理するための基準

文書翻訳 文書翻訳
文書番号: 216873
すべて展開する | すべて折りたたむ

現象

条件文字列は、ADO の Filter プロパティの 2 つのフィールドを比較する (例: フォームの句の抽出条件の文字列で構成されています:「フィールド名""フィールド名"演算子"」)、次のエラーが生成されます。
実行時エラー '3001':
アプリケーションが間違った型、許容範囲外、または互いと競合している引数を使用しています。

原因

この機能は、現在のバージョンの ADO で行うことはできません。条件の構文は、ADO の Filter プロパティを次のように定義されます。
"FieldName Operator 'Literal_Value'"
'Literal_Value' のデータ型、文字列、数値、または日付可能性があります。2 つのフィールドを比較するのには、上記の式を使用できません。これを行うにしようとしてエラー 3001 になります。

解決方法

1 つの回避策はいくつかの式をフィルター条件としてのブール型の演算子が結合することです。このような場合のみ使用できますが、開発者に、比較対象のフィールドの値がわかっています。このように、開発者に数式結果を満たす抽出条件文字列を思いついた。たとえば。
rs.Filter = "Field1 Operator1 'Value1' AND Field2 Operator2 'Value2'"
				

開発者は、値が Field1 および Field2 に把握していない場合は、開発者 (クライアント アプリケーション) 内のカスタム フィルター ルーチンをまたは (サーバー側) がストアド プロシージャのいずれかを使用して、動的な機能を実行する必要があります。必要なフィールドの比較を実行し、期待どおりの結果を生成するのには、カスタム フィルター ルーチン (またはストアド プロシージャ) 内の制御フロー ステートメントを使用できます。

この資料の「関連情報」セクションのこのようなルーチンをデモンストレーションを掲載しています。

警告: 詳細記載の回避策はのみ図目的のために限らずは、明示または黙示を問わず一切の保証なく、市場性および特定目的への適合性の黙示的な保証与えられます。

状況

Microsoft では、これ問題をこの資料の冒頭に記載したマイクロソフト製品の問題として認識しています。

詳細

ADO のヘルプ ドキュメントは、次の「備考」の-フィルター メソッドの抽出条件の式記載されています。

抽出条件文字列句が"フィールド名"の形式で演算子と値で構成 (たとえば、"LastName = 'Smith'")。個々 の句を連結することによって、複合句を作成できますと (など"LastName = 'Smith' 姓 'John' =") または OR (など"LastName = 'Smith' OR LastName = 'Jones' =")。

抽出条件の値を次のガイドラインを確認するも。

指定すると、フィールドの値を比較する値 (たとえば、'Smith' # 8/24/95 番、12.345、または $50.00)。文字列と日付をシャープ記号 (#) は、単一引用符を使用します。数字は、小数点、ドル記号、および指数表記を使用できます。値はワイルドカードを使用するように、演算子がある場合。アスタリスク (*) とパーセント記号 (%) ワイルドカード指定でき、文字列の最後の文字にする必要があります。値は Null にできません。
現象の再現手順
===========================

  1. Microsoft Visual Basic の新しいプロジェクトを開始します。デフォルトで Form1 が作成されます。
  2. Microsoft ActiveX のデータ ・ オブジェクトの 2.x へのプロジェクト参照を設定します。ライブラリです。
  3. フォーム上のコマンド ボタンを挿入します。デフォルトで、Command1 が作成されます。
  4. 次のコードを Form1 の全般宣言のセクションに挿入します。
   Option Explicit
   Dim cn As New ADODB.Connection
   Dim rs As New ADODB.Recordset

   Private Sub Command1_Click()
       cn.Open "provider=SQLOLEDB;Data Source=<your data source>;User ID=<uid>;" _ 
    "password=;Initial Catalog=pubs;"
       On Error Resume Next
       cn.Execute "drop table tblFilterTest"
       On Error GoTo errh
       ' Create the test table
       cn.Execute "create table tblFilterTest(ID int primary key, Field1  
    varchar(20), Field2 varchar(20))"
       ' Open ADO recordset
       rs.Open "select * from tblFilterTest", cn, adOpenKeyset, 
    adLockOptimistic
       ' Add first record
       rs.AddNew
       rs("ID") = 1
       rs("Field1") = "A"
       rs("Field2") = "B"
       rs.Update
       rs.Requery
   
       ' Add 2nd record
       rs.AddNew
       rs("ID") = 2
       rs("Field1") = "D"
       rs("Field2") = "C"
       rs.Update
       rs.Requery
    
       ' Print original recordset
       Debug.Print "Original Recordset:"
       Debug.Print "====================="

       While Not rs.EOF
            Debug.Print rs("Field1") & vbTab & rs("Field2") 
             rs.MoveNext
       Wend

       rs.MoveFirst

       ' You get error 3001 on the following line
       rs.Filter = " Field1 > Field2 "

       ' To demonstrate the workaround, comment the preceding line and
       ' uncomment the following line:

       ' Call Filter
       Exit Sub

   errh:
       Debug.Print "Error Number:", Err.Number
       Debug.Print "Error Source:", Err.Source
       Debug.Print "Error Description:", Err.Description
   End Sub

   Private Sub Filter()
       Debug.Print "Filtered Recordset: "
       Debug.Print "====================="
    
       While Not rs.EOF
         If rs("Field1") > rs("Field2") Then
             Debug.Print rs("Field1") & vbTab & rs("Field2") 
         End If
         rs.MoveNext
       Wend
   End Sub
				
プロジェクトとエラー 3001 実行する f5 キーを押してに発生します。

関連情報

詳細については、ADO のヘルプ ドキュメントを参照してください。
関連情報については、マイクロソフト サポート技術、次の資料を参照してください。
195222 PRB: ADO の Find メソッドのみサポートしている 1 つの条件

プロパティ

文書番号: 216873 - 最終更新日: 2011年7月21日 - リビジョン: 3.0
キーワード:?
kbfix kbdatabase kbprb kbcode kbmt KB216873 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:216873
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com