top of page

Datenquelle Select Top mit Parameter / data source select top with parameter

(alle Versionen/all versions)

Montag, 9. März 2026

Deutsch


Situation/Anforderung

Man möchte eine dynamische Datenquelle im AppDesigner haben , die letzten Endes mit SQL-Select Top die Daten selektiert , aber man möchte nicht über einen Geschäftsprozess gehen.


Lösung

Befindet man sich z.B. in einem auslösenden Element , welches Parameter aus einer Datenstruktur beinhaltet , so ist das Ganze sehr einfach möglich.


Voraussetzung: Man hat ein Ganzzahl-Feld in der Datenstruktur namens z.B. "pSAGTopCount" vom Typ "Integer". In diesem Feld kann entweder der Anwender die gewünschte abzurufende Datensatz-Anzahl eingeben , oder , man schaltet das Feld unsichtbar belegt diese Zahl intern entsprechend vor , z.B. über einen MacroProcessBase-Aufruf von .net-Code.


In der WHERE-Klausel der Datenquelle ist ein Zugriff wie folgt möglich.

Angenommen die Datenherkunft der Datenquelle ist eine SQL-Sicht , die mit dem Alias "A" gekapselt wurde.


⚠️Bekanntermaßen ist die Syntax leicht anders - je nachdem , ob man sich im Detail-Hilfseditor von Sage befindet oder aber direkt in den Eigenschaften des AppDesigner-Feldes die Werte einträgt.


AppDesigner-Eigenschaft-Syntax:

Mandant = $[Mandant] $[IfParameterExists(pSAGTopCount," AND Stapel IN ( SELECT TOP $[Parameter(pSAGTopCount)] L.Stapel FROM KHKZahlungenStapel AS L WITH(Readuncommitted) WHERE L.Mandant = A.Mandant AND L.Lastschrift = A.Lastschrift ORDER BY L.Zahlungsdatum DESC ) ")]

Syntax für Sage Hilfseditor:

Mandant = @Mandant AND -1 = CFN_IfParameterExists('pSAGTopCount','" AND Stapel IN ( SELECT TOP CFN_Parameter(''pSAGTopCount'') L.Stapel FROM KHKZahlungenStapel AS L WITH(Readuncommitted) WHERE L.Mandant = A.Mandant AND L.Lastschrift = A.Lastschrift ORDER BY L.Zahlungsdatum DESC ) "')

Die Logik ist gut erkennbar:

Offensichtlich wird geprüft , ob der Parameter "pSAGTopCount" überhaupt kontextbezogen für die Datenquelle bereitsteht.

Nur falls ja , fügt man entsprechend eine "AND"-Bedingung in die SQL-WHERE-Klausel ein , die ausschließlich solche Datensätze anzeigt , die in der SELECT TOP-Unterabfrage enthalten sind.

Im vorliegenden Fall geht es darum , aus der SQL-Sicht , die über den Alias "A" gekapselt ist und die Haupt-Datenherkunft der Datenquelle ist , dann nur x TOP Stapel-Datensätze zu selektieren , die den übrigen Grundkriterien der Haupt-Datenherkunft entsprechen (wie Mandant und Lastschrift).


⚠️Gleichzeitig wird damit auch erreicht , dass die Sortierung immer korrekt ist und quasi "erzwungen" wird , denn die Unterabfrage liefert immer nur die TOP x Schlüssel zurück , die der dort fest vorgegebenen Sortierung entsprechen.


⚠️Diese Logik macht natürlich nicht in allen Anwendungsfällen Sinn. Im vorliegenden Kundenprojekt hat sich diese Logik bewährt , da der Endkunde Tausende von älteren Stapeln vorliegen hat , die nicht gelöscht wurden , aber in der Praxis einfach keine sinnvolle Rolle mehr spielen.

Zum Beispiel eignet sich eine solche Logik für eine einfache Daten-Auswahlliste oder Auskunft der letzten aktiven Stapel etc.





bottom of page