< Précédent | Suivant >

Définition des critères de recherche

Définissez les critères de recherche d'une requête avec les filtres de requête basés sur la comparaison des zones de chaque enregistrement d'une base de données utilisateur. La requête renvoie chaque enregistrement de la base de données correspondant à vos critères de recherche dans un objet ResultSet.

Chaque comparaison est mise en oeuvre par un filtre qui est une instance de l'objet QueryFilterNode. Un filtre vous permet de comparer une zone à une valeur unique ou à une fourchette de valeurs. L'opérateur que vous indiquez pour le filtre détermine le type de comparaison à effectuer. Pour obtenir la liste des opérateurs valides, voir le type énumératif des constantes CompOp. Pour créer une arborescence hiérarchique de filtres, associez ces derniers à l'aide d'un opérateur booléen et imbriquez certains filtres dans d'autres filtres. Chaque filtre est constitué d'une condition unique ou d'un groupe de conditions associées par un opérateur AND ou OR. Lorsque vous générez les filtres, vous pouvez imbriquer des groupes de filtres plus complexes afin de créer un ensemble complexe de logique de recherche.

Lors de l'exécution d'une requête, les objets, et leurs méthodes permettant de gérer les requêtes, suivants sont fréquemment utilisés :
  • Objet QueryDef :
    • BuildQuery (type d'enregistrement) - pour une nouvelle requête pour un type d'enregistrement donné.
    • BuildField (pour spécifier les zones à afficher).
    • La méthode BuildFilterOperator requiert une constante énumérative - BoolOpConstant (And/Or).
  • Objet Session :
    • Méthode BuildResultSet (paramètre fictif des données extraites de la requête).
  • Objet ResultSet :
    • Méthode BuildResultSet (paramètre fictif des données extraites de la requête).
    • Méthode Execute (exécute la requête et extrait les données récupérées).
    • Méthode MoveNext (déplace le curseur vers l'enregistrement suivant de l'ensemble de données).
    • Méthode GetColumnLabel (obtient le libellé de la zone) - par exemple, "Headline", "id", "State"
    • Méthode GetColumnValue (obtient les données spécifiques de la zone) - par exemple, "SAMPL00000014", "This is my headline", "Submitted"
  • Objet QueryFilterNode :
    • BuildFilter (paramètres de filtres) requiert un opérateur de comparaison (tel que In, Equal, Less Than, Greater Than, Is Null) étant une constante énumérative CompOpConstant (telle que EQ, NEQ, GT, GTE, LT, LTE) et les valeurs utiles pour la comparaison (par exemple, State EQ Submitted), ainsi qu'un tableau de chaînes Perl contenant les valeurs à comparer avec les valeurs de la zone spécifiée.
    • La méthode BuildFilterOperator requiert une constante énumérative - BoolOpConstant

Lorsque vous exécutez une requête, vous pouvez utiliser les méthodes répertoriées ci-dessus, en suivant la procédure suivante :

  1. Utilisez la méthode BuildQueryDef pour créer un objet QueryDef : $QueryDef = $Session->BuildQueryDef(nom_déf_entité)
  2. Ajoutez les zones à sélectionner avec la méthode BuildField : $QueryDef->BuildField(nom-zone)
  3. Générez des filtres de requête dans une arborescence And/Or. Les noeuds And/Or sont des objets QueryFilterNode. Utilisez la méthode BuildFilterOperator pour créer le noeud supérieur de l'arborescence : $QueryFilterNode = $QueryDef->BuildFilterOperator(bool)
  4. Ajoutez des noeuds de comparaison And/Or comme enfants d'un objet QueryFilterNode avec les méthodes suivantes : QueryFilterNode = $QueryFilterNode->BuildFilter(zone,CompOp,valeur) et $QueryFilterNode->BuildFilterOperator(bool) Par exemple, pour filter for priority = 1 et (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"]);

Exemple

Cet exemple complète l'exemple de la rubrique précédente en ajoutant des filtres de requête :

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);
< Précédent | Suivant >

Commentaire