Bereiche festlegen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Datensatzmenge durch Angabe eines Bereichs begrenzen


Zum Definieren eines Bereichs stehen zwei sich gegenseitig ausschließende Verfahren zur Verfügung:

  • Sie legen den Anfang und das Ende einzeln mit SetRangeStart bzw. SetRangeEnd fest.
  • Sie legen beide Endpunkte gleichzeitig mit SetRange fest.

Den Anfang eines Bereichs festlegen

Rufen Sie die Prozedur SetRangeStart auf, um die Datenmenge in den Status dsSetKey zu versetzen und eine Liste mit den Anfangswerten für den Bereich zu erstellen. Nachdem Sie SetRangeStart aufgerufen haben, werden alle nachfolgenden Zuweisungen an die Eigenschaft Fields als Indexwerte für den Bereichsanfang behandelt, wenn sie sich auf den Bereich beziehen. Die angegebenen Felder müssen sich auf den aktuellen Index beziehen.

Beispiel: In einer Anwendung wird eine Komponente vom Typ TSQLClientDataSet verwendet, die Customers heißt und mit der Tabelle CUSTOMER verknüpft ist. Für alle Felder in der Datenmenge Customers wurden persistente Feldkomponenten erstellt. CUSTOMER ist nach der ersten Spalte (CustNo) indiziert. In einem Formular der Anwendung gibt es zwei Eingabefelder, StartVal und EndVal, in die Anfangs- und Endwerte für einen Bereich eingegeben werden können. Der folgende Quelltext erzeugt einen Bereich und verwendet diesen:

with Customers do
begin
  SetRangeStart;
  FieldByName('CustNo').AsString := StartVal.Text;
  SetRangeEnd;
  if (Length(EndVal.Text) > 0) then
    FieldByName('CustNo').AsString := EndVal.Text;
  ApplyRange;
end;
Customers->SetRangeStart();
Customers->FieldValues["CustNo"] = StrToInt(StartVal->Text);
Customers->SetRangeEnd();
if (!EndVal->Text.IsEmpty())
  Customers->FieldValues["CustNo"] = StrToInt(EndVal->Text);
Customers->ApplyRange();

Dieser Quelltext überprüft, ob der in EndVal eingegebene Text ungleich Null ist, bevor er Fields Werte zuweist. Ist der für StartVal eingegebene Text gleich Null, werden alle Datensätze vom Anfang der Datenmenge an berücksichtigt, weil alle Werte größer Null sind. Ist dagegen der für EndVal eingegebene Text gleich Null, werden keine Datensätze berücksichtigt, weil keine Datensätze kleiner Null sind.

Für einen mehrspaltigen Index können Sie einen Anfangswert für alle oder einen Teil der Felder im Index festlegen. Falls Sie für ein Feld im Index keinen Wert bereitstellen, wird dafür beim Anwenden des Bereichs ein Null-Wert eingesetzt. Wenn der Beginn (oder das Ende) des Bereichs nicht angegeben ist, dann wird die untere (oder obere) Grenze der Domäne verwendet. Wenn Sie versuchen, einen Wert für ein Feld festzulegen, das nicht im Index enthalten ist, löst die Datenmenge eine Exception aus.

Tipp: Um mit dem ersten Datensatz der Datenmenge zu beginnen, lassen Sie den Aufruf von SetRangeStart weg.

Um das Festlegen des Bereichsanfangs abzuschließen, rufen Sie SetRangeEnd auf, oder übernehmen den Bereich oder verwerfen ihn.

Das Ende eines Bereichs festlegen

Rufen Sie die Prozedur SetRangeEnd auf, um die Datenmenge in den Status dsSetKey zu versetzen, und ändern Sie die aktuelle Liste der Endwerte für den Bereich. Nachdem Sie SetRangeEnd aufgerufen haben, werden nachfolgende Zuweisungen der Eigenschaft Data.DB.TDataSet.Fields als Indexwerte für das Bereichsende behandelt, wenn der Bereich verwendet wird. Die angegebenen Felder müssen sich auf den aktuellen Index beziehen.

Warnung: Geben Sie immer die Endwerte für einen Bereich an, auch wenn dieser sich bis zum letzten Datensatz in der Datenmenge erstrecken soll. Wenn Sie keine Endwerte festlegen, nimmt Delphi an, der Endwert des Bereichs sei ein Null-Wert. Bereiche mit einem Null-Wert als Endwert sind immer leer.

Am einfachsten weisen Sie Endwerte zu, indem Sie die Methode Data.DB.TDataSet.FieldByName aufrufen. Ein Beispiel:

with Contacts do
begin
  SetRangeStart;
  FieldByName('LastName').AsString := Edit1.Text;
  SetRangeEnd;
  FieldByName('LastName').AsString := Edit2.Text;
  ApplyRange;
end;
Contacts->SetRangeStart();
Contacts->FieldByName("LastName")->Value = Edit1->Text;
Contacts->SetRangeEnd();
Contacts->FieldByName("LastName")->Value = Edit2->Text;
Contacts->ApplyRange();

