< Vorherige Lektion | Nächste Lektion >

Suchkriterien definieren

Sie definieren die Suchkriterien einer Abfrage mit Abfragefiltern, die auf Vergleichen mit den Feldern der einzelnen Datensätze in einer Benutzerdatenbank basieren. Die Abfrage gibt jeden Datensatz in der Datenbank zurück, der mit Ihren Suchkriterien in einem ResultSet-Objekt übereinstimmt.

Jeder Vergleich wird durch einen Filter implementiert, der eine Instanz des QueryFilterNode-Objekts ist. Ein Filter ermöglicht Ihnen, ein Feld mit einem Einzelwert oder einem Wertebereich zu vergleichen. Der für den Filter ausgewählte Operator legt fest, welche Art von Vergleich durchgeführt wird. Eine Liste der gültigen Operatoren finden Sie im Abschnitt zu den CompOp-Konstanten (Aufzählungstypen). Zur Erstellung einer hierarchischen Baumstruktur verknüpfen Sie die Filter mit einem booleschen Operator und verschachteln einige Filter innerhalb anderer Filter. Jeder Filter besteht aus einer oder aus mehreren Bedingungen, die mit dem Operator AND oder OR verknüpft werden. Bei der Erstellung von Filtern können Sie komplexere Filtergruppen verschachteln, um eine komplexe Suchlogik zu erhalten.

Die am häufigsten genutzten Objekte und deren Methoden für das Arbeiten mit Abfragen sind folgende:
  • QueryDef-Objekt:
    • Methode "BuildQuery" (Satztyp) - für eine neue Abfrage eines bestimmten Satztyps.
    • Methode "BuildField" (zur Angabe der anzuzeigenden Felder).
    • Methode "BuildFilterOperator" erfordert Aufzählungskonstante - BoolOpConstant (And/Or).
  • Sitzungsobjekt:
    • Methode "BuildResultSet" (Platzhalter für abgerufene Daten in der Abfrage).
  • ResultSet-Objekt:
    • Methode "BuildResultSet" (Platzhalter für abgerufene Daten in der Abfrage).
    • Methode "Execute" (führt Abfrage aus und ruft Ergebnisdaten ab).
    • Methode "MoveNext" (verschiebt den Cursor in den nächsten Datensatz in der Datei).
    • Methode "GetColumnLabel" (ruft den Text der Feldbezeichnung ab), z. B. "Headline", "id", "State".
    • Methode "GetColumnValue" (ruft feldspezifische Daten ab), z. B. "SAMPL00000014", "This is my headline", "Submitted"
  • QueryFilterNode-Objekt:
    • Methode "BuildFilter" (Filterparameter) erfordert einen Vergleichsoperator (wie z. B. In, Equal, Less Than, Greater Than, Is Null), der eine CompOpConstant-Aufzählungskonstante ist (wie z. B. EQ, NEQ, GT, GTE, LT, LTE), und Vergleichswerte (z. B. State EQ Submitted) sowie einen Perl-Zeichenfolgebereich, der die Vergleichswerte für die Werte im angegebenen Feld enthält.
    • Methode "BuildFilterOperator" erfordert eine Aufzählungskonstante - BoolOpConstant

Wenn Sie eine Abfrage entwerfen, können Sie die oben aufgelisteten Methoden wie folgt verwenden:

  1. Verwenden Sie die Methode "BuildQueryDef", um ein QueryDef-Objekt zu erstellen: $QueryDef = $Session->BuildQueryDef(Name_der_Entitätsdefinition)
  2. Fügen Sie Felder hinzu, die mit der Methode "BuildField" ausgewählt werden sollen: $QueryDef->BuildField(Feldname)
  3. Erstellen Sie Abfragefilter als And/Or-Baumstruktur. And/Or-Knoten sind QueryFilterNode-Objekte. Verwenden Sie die Methode BuildFilterOperator, um den obersten Knoten der Baumstruktur zu erstellen: $QueryFilterNode = $QueryDef->BuildFilterOperator(bool)
  4. Fügen Sie And/Or-Vergleichsknoten als untergeordnete Elemente eines QueryFilterNode-Objekts mit den folgenden Methoden hinzu: QueryFilterNode = $QueryFilterNode->BuildFilter(Feld,CompOp,Wert) und $QueryFilterNode->BuildFilterOperator(boolescher_Operator) Gehen Sie beispielsweise wie folgt vor, um einen Filter mit den Angaben "priority = 1" und "component = gui" oder "owner = joe" zu definieren):
    $and_node = $querydef->BuildFilterOperator(And); 
    $and_node->BuildFilter("priority",eq,1); 
    $or_node = $and_node->BuildFilterOperator(Or); 
    # Das dritte Argument der Methode "BuildFilter" muss ein Verweis auf einen Array sein.
    # Hier wird zuerst der Array "@comp" erstellt, dann wird der Verweis
    # "\@comp" in die Methode "BuildFilter" übergeben.
    @comp = ("gui");
    $or_node->BuildFilter("component", $CQPerlExt::CQ_COMP_OP_EQ, \@comp); 
    @name = ("Joe"); 
    $or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, \@name);
    
    # Eine andere Methode, den Array-Verweis für einfache Werte zu übergeben, besteht in der Verwendung anonymer Arrays. Beispiel:
    $or_node->BuildFilter("owner", $CQPerlExt::CQ_COMP_OP_EQ, ["Joe"]);

Beispiel

Im folgenden Beispiel wird das Beispiel aus dem vorherigen Abschnitt durch Abfragefilter erweitert:

use CQPerlExt; 
#Rational-ClearQuest-Sitzung starten
$SessionObj = CQSession::Build(); 

$dbsetname = "CQMS.SAMPL.HOME"; 

#Liste der verfügbaren Datenbanken aktualisieren
$databases = $SessionObj->GetAccessibleDatabases("MASTR", "", $dbsetname); 

#Anmeldung an Datenbank
$SessionObj->UserLogon("admin","","SAMPL",$dbsetname); 

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

# queryfilternode-Objekt erstellen:
# where (Status nicht Closed AND (id = 1 OR id = 2))
$where = $querydef->BuildFilterOperator($CQPerlExt::CQ_BOOL_OP_AND); 

# Alle Filterwerte werden als Verweis auf einen Array übergeben.
@states = ("closed"); 
$where->BuildFilter("state", $CQPerlExt::CQ_COMP_OP_NEQ, \@states); 
# Eine andere Methode, den Array-Verweis für einfache Werte zu übergeben, besteht in der Verwendung anonymer Arrays, wie z. B.
# $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);
< Vorherige Lektion | Nächste Lektion >

Feedback