< Anterior | Siguiente >

Definición de los criterios de búsqueda

Los criterios de búsqueda de una consulta se definen con filtros de consulta basados en comparaciones con los campos de cada registro en una base de datos de usuario. La consulta devuelve los registros de la base de datos que coincidan con los criterios de búsqueda de un objeto ResultSet.

Cada comparación se implementa con un filtro, que es una instancia del objeto QueryFilterNode. Un filtro le permite comparar un campo con un único valor o con un rango de valores. El operador que escoja para el filtro determina el tipo de comparación a efectuar. Para obtener una lista de operadores válidos, consulte el tipo enumerado constantes de CompOp. Para crear un árbol de filtros jerárquico, únalos con un operador booleano y anide algunos filtros dentro de otros filtros. Cada filtro consta de una única condición o de un grupo de condiciones unidas con un operador AND u OR. A medida que construye los filtros, puede anidar grupos de filtros más complejos para crear un conjunto de lógica de búsqueda complejo.

Al diseñar una consulta, estos son algunos de los objetos utilizados normalmente y sus métodos para trabajar con consultas:
  • Objeto QueryDef:
    • BuildQuery (tipo de registro): para una consulta nueva para un tipo de registro determinado.
    • BuildField (para especificar los campos que se tienen que mostrar).
    • El método BuildFilterOperator requiere una constante enumerada: BoolOpConstant (Y/O).
  • Objeto Session:
    • Método BuildResultSet (marcador de datos capturados de una consulta).
  • Objeto ResultSet:
    • Método BuildResultSet (marcador de datos capturados de una consulta).
    • Método Execute (ejecuta la consulta y captura los datos resultantes).
    • Método MoveNext (mueve el cursor al siguiente registro del conjunto de datos).
    • Método GetColumnLabel (obtiene el texto de la etiqueta del campo), por ejemplo: "Headline", "id", "State"
    • Método GetColumnValue (obtiene datos específicos del campo), por ejemplo: "SAMPL00000014", "This is my headline", "Submitted"
  • Objeto QueryFilterNode:
    • BuildFilter (parámetros de filtro) requiere un operador de comparación (por ejemplo: En, Igual, Menor que, Mayor que, Es nulo) que sea una constante enumerada CompOpConstant (por ejemplo: EQ, NEQ, GT, GTE, LT, LTE) y valores con los que efectuar la comparación (por ejemplo: State EQ Submitted), así como una matriz de series Perl que contenga los valores que se tienen que comparar con los valores del campo especificado.
    • El método BuildFilterOperator requiere una constante enumerada: BoolOpConstant

Al diseñar una consulta, puede utilizar los métodos listados anteriormente de la manera siguiente:

  1. Utilice el método BuildQueryDef para compilar un objeto QueryDef: $QueryDef = $Session->BuildQueryDef(entity-def-name)
  2. Añada campos que se tengan que seleccionar con el método BuildField: $QueryDef->BuildField(field-name)
  3. Compile filtros de consulta como un árbol Y/O. Los nodos Y/O son objetos QueryFilterNode. Utilice el método BuildFilterOperator para construir el nodo superior del árbol: $QueryFilterNode = $QueryDef->BuildFilterOperator(bool)
  4. Añada nodos de comparación Y/O como hijos de un objeto QueryFilterNode con estos métodos: QueryFilterNode = $QueryFilterNode->BuildFilter(field,CompOp,value) y $QueryFilterNode->BuildFilterOperator(bool) Por ejemplo, para filtrar para priority = 1 y (component = gui o 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"]);

Ejemplo

Este ejemplo amplía el ejemplo del tema anterior incluyendo algunos filtros de consulta:

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);
< Anterior | Siguiente >

Comentarios