< Anterior | Próximo >

Definindo os critérios de procura

Você define os critérios de procura de uma consulta com os filtros de consulta que se baseiam em comparações com os campos de cada registro em um banco de dados do usuário. A consulta retorna cada registro no banco de dados, que corresponde aos critérios de procura em um objeto ResultSet.

Cada comparação é implementada por um filtro que é uma instância do objeto QueryFilterNode. Um filtro permite que você compare um campo para com um valor único ou com um intervalo de valores. O operador que você escolher para o filtro determina o tipo de comparação a ser executada. Para obter uma lista dos operadores válidos, consulte o tipo enumerado de constantes CompOp. Para criar uma árvore hierárquica de filtros, junte-os com o operador Booleano e aninhe alguns filtros dentro de outros filtros. Cada filtro consiste em uma única condição ou um grupo de condições juntas com um operador AND ou OR. Conforme você constrói os filtros, você pode aninhar mais grupos complexos de filtros para criar um conjunto complexo de lógica de procura.

Ao projetar uma Consulta, aqui estão alguns dos objetos comumente usados e seus métodos para trabalhar com Consultas:
  • Objeto QueryDef:
    • BuildQuery (tipo de registro) - para uma nova consulta para um tipo de registro determinado.
    • BuildField (para especificar os campos a serem exibidos).
    • O método BuildFilterOperator exige uma Constante Enumerada - BoolOpConstant (And/Or).
  • Objeto de sessão:
    • Método BuildResultSet (marcador de dados localizados em uma consulta).
  • Objeto ResultSet:
    • Método BuildResultSet (marcador de dados localizados em uma consulta).
    • Método Execute (executar a consulta e localizar os dados resultantes).
    • Método MoveNext (move o cursor para o próximo registro no conjunto de dados).
    • Método GetColumnLabel (obtém o texto do rótulo de campo) - por exemplo, "Headline", "id", "State"
    • Método GetColumnValue (obtém dados específicos do campo) - por exemplo, "SAMPL00000014", "This is my headline", "Submitted"
  • Objeto QueryFilterNode:
    • O BuildFilter (parâmetros de filtro) exige uma Operador de comparação (como In, Equal, Less Than, Greater Than, Is Null) que seja uma Constante Enumerada CompOpConstant (como EQ, NEQ, GT, GTE, LT, LTE) e valores para fazer a comparação (por exemplo, State EQ Submitted), mais uma matriz de cadeias de Perl que contenha valores para comparar com valores no campo especificado.
    • O método BuildFilterOperator exige uma Constante Enumerada - BoolOpConstant

Ao projetar uma consulta, você pode usar os métodos listados abaixo da seguinte maneira:

  1. Use o método BuildQueryDef para construir um objeto QueryDef: $QueryDef = $Session->BuildQueryDef(entity-def-name)
  2. Inclua campos para seleção com o método BuildField: $QueryDef->BuildField(field-name)
  3. Construa filtros de consulta como uma árvore And/Or. Nós And/Or são objetos QueryFilterNode. Use o método BuildFilterOperator para construir o nó superior da árvore: $QueryFilterNode = $QueryDef->BuildFilterOperator(bool)
  4. Os nós de comparação Add And/Or são filhos de um objeto QueryFilterNode com estes dois métodos: QueryFilterNode = $QueryFilterNode->BuildFilter(field,CompOp,value) e $QueryFilterNode->BuildFilterOperator(bool) Por exemplo, para filtrar por prioridade = 1 e (componente = gui ou proprietário = 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. Exemplo: $or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, ["Joe"]);

Exemplo

Este exemplo estende o exemplo do tópico anterior pela inclusão de alguns 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 | Próximo >

Feedback