Zum Hauptinhalt springen

Selektionen

Selektionen Teilmengen von Datensätzen und deren Verarbeitung

Eine Selektionmenge ist eine Teilmenge von Datensätzen aus einer oder mehreren Dateien. In einer Selektion werden Datensätze auf bestimmte Bedingungen überprüft und gültige Sätze in das Selektionsresultat aufgenommen. Das Resultat einer Selektion enthält Verweise auf bestehende Datensätze, d. h. die Sätze in einer Selektion sind nicht redundant gespeichert. Eine Selektion kann mehrere Ergebnismengen beinhalten, die Verweise auf Sätze verschiedener Dateien enthalten. Die Hauptergebnismenge (Datei, in der die Selektion definiert ist) lässt sich beliebig sortieren. Weitere Ergebnismengen enthalten Verweise auf Daten verknüpfter Dateien und sind nach den entsprechenden Verknüpfungsschlüsseln sortiert.

Zunächst können in einer Selektion die Felder der Datei auf verschiedenste Kriterien hin abgefragt werden. Desweiteren existieren Abfragen auf verknüpfte Datensätze und deren Felder. Möglich sind ebenfalls Berechnungen in der Abfrage, sowie die Einbindung von Prozeduren. Nach der Definition einer Selektion wird diese in Zwischencode (P-Code) übersetzt und kann anschließend durchgeführt werden, wobei die jeweilige Selektionsmenge ermittelt wird. Bei der Durchführung werden automatisch Optimierungen (z. B. die Benutzung von Schlüsseln) benutzt, um die Verarbeitungszeit zu reduzieren (siehe auch Selektionen optimieren ).

Auf die Selektionsmenge lässt sich über bestimmte Oberflächen-Objekte und mit Datensatz-Operationen zugreifen. Die Menge kann auch als Grundlage für weitere Selektionen dienen und mit anderen Mengen kombiniert werden.

Eine Selektion kann immer dann verwendet werden, wenn bestimmte Operationen nur auf eine Teilmenge der Datensätze erfolgen sollen.

Dieses Kapitel gliedert sich in folgende Abschnitte:

Verwendung von Selektionen

Neben den Selektionen kann noch mit Hilfe von Verknüpfungen oder Filtern die Menge der Datensätze eingeschränkt werden. Selektionen sollten verwendet werden, wenn die Treffermenge gering ausfällt und keine Verknüpfung verwendet werden kann.

Bedingungen->Objekt
Alle einschränkenden Felder befinden sich in einem Schlüssel. Es wird nur auf einen Schlüsselwert eingeschränkt.->Verknüpfung
Alle einschränkenden Felder befinden sich in einem Schlüssel. Es gibt mehrere gültige Schlüsselwerte (zum Beispiel einen Bereich). Die Bediengungen müssen nicht geklammert werden.->Filter
-->Selektion

Umfasst das Selektionskriterium genau einen Wert (zum Beispiel: "Suche alle Ansprechpartner deren Kundennummer gleich 1000 ist") und das entsprechende Feld wird in einem Schlüssel verwendet, sollte eine Verknüpfung verwendet werden. Die Datensätze der Verknüpfung stehen sofort zur Verfügung und es muss keine Selektion angelegt oder durchgeführt werden.

Wird nicht nur ein Wert, sondern ein Wertebereich gesucht, kann die Verknüpfung nicht verwendet werden. Befindet sich der Wert in einem Schlüsselfeld, kann statt dessen über einen Filter zugegriffen werden. Befindet sich in der Datenmenge nur ein geringer Anteil an Datensätzen, die das Kriterium erfüllen, kann der Zugriff über einen Filter langsam erscheinen, da alle Datensätze zwischen den Treffern ebenfalls gelesen werden.

Besteht das Selektionskriterium aus mehreren Bedingungen, die einen Wertebereich abfragen und mit unterschiedlichen logischen Operatoren verknüpft sind (UND, ODER, NICHT, ...), muss eine Selektion verwendet werden. Die Verknüpfung kann keinen Wertebereich abfragen und der Filter kann Ausdrücke nicht klammern.

Definition von Selektionen

Eine Selektion kann mit Hilfe von Befehlen zur Laufzeit des Programms erstellt werden. Eine Liste der Befehle befindet sich im Abschnitt Befehle für dynamische Selektionen . Die Definition der Selektion erfolgt zunächst in einem Selection -Objekt. Dieses Objekt wird mit der Anweisung SelCreate () angelegt.

Im einfachsten Fall werden beim Anlegen des Objekts eine Datei und ein Schlüssel zur Sortierung der Datensätze angegeben. Anschließend kann mit der Anweisung SelDefQuery () die Bedingung angegeben werden. Die Bedingung ist ein logischer Ausdruck, d. h. ein Ausdruck mit einem Ergebnis von true oder false. Zur Definition dieser Ausdrücke siehe Logische Ausdrücke in dynamischen Selektionen .

