< 前へ | 次へ >

検索条件の定義

クエリーの検索条件を定義するには、ユーザー データベース内の各レコードの フィールドとの比較に基づいたクエリー フィルタを使用します。クエリーは、 データベース中のレコードのうち、検索条件に一致する各レコード を ResultSet オブジェクトに格納して戻します。

比較操作は、それぞれフィルタによって実装されます。これは、QueryFilterNode オブジェクトのインスタンスです。フィルタによって、フィールドを、単数値またはある範囲の値と比較できます。フィルタで選択した演算子により実行する比較のタイプが決まります。有効な演算子のリストについては、CompOp 定数の列挙型を参照してください。フィルタの階層ツリーを作成するには、ブール演算子でフィルタを結合し、一部のフィルタをほかのフィルタ内にネストさせます。各フィルタは単一の条件か、AND または OR 演算子を使用して結合された条件グループで構成されます。フィルタのビルド時には、より複雑なフィルタのグループをネストさせて、検索ロジックの複合セットを作成できます。

クエリーを設計するときに一般的に使用される オブジェクトと、クエリーに関する作業を行うためのメソッドは、次のとおりです。
  • QueryDef オブジェクト:
    • BuildQuery (レコード タイプ) - 指定したレコード タイプ用の新規クエリー。
    • BuildField (表示されるフィールドの指定)。
    • BuildFilterOperator メソッドには、列挙型定数 - BoolOpConstant (And/Or) が必要です。
  • Session オブジェクト:
    • BuildResultSet メソッド (クエリーから取り出されたデータのプレースホルダー)。
  • ResultSet オブジェクト:
    • BuildResultSet メソッド (クエリーから取り出されたデータのプレースホルダー)。
    • Execute メソッド (クエリーを実行し、結果データを取り出す)。
    • MoveNext メソッド (カーソルをデータ セット内の次のレコードに移動させる)。
    • GetColumnLabel メソッド (フィールド ラベル テキストを取得する)。例えば、「Headline」、 「id」、「State」
    • GetColumnValue メソッド (フィールド固有のデータを取得する)。例えば、「SAMPL00000014」、 「This is my headline」、「Submitted」
  • QueryFilterNode オブジェクト:
    • BuildFilter (フィルタ パラメータ) には、CompOpConstant 列挙定数 (EQ、NEQ、GT、GTE、LT、LTE など) で表される比較演算子 (In、Equal、Less Than、Greater Than、Is Null など) と比較対象の値 (例えば、State EQ Submitted)、さらに、指定されたフィールド内の値と比較する値が 入っている Perl ストリング配列が必要です。
    • BuildFilterOperator メソッドには列挙型定数 BoolOpConstant が必要です。

クエリーの設計時、上記のメソッドを 次のように使用できます。

  1. BuildQueryDef メソッドを使用して、QueryDef オブジェクトを作成します: $QueryDef = $Session->BuildQueryDef(entity-def-name)
  2. BuildField メソッドを使用して、選択されるフィールドを追加します: $QueryDef->BuildField(field-name)
  3. And/Or ツリーとして一連のクエリー フィルタをビルドします。And/Or ノードは QueryFilterNode オブジェクト です。BuildFilterOperator メソッドを使用して、ツリーの 最上部ノードを作成します: $QueryFilterNode = $QueryDef->BuildFilterOperator(bool)
  4. 次のメソッドを使用して、And/Or 比較ノードを QueryFilterNode オブジェクトの 子として追加します: QueryFilterNode = $QueryFilterNode->BuildFilter(field,CompOp,value)$QueryFilterNode->BuildFilterOperator(bool) 例えば、priority = 1 and (component = gui or owner = joe) をフィルタリングするには、次のようにします。
    $and_node = $querydef->BuildFilterOperator(And); 
    $and_node->BuildFilter("priority",eq,1); 
    $or_node = $and_node->BuildFilterOperator(Or); 
    # The third argument of the BuildFilter method must be a reference to an array:
    # Here we first build the array @comp, then pass 
    # the reference \@comp into the BuildFilter method.
    @comp = ("gui");
    $or_node->BuildFilter("component", $CQPerlExt::CQ_COMP_OP_EQ, \@comp); 
    @name = ("Joe"); 
    $or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, \@name);
    
    # Another way to pass the array reference for simple values is using anonymous arrays. For example:
    $or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, ["Joe"]);

次の例は、いくつかのクエリー フィルタを組み込んで、 前のトピックの例を拡張したものです。

use CQPerlExt; 
#Start a Rational ClearQuest session 
$SessionObj = CQSession::Build(); 

$dbsetname = "CQMS.SAMPL.HOME"; 

#Refresh list of accessible databases 
$databases = $SessionObj->GetAccessibleDatabases("MASTR", "", $dbsetname); 

#Log into a database 
$SessionObj->UserLogon("admin","","SAMPL",$dbsetname); 

#Create a Query 
$querydef = $SessionObj->BuildQuery("defect"); 
$querydef->BuildField("id"); 
$querydef->BuildField("headline"); 
$querydef->BuildField("owner.login_name"); 
$querydef->BuildField("submit_date"); 

#Create the queryfilternode object: 
# where (state is not Closed AND (id = 1 OR id = 2)) 
$where = $querydef->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_AND); 

# All filter values passed in as a reference to an array.
@states = ("closed"); 
$where->BuildFilter("state", $CQPerlExt::CQ_COMP_OP_NEQ, ¥@states);
# Another way to pass the array reference for simple values is using an anonymous array, like this:
# $where->BuildFilter("state", $CQPerlExt::CQ_COMP_OP_EQ, ["closed"]);

$subor = $where->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_OR); 

@id1 = ("SAMPL00000001"); 
$subor->BuildFilter("id", $CQPerlExt::CQ_COMP_OP_EQ, ¥@id1);

@id2 = ("SAMPL00000002"); 
$subor->BuildFilter("id", $CQPerlExt::CQ_COMP_OP_EQ, ¥@id2);

$resultset = $SessionObj->BuildResultSet($querydef); 

$ct = $resultset->ExecuteAndCountRecords(); 
for ($i = 0; $i < $ct; $i++) { 
   $resultset->MoveNext(); 
   print $resultset->GetColumnValue(1); 
   print " "; 
   print $resultset->GetColumnValue(2); 
   print " "; 
   print $resultset->GetColumnValue(3); 
   print " "; 
   print $resultset->GetColumnValue(4); 
   print "¥n";
   } 
CQSession::Unbuild($SessionObj);

フィードバック
< 前へ | 次へ >