
Eine Selektionsmenge 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. Eine Selektion kann mehrere Ergebnismengen beinhalten, die Verweise auf Sätze verschiedener Dateien enthält. Weitere Ergebnismengen enthalten Verweise auf Daten verknüpfter Dateien und sind nach den entsprechenden Verknüpfungsschlüsseln sortiert.
Reihenfolge der Selektionen
Bei der Erstellung von dynamischen Selektionen sollte folgende Reihenfolge eingehalten werden:
SelCreate()
SelAddResult()
(bei Verknüpfungen mit Ergebnismenge)SelAddLink()
(bei Verknüpfungen)SelDefQuery()
SelStore()
SelOpen()
SelRun()
SelClose()
SelDelete()
Es ist zu beachten, dass sowohl für die Hauptabfrage als auch für die verknüpften Abfragen jeweils nur ein SelDefQuery()
durchgeführt werden kann.
Bei SelStore()
kann eine Sperroption angegeben werden. Soll die Selektion anschließend durchgeführt werden, muss sie mit _SelLock
gesperrt werden.
Abragen mit Verknüpfungen
Manchmal ist es aus statistischen Gründen notwendig, Selektionen mit Verknüpfung zu definieren, bei denen der spätere Zugriff auf die Verknüpfungsdaten nicht notwendig ist. Jedoch soll eine Einschränkung der Datensätze in der Hauptdatei aufgrund der Verknüpfungsergebnisse geschehen. Dies könnte beispielsweise der Fall sein, wenn alle Aufträge mit mindestens zehn Auftragspositionen im aktuellen Jahr ermittelt werden sollen und dabei jede Auftragsposition einen Gesamtpreis (Menge * Einzelpreis) von mindestens 100 EUR haben muss.
Um eine Abfrage mit einer Verknüpfung zu erstellen, muss vor dem SelDefQuery()
ein SelAddLink()
durchgeführt werden. Dort wird ein eindeutiger, selbstdefinierter Ankername angegeben. Für jeden Anker, sowie die Hauptabfrage, muss ein SelDefQuery()
durchgeführt werden.
tSel->SelAddLink('',tblOrpOrderPos,tblOrdOrder,lnkOrderPos,'Positions');
tSel->SelDefQuery('','LinkCount(Positions) >= 10 AND ' +
'fdOrdDate >= 1.1.2012 AND ' +
'fdOrdDate <= 31.12.2012');
tSel->SelDefQuery('Positions','fmOrpSum >= 100.00');
Verknüpfungen mit Datensätzen
Um nach Durchführung der Selektion auf die ausgewählten Datensätze der Verknüpfung zugreifen zu können, muss vor dem SelAddLink()
noch SelAddResult()
aufgerufen werden. Bei SelAddLink()
wird zusätzlich nach dem Ankernamen die Option _SelResultSet
übergeben.
tSel->SelAddResult(tblOrpOrderPos,tblOrdOrder,lnkOrderPos);
tSel->SelAddLink('',tblOrpOrderPos,tblOrdOrder,lnkOrderPos,'Positions',
_SelResultSet);
// ...
// Selektion ausführen
tSel->SelRun();
// Datensätze auslesen
for tRes # RecRead(tblOrdOrder, tSel, _RecFirst);
loop tRes # RecRead(tblOrdOrder, tSel, _RecNext);
while (tRes <= _rMultiKey)
{
// Verknüpfte Datensätze lesen
for tRes # RecLink(tblOrpOrderPos, tblOrdOrder, tSel, _RecFirst);
loop tRes # RecLink(tblOrpOrderPos, tblOrdOrder, tSel, _RecNext);
while (tRes <= _rMultiKey)
{
// ...
}
}
4 Antworten
@ Th.Eichele
1.) Der Geschwindigkeitsunterschied zwischen fdOrdDate between[01.01.2012,31.12.2012] und fdOrdDate >= 1.1.2012 AND fdOrdDate <= 31.12.2012 ist geringfügig. Aber prinzipiell haben Sie natürlich recht.
2.) Wie im Beispiel erwähnt, sollen nur die Aufträge ermittelt werden, welche mindestens 10 Positionen von einem jeweiligen Gesamtpreis von mindestens 100 EUR haben. Möchten Sie sich die Aufträge ausgeben lassen, in welchen alle Positionen mindestens 100 EUR besitzen, so können Sie dies über
tSel->SelDefQuery(”,’LinkCount(Positions) = LinkTotal(Positions) AND fdOrdDate between [01.01.2012,31.12.2012]’); erreichen.
1.) wäre eine Abfrage
fdOrdDate between [01.01.2012,31.12.2012]
nicht schneller ?
2.) die Abfrage ermittelt doch nur das es mindestens 10 Positionen mit mehr als 100 Euro gibt und nicht, das alle Positionen des Belegs mehr als 100 Euro haben.
@ Robs
Danke für den Hinweis. Natürlich sollte es "Ergebnismengen" heißen. Ist bereits korrigiert worden.
Danke für die Erläuterungen, Stephan!
Meinst Du oben mit "Ereignismengen" eigentlich "Ergebnismengen"?
Liebe Grüße!