Die Sortierung der Datensätze muss nicht über einen Schlüssel erfolgen. Wird beim Anlegen des Objekts kein Schlüssel angegeben, kann später bei der Durchführung der Selektion ein beliebiges Feld zur Sortierung verwendet werden (siehe auch _SelKeyMode).

Ist die Definition abgeschlossen, wird die Selektion in der Datenbank gespeichert (siehe SelStore ()). Ab diesem Zeitpunkt steht die Selektion zur Durchführung zur Verfügung. Die Selektionsmenge (die Datensätze, die die Bedingung erfüllen) ist zu diesem Zeitpunkt noch leer. Die Überprüfung der Datensätze, ob sie die Bedingung erfüllen, findet erst bei der Durchführung der Selektion statt.

Beispiel:

In der folgenden Prozedur wird ein Selection -Objekt angelegt und als Selektion in der Datenbank gespeichert. Die Selektion wird mit dem angegebenen Namen in der Datenbank gespeichert. Der Name darf höchstens 20 Zeichen lang sein. Die Selektionsmenge enthält keine Datensätze, da die Selektion noch nicht durchgeführt wurde.

main

local
{
tSel : handle;
tErr : int;
}
{
tSel # SelCreate(tblArtArticle, keyArtNumber);
tErr # tSel->SelDefQuery('', 'ffArtPrice > 10.0');
tErr # tSel->SelStore('TMP.Articleprice', _SelUnlock);
tSel->SelClose();
}

Bei der Definition und der Speicherung einer Selektion muss der zurückgegebene Fehlerwert ausgewertet werden. In dem Beispiel wurde das aus Gründen der Übersichtlichkeit weggelassen.

Die Zeichenkette des Selektionskriteriums ('ffArtPrice > 10.0') wurde in diesem Fall statisch angegeben. Sie kann auch aus Angaben des Benutzers zusammengesetzt werden:

  ...
tErr # tSel->SelDefQuery('', tFieldName + ' > ' + CnvAF(tPriceValue));
...

Soll die Selektion sofort weiter verwendet werden, kann sie beim Speichern gleich gesperrt werden. Das Selection -Objekt muss ebenfalls nicht geschlossen werden. Statt dessen wird das Objekt in einen Selektionsdeskriptor umgewandelt:

  ...
tErr # tSel->SelStore('TMP.Articleprice', _SelLock);
tSel # tSel->SelOpen();
...

Der Selektionsdeskriptor muss bei den weiteren Anweisungen angegeben werden.

Innerhalb einer Datei muss der Name der Selektion eindeutig sein. Der in dem Beispiel angegebene Name ist statisch definiert, d. h. führen zwei Clients die gleiche Prozedur aus, kommt es zu einem Fehler, da der zweite Benutzer die Selektion nicht unter dem gleichen Namen speichern kann. Sollen mehrere Benutzer die Prozedur ausführen können, kann der Name der Selektion mit der Benutzer-Id erweitert werden.

  ...
tErr # tSel->SelStore(UserInfo(_UserCurrent) + '.Articleprice', _SelLock);
...

Die verwendete Benutzer-Id ist für jeden angemeldeten Benutzer eindeutig. Soll innerhalb eines gestarteten Clients die Prozedur mehrfach gestartet werden, muss ein zusätzlicher Zähler verwendet werden, damit die Namen eindeutig sind.

Durchführen von Selektionen

Damit eine Selektion durchgeführt werden kann, muss zunächst ein Selektionspuffer mit der Anweisung SelOpen () angelegt werden. Anschließend kann die entsprechende Selektion gelesen werden (siehe SelRead ()). Ab diesem Zeitpunkt steht die Menge der Datensätze, die beim letzten Selektionsdurchlauf gefunden wurden, zur Verfügung. Werden aktuelle Daten benötigt, muss die Selektion gestartet werden. Bei allen Operationen, die die Selektion oder die Selektionsmenge ändern können, muss die Selektion zuvor mit einer Sperroption (_SelLock) geöffnet werden.

Steht ein Selektionsdeskriptor mit einer gesperrten Selektion zur Verfügung, kann die Selektion mit der Anweisung SelRun () durchgeführt werden. Bei der Durchführung werden Datensätze aus der Datei gelesen und mit dem Selektionskriterium verglichen. Erfüllt der Datensatz das Kriterium, wird ein Verweis auf den Datensatz in der Selektionsmenge gespeichert.

  ...
tErr # tSel->SelRun(_SelDisplay | _SelWait);
...

