Programmierung

Dynamische Selektionen mit Verknüpfungen und Verknüpfungssätzen

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 Kommentare

4 Kommentare “Dynamische Selektionen mit Verknüpfungen und Verknüpfungssätzen”

  1. @ 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.

  2. 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.

Kommentar abgeben