OFFICIUM INSERVIO IT
Your reliable partner for your business software...
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.