Die Durchführung einer Selektion kann abhängig von der Menge der zu durchsuchenden Datensätze und vom Aufbau des Selektionskriteriums einige Zeit in Anspruch nehmen. Hinweise zur Verbesserung des Laufzeitverhaltens von Selektionen befinden sich im Abschnitt Selektionen optimieren .

In diesem Beispiel wird der Fortschritt der Selektion angezeigt und nach der Durchführung auf eine Eingabe des Benutzers gewartet.

Weitere Parameter sind bei der Anweisung SelRun () beschrieben. Nach der Durchführung der Selektion kann auf die Selektionsmenge zugegriffen werden, bis der Selektionsdeskriptor geschlossen wird.

Selektionsmenge verarbeiten

Um auf die Datensätze einer Selektionsmenge zugreifen zu können, wird ein Selektionsdeskriptor benötigt (SelOpen ()) und die entsprechende Selektionsmenge muss gelesen worden sein (SelRead ()). Sollen an der Selektionsmenge Änderungen vorgenommen werden (Datensätze löschen oder hinzufügen), muss die Selektionsmenge sperrend gelesen werden.

info

Änderungen an den Datensätzen können ohne Sperrung der Selektionsmenge erfolgen, da in der Selektionsmenge nur Referenzen auf die Datensätze enthalten sind. Werden Datensätze nach der Durchführung der Selektion verändert, wirkt sich das nicht auf die Zugehörigkeit zur Selektionsmenge aus.

Der Inhalt der Selektionsmenge kann in einem RecList -, RecListPopup - oder PrintDocRecord -Objekt ausgegeben werden. Der Selektionsdeskriptor muss dazu der Eigenschaft DbSelection zugewiesen werden.

  ...
$RecList->wpDbSelection # tSel;
...

Dabei ist zu beachten, dass in der Eigenschaft DbFileNo die gleiche Dateinummer angegeben sein muss, in der die Selektion definiert wurde. Der Selektionsdeskriptor darf erst geschlossen werden, wenn die Objekte nicht mehr auf die Selektionsmenge zugreifen müssen. Sollen die Datensätze prozedural gelesen werden, kann bei der Anweisung RecRead () der Selektionsdeskriptor anstelle des Schlüssels angegeben werden.

  ...
for tErr # RecRead(tblArtArticle, tSel, _RecFirst)
loop tErr # RecRead(tblArtArticle, tSel, _RecNext)
while (tErr < _ErrNoKey)
{
...
}
...

In diesem Beispiel werden alle Datensätze in der Selektion gelesen.

Einzelne Datensätze können mit den Anweisungen SelRecDelete () und SelRecInsert () aus einer Selektionsmenge gelöscht oder eingefügt werden. Mit diesen Anweisungen können komplette Selektionsmengen ohne ein Selektionskriterium aufgebaut werden. Die Anweisungen können nur verwendet werden, wenn die Selektionsmenge sperrend gelesen wurde.

Wird nach der Verarbeitung die Selektionsmenge nicht mehr benötigt, kann der Selektionsdeskriptor mit der Anweisung SelClose () geschlossen werden.

Selektion löschen

Wird eine Selektion nicht mehr benötigt, kann sie mit der Anweisung SelDelete () aus der Datenbank entfernt werden.

  ...
tErr # SelDelete(tblArtArticle, UserInfo(_UserCurrent) + '.Articleprice');
...

Verarbeitungshinweise

Eine Selektionsmenge ist eine Momentaufnahme des Datenbestandes. Werden nach dem Durchführen einer Selektion Änderungen am Datenbestand vorgenommen, werden diese nicht berücksichtigt, bis die Selektion erneut durchgeführt wird. Der Zeitpunkt, zudem eine Selektion zuletzt durchgeführt wurde, kann mit den Anweisungen SelInfoDate () und SelInfoTime () ermittelt werden.

Werden Datensätze, die in der Selektionsmenge enthalten sind, gelöscht, wirkt sich das nicht auf die Verarbeitung der Selektionsmenge aus. Befindet sich in einer Selektionsmenge eine Referenz auf einen nicht vorhandenen Datensatz, wird dieser übersprungen. Neu angelegte Datensätze werden keiner Selektionsmenge zugeordnet.

Selektionsmengen werden in der Datenbank gespeichert. Dass heißt nach dem Durchführen der Selektion kann auch ohne eine erneute Durchführung auf die zuletzt selektierten Datensätze zugegriffen werden. Diese Selektionsmengen können mit der Anweisung SelClear () geleert werden. Wird eine Selektion gelöscht (siehe SelDelete ()), steht auch die Selektionsmenge nicht mehr zur Verfügung. Durch die Durchführung einer Optimierung werden alle Selektionsmengen geleert.

Befehle

Konstanten