Zwei Werkzeuge für zwei Aufgaben
dForge trennt Berichte (formell, mit Modulen ausgeliefert) von Ad-hoc-Abfragen (persönlich, explorativ).
| Werkzeug | Eigentümer | Wo es lebt | Anwendungsfall |
|---|---|---|---|
| Berichte | Modul-Entwickler | Im Modul gepackt, mit allen Anwendern geteilt | Wiederkehrende Dashboards, gepackte Analysen, parametrisierte Exporte |
| Visueller Query-Builder | Endanwender | Persönlich, gespeichert pro Anwender pro Modul | Ad-hoc-Fragen, einmalige Analysen, Daten erkunden |
Beide produzieren dasselbe Query-JSON, sodass eine nützliche Ad-hoc-Abfrage später in einen formellen Berichts-Datensatz umgewandelt werden kann.
Berichte
Ein Bericht ist eine Sammlung aus einem oder mehreren Datensätzen, die zusammen mit einem Layout gerendert werden. Jeder Datensatz ist entweder eine Abfrage oder eine Stored Procedure, die Zeilen zurückgibt. Datensätze können hierarchisch sein (Master-Detail) und teilen sich Parameter.
Datensätze
Jeder Datensatz hat:
- Einen Typ: Query (
Q) oder Stored Procedure (S) - Eine Query-Definition oder Stored-Procedure-Referenz
- Optionale Parameter
- Optionale Spalten-Anzeige-Eigenschaften (Formatierung, Ausrichtung, Breiten)
- Einen optionalen Eltern-Datensatz für Master-Detail-Beziehungen
Ein einzelner Bericht kann Query-Datensätze und Stored-Procedure-Datensätze mischen — nützlich, wenn Sie eine entwickler-geschriebene SP für performance-kritische Aggregationen neben einer metadaten-definierten Abfrage brauchen.
Parameter
Berichts-Parameter werden aus Datensatz-Parametern abgeleitet. Jeder Datensatz deklariert die Parameter, die er braucht; das effektive Parameter-Set des Berichts ist die Vereinigung aller Datensatz-Parameter nach Namen.
"params": {
"start_date": {
"type": "date",
"label": "Startdatum",
"required": true,
"default": "=STARTMONTH(NOW())"
},
"end_date": {
"type": "date",
"label": "Enddatum",
"required": true,
"default": "=ENDMONTH(NOW())"
},
"region": {
"type": "reference",
"entity_cd": "region",
"label": "Region"
}
}
Parameter mit Formel-Defaults (mit = als Präfix) werden zur Berichts-Ausführungszeit ausgewertet, sodass ein Parameter wie STARTMONTH(NOW()) sich immer auf den ersten Tag des aktuellen Monats öffnet.
Wenn zwei Datensätze denselben Parameter-Namen mit inkompatiblen Typen deklarieren, ist das ein Fehler zur Designzeit — beheben Sie ihn, indem Sie einen der Parameter umbenennen.
Gespeicherte Parameter-Sets
Anwender können die Parameter-Werte, die sie am häufigsten verwenden, als benannte Parameter-Sets speichern (z. B. „Q1 Region Ost“, „Letzter Monat alle“). Diese werden gegen den Bericht gespeichert, sodass der Anwender dieselbe Sicht mit einem Klick erneut ausführen kann.
Auto-Refresh
Berichte können auf Berichts-Ebene ein reload_interval (in Sekunden) deklarieren, das pro Layout-Panel überschrieben werden kann. Die Oberfläche führt die Abfragen im Intervall erneut aus — nützlich für Live-Dashboards.
Sicherheit
Die Berichts-Ausführung respektiert denselben Sicherheits-Stack wie jede andere Abfrage:
- Der Anwender muss das
E-Recht (Execute) auf dassec_objectdes Berichts haben - Jede Datensatz-Abfrage wird mit dem Zeilenfilter des aktuellen Ordners und den Sicherheitsregeln auf Zeilenebene des Anwenders ausgeführt
- Sicherheit auf Spaltenebene aus der aktiven Entitätsansicht wird durchgesetzt
Ein Bericht kann niemals mehr Daten zeigen, als der Anwender durch direktes Abfragen der zugrunde liegenden Entitäten sehen könnte.
Visueller Query-Builder
Der Query-Builder lässt Anwender Ad-hoc-Abfragen erstellen, speichern und erneut ausführen, ohne SQL zu schreiben. Er produziert dasselbe Query-JSON, das von Berichts-Datensätzen verwendet wird, sodass eine hier erstellte Abfrage später in einen formellen Bericht überführt werden kann.
Wo Sie ihn finden
Abfragen ist ein Top-Level-Sidebar-Link, der für alle Anwender sichtbar ist. Öffnen Sie ihn, um Ihre gespeicherten Abfragen für den Ordner des aktuellen Moduls zu sehen.
Eine Abfrage bauen
- Wählen Sie eine Stamm-Entität — die SQL-
FROM-Klausel - Wählen Sie Spalten aus dem Beziehungsbaum (der Builder folgt Referenzen und Sets, sodass Sie Felder aus verbundenen Entitäten holen können, ohne über JOINs nachzudenken)
- Fügen Sie Filter hinzu
- Schalten Sie optional Gruppierung ein, um zu aggregieren
- Wählen Sie eine Sortierreihenfolge
- Speichern Sie
Flach- vs. Gruppen-Modus
Ein Umschalter steuert, ob die Abfrage Zeilen oder Aggregate zurückgibt:
| Modus | SQL-Analogie | Anwendungsfall |
|---|---|---|
| Flach | SELECT ... FROM ... | Einzelne Datensätze auflisten |
| Gruppiert | SELECT ... FROM ... GROUP BY ... | Aggregieren / zusammenfassen |
Im Gruppen-Modus braucht jede Spalte eine Aggregation: group (Dimension), sum, count, avg, min oder max. Mindestens eine Spalte muss eine group sein und mindestens eine muss ein Aggregat sein.
Geltungsbereich und Eigentümerschaft
- Gespeicherte Abfragen sind modul-gebunden und anwender-eigen — nur Sie sehen sie
- Eine Abfrage, die Sie in einem Ordner speichern, kann aus jedem anderen Ordner desselben Moduls ausgeführt werden; der Ordner zur Ausführungszeit bestimmt, welche Filter auf Zeilenebene gelten
- Das ist dasselbe
module_id-FK-Pattern, das Berichte verwenden, sodass Abfragen später in Berichte überführt werden können
Eine Abfrage in einen Bericht überführen
Wenn eine Ad-hoc-Abfrage zu einem wiederkehrenden Bedarf wird, kann dasselbe Query-JSON als Datensatz in die reports.json eines Moduls gepackt werden. Kein Übersetzungsschritt — die Struktur ist identisch.