Wie beim Festlegen der Anfangswerte für einen Bereich gilt auch hier, dass die Datenmenge eine Exception auslöst, wenn Sie versuchen, einen Wert für ein Feld festzulegen, das nicht im Index enthalten ist.

Um das Festlegen des Bereichsendes abzuschließen, übernehmen oder verwerfen Sie den Bereich.

Werte für den Bereichsanfang und das Bereichsende festlegen

Statt SetRangeStart und SetRangeEnd einzeln aufzurufen, um Bereichsgrenzen festzulegen, können Sie mit der Prozedur SetRange die Datenmenge in den Status dsSetKey versetzen und die Werte für Bereichsanfang und –ende innerhalb eines einzigen Aufrufs festlegen.

SetRange nimmt zwei Array-Konstanten als Parameter entgegen: eine Liste mit Anfangswerten und eine Liste mit Endwerten. Die folgenden Anweisungen richten beispielsweise einen Bereich abhängig von einem zweispaltigen Index ein:

SetRange([Edit1.Text, Edit2.Text], [Edit3.Text, Edit4.Text]);
TVarRec StartVals[2];
TVarRec EndVals[2];
StartVals[0] = Edit1->Text;
StartVals[1] = Edit2->Text;
EndVals[0] = Edit3->Text;
EndVals[1] = Edit4->Text;
Table1->SetRange(StartVals, 1, EndVals, 1);

Für einen mehrspaltigen Index können Sie Anfangs- und Endwerte für alle oder einen Teil der im Index enthaltenen Felder angeben. Falls Sie für ein Feld im Index keinen Wert bereitstellen, wird dafür beim Anwenden des Bereichs ein Null-Wert eingesetzt. Um für das erste Feld in einem Index einen Wert wegzulassen und Werte für nachfolgende Felder anzugeben, übergeben Sie einen Null-Wert für das betreffende Feld.

Geben Sie immer die Endwerte für einen Bereich an, auch wenn dieser sich bis zum letzten Datensatz in der Datenmenge erstrecken soll. Wenn Sie keine Endwerte festlegen, nimmt die Datenmenge an, der Endwert des Bereichs sei ein Null-Wert. Ein Bereich mit einem Null-Wert als Endwert ist immer leer, weil der Anfangswert des Bereichs größer oder gleich dem Endwert des Bereichs ist.

Einen Bereich abhängig von Teilschlüsseln festlegen

Bei Schlüsseln, die sich aus mehreren String-Feldern zusammensetzen, unterstützen die SetRange-Methoden Teilschlüssel. Basiert ein Index beispielsweise auf den Spalten LastName und FirstName, sind die folgenden Bereichsangaben zulässig:

Contacts.SetRangeStart;
Contacts['LastName'] := 'Smith';
Contacts.SetRangeEnd;
Contacts['LastName'] := 'Zzzzzz';
Contacts.ApplyRange;
Contacts->SetRangeStart();
Contacts->FieldValues["LastName"] = "Smith";
Contacts->SetRangeEnd();
Contacts->FieldValues["LastName"] = "Zzzzzz";
Contacts->ApplyRange();

Mit diesem Quelltext werden alle Datensätze in den Bereich aufgenommen, deren Wert im Feld LastName größer oder gleich "Smith" ist. Die Wertangabe könnte auch wie folgt aussehen:

Contacts['LastName'] := 'Sm';
Contacts->FieldValues["LastName"] = "Sm";

Mit dieser Anweisung werden alle Datensätze in den Bereich aufgenommen, deren Wert im Feld LastName größer oder gleich "Sm" ist.

Datensätze ein- oder ausschließen, die mit Bereichsgrenzen übereinstimmen

Standardmäßig umfasst ein Bereich alle Datensätze, die größer oder gleich dem angegebenen Anfangswert und kleiner oder gleich dem angegebenen Endwert sind. Dieses Verhalten wird durch die Eigenschaft KeyExclusive gesteuert. KeyExclusive ist standardmäßig False.

Gegebenenfalls können Sie die Eigenschaft KeyExclusive für eine Client-Datenmenge auf True setzen, um Datensätze auszuschließen, die mit dem Bereichsende übereinstimmen. Ein Beispiel:

Contacts.KeyExclusive := True;
Contacts.SetRangeStart;
Contacts['LastName'] := 'Smith';
Contacts.SetRangeEnd;
Contacts['LastName'] := 'Tyler';
Contacts.ApplyRange;
Contacts->SetRangeStart();
Contacts->KeyExclusive = true;
Contacts->FieldValues["LastName"] = "Smith";
Contacts->SetRangeEnd();
Contacts->FieldValues["LastName"] = "Tyler";
Contacts->ApplyRange();

Dieser Code berücksichtigt alle Datensätze innerhalb eines Bereichs, deren Wert im Feld LastName größer oder gleich "Smith" und kleiner "Tyler" ist.

Siehe auch