SQL Views
Wenn direkter SQL-Zugriff auf die Kassa gefragt ist — meist weil APRO On-Premise neben bestehenden Systemen läuft — stellt die Kassendatenbank einen stabilen Satz lesender Views bereit. Sie sind gezielt auf die beiden häufigsten Konsumenten zugeschnitten:
- On-Premise-Integrationen — Buchhaltungsbrücken, Küchenmonitore, Warenwirtschaft, Loyalty-Engines — alles, was im selben Netz läuft und einen schnellen Datenfluss ohne Umweg über REST braucht.
- Bestehende BI-Workflows — Power BI, Tableau, Qlik, Metabase, Excel, SQL Server Analysis Services — jedes Tool, das bereits SQL-Server-Connections versteht. Connector auf die Views zeigen und du hast Belege, Positionen, Zahlungen und Artikelstamm in der Form, die ein Data Warehouse erwartet.
Die Views sind ausschließlich lesend, über das Standard-SQL-Server- Protokoll abfragbar und greifen nicht auf operative Tabellen zu, die unter Last mutieren — sie sind sicher für Dashboards und geplante ETL-Jobs.
Übersicht
| View | Inhalt |
|---|---|
vw_Receipts | Eine Zeile pro Geschäftsvorfall. |
vw_Receipt_Items | Positionen. Join über ReceiptId. |
vw_Payments | Zahlungen. Join über ReceiptId. |
vw_Transactions | Leichter Transaktions-Index. |
vw_TransactionTypes | Lookup der Transaktionstypen. |
vw_Bi_Export | Denormalisiertes Beleg × Position + Zahlungsübersicht — Startpunkt für Power BI. |
vw_products_and_categories | Artikelstamm mit Sparte. |
1. vw_Receipts
Eine Zeile pro Geschäftsvorfall. Die Spalte TransactionType sagt,
was die Zeile repräsentiert; Beträge sind vorzeichenbehaftet — bei
Stornos (TransactionType = 4) sind sie negiert, damit
SUM(TotalAmount) direkt netto rechnet.
| Spalte | Typ | Beschreibung |
|---|---|---|
Id | GUID | Eindeutige ID des Geschäftsvorfalls. |
TransactionId | GUID | Transaktions-ID (Join-Schlüssel für vw_Receipt_Items, vw_Payments). |
TransactionType | enum | Siehe Transaktionstypen. |
TransactionTypeName | string | Lesbarer Transaktionstyp. |
ReceiptNr | string | Beleg-/Rechnungsnummer. |
TotalAmount | decimal | Bruttosumme (signed — negativ bei Stornos). |
TipAmount | decimal | Trinkgeld (signed). |
ReceiptDiscountAmount | decimal | Rabatt auf Gesamtbeleg (signed). |
BookDate | datetime | Buchungszeitpunkt. |
BusinessDay | date | Virtueller Geschäftstag. |
ParentId | GUID | null | Vorgänger-Beleg (z. B. bei Rückholung Verweis auf Original). |
PaymentGroupId | integer | null | Zahlungsgruppen-ID (z. B. Umsatzwirksam). |
PaymentGroupName | string | null | Name der Zahlungsgruppe — nützlich als Umsatzfilter. |
BusinessId | integer | ID des durchführenden Unternehmens. |
BusinessName | string | Firmenname. |
TableId | integer | Tisch-ID. |
TableNr | integer | Tischnummer. |
TableName | string | Tischbezeichnung. |
AreaId | integer | Bereichs-ID. |
AreaNr | integer | Bereichsnummer. |
AreaName | string | Bereichsname (Restaurant, Bar, Terrasse …). |
StaffId | integer | Mitarbeiter-ID. |
StaffNr | integer | Personalnummer. |
StaffName | string | Mitarbeitername. |
CustomerId | integer | Kunden-ID. |
CustomerNr | integer | Kundennummer. |
CustomerName | string | Kundenname. |
DeviceId | integer | Ausführendes Gerät. |
Transaktionstypen
Die View enthält nur Transaktionen mit TransactionType in (1, 2, 3, 4, 5, 14, 24, 25). Das autoritative Mapping liegt in
vw_TransactionTypes und ist auch pro Zeile
als TransactionTypeName beigefügt.
TransactionType | Bedeutung |
|---|---|
1 | Bestellung — Eingabe am Tisch oder SB. |
2 | Verschiebung — Tischwechsel. |
3 | Abrechnung — bezahlter Beleg. |
4 | Storno — Umkehr einer Bestellung (Beträge negiert). |
5 | Rechnung zurückholen — Umkehr einer Abrechnung. |
14 | Ausgangsrechnung erstellt. |
24 | Ausgangsrechnung — zusätzlich (siehe vw_TransactionTypes). |
25 | Ausgangsrechnung bezahlt. |
2. vw_Receipt_Items
Positionen. Join mit vw_Receipts über ReceiptId / TransactionId.
Werte sind wie beim Beleg vorzeichenbehaftet.
| Spalte | Typ | Beschreibung |
|---|---|---|
TransactionId | GUID | Transaktions-ID. |
ReceiptId | GUID | Beleg-ID (Join auf vw_Receipts.Id). |
ReceiptItemId | GUID | Eindeutige Positions-ID. |
BookedItemId | GUID | Unterliegende Bonierungs-ID (gemeinsam zwischen Buchung und Storno). |
BookedItemDate | datetime | Bonierungszeitpunkt. |
ProductCategoryId | integer | Sparten-ID. |
ProductCategoryNr | integer | Sparten-Nummer. |
ProductCategoryName | string | Sparten-Bezeichnung. |
ProductCategoryAccountingNr | string | Buchungskonto-Nummer der Sparte. |
ProductId | integer | Artikel-ID. |
ProductNr | integer | Artikelnummer. |
ProductName | string | Artikelname. |
Quantity | decimal | Stückzahl (signed bei Stornos / Rückholungen). |
OriginalPrice | decimal | Ursprünglicher Einzelpreis zum Ausführungszeitpunkt (signed bei Stornos). |
EffectivePrice | decimal | Tatsächlicher Einzelpreis nach Rabatt (signed bei Stornos). |
OriginalAmount | decimal | Stück × Originalpreis (signed). |
EffectiveAmount | decimal | Stück × Originalpreis × Rabattfaktor (signed). |
DiscountAmount | decimal | Rabattbetrag in Geld (signed bei Stornos / Rückholungen). |
DiscountPercentage | decimal | Rabatt in % des Originalpreises. |
DiscountType | string | RABATT OFF für klassische Rabatte, sonst die Kampagnenbezeichnung (z. B. Happy Hour). Leer, wenn kein Rabatt. |
TaxId | integer | Steuersatz-ID. |
TaxName | string | Steuersatz-Name. |
TaxAmount | decimal | Steuersatz als Dezimalwert. |
TransactionTypeId | enum | Selbe Codes wie vw_Receipts.TransactionType. |
3. vw_Payments
Zahlungen zu Belegen. Enthalten sind nur Abrechnungen und ihre
Rückholungen (TransactionType in (3, 4, 5, 14, 24, 25)).
| Spalte | Typ | Beschreibung |
|---|---|---|
TransactionId | GUID | Transaktions-ID. |
ReceiptId | GUID | Beleg-ID. |
PaymentId | GUID | Eindeutige Zahlungs-ID. |
TotalAmount | decimal | Gezahlter Betrag (signed). |
PaymentTypeId | integer | Zahlungsmittel-ID. |
PaymentTypeNr | integer | Zahlungsmittel-Nummer. |
PaymentTypeName | string | Zahlungsmittel (z. B. Bar, Kreditkarte, Gutschein). |
DateTime | datetime | Zahlungszeitpunkt. |
PredecessorReceiptId | GUID | null | Bei Rückholung der Original-Beleg, den diese Zahlung aufhebt. |
Details | string | null | Freitext-Metadaten zur Zahlung (z. B. maskierte PAN, Gutscheincode). |
4. vw_Transactions
Leichter Index aller Transaktionen. Nützlich für Wasserzeichen-ETL (nur neue Zeilen seit dem letzten Checkpoint ziehen).
| Spalte | Typ | Beschreibung |
|---|---|---|
TransactionId | GUID | Transaktions-ID. |
TransactionType | enum | Transaktionstyp. |
TransactionTypeName | string | Lesbarer Name. |
BookDate | datetime | Zeitpunkt der Transaktion. |
DeviceId | integer | Ausführendes Gerät. |
5. vw_TransactionTypes
Lookup aller Transaktionstypen, die die Kassa erzeugt.
| Spalte | Typ | Beschreibung |
|---|---|---|
Id | integer | Transaktionstyp-ID. |
Bezeichnung | string | Lesbare Bezeichnung (deutsch). |
6. vw_Bi_Export
Die One-Stop-View für BI-Tools. Denormalisierter Join aller umsatzrelevanten Belege mit all ihren Positionen, plus einer komma-separierten Zusammenfassung der verwendeten Zahlungsmittel. Power BI oder Tableau auf diese View zeigen — und du hast alles für Umsatz-, Marge-, Mix- und Zahlungsmittel-Dashboards, ohne Joins schreiben zu müssen.
Spalten sind die Vereinigung von vw_Receipts und
vw_Receipt_Items (ohne TransactionTypeId,
das nur auf der Belegseite vorkommt), plus:
| Spalte | Typ | Beschreibung |
|---|---|---|
Payments | string | Komma-separierte Liste der PaymentTypeName-Werte (z. B. "Bar,Kreditkarte"). NULL auf Nicht-Abrechnungszeilen. |
Power-BI-Beispiel
- Daten abrufen → SQL-Server-Datenbank — Server + Datenbank wie bereitgestellt.
- Import- oder DirectQuery-Modus, lesender User.
dbo.vw_Bi_Exportals Fakt-Tabelle wählen.- Optional
dbo.vw_Transactions,dbo.vw_Payments,dbo.vw_products_and_categoriesals Dimensions-Tabellen hinzufügen und überTransactionId/ProductIdverknüpfen.
Der Import-Modus reicht in der Regel — die Views sind bereits auf Transaktionsebene aggregiert und aktualisieren sich bei einem typischen Betrieb in Sekunden.
7. vw_products_and_categories
Artikelstamm mit Sparte. Eignet sich als Dimension neben vw_Bi_Export,
wenn BI-Artikelnamen stabil bleiben sollen, auch wenn historische
Zeilen vor einer Umbenennung liegen.
| Spalte | Typ | Beschreibung |
|---|---|---|
ProductId | integer | Artikel-ID. |
ProductNr | integer | Artikelnummer. |
ProductName | string | Artikelname. |
ProductCategoryId | integer | Sparten-ID. |
ProductCategoryNr | integer | Sparten-Nummer. |
ProductCategoryName | string | Sparten-Name. |
Price | decimal | Aktueller Listenpreis (Preis1). |
Nur Artikel mit Geloescht = 0 (nicht soft-gelöscht) sind enthalten.
Beispiel-Queries
Umsatz pro Geschäftstag, nach Steuersatz — für einen Monats-KPI:
SELECT r.BusinessDay, ri.TaxName, SUM(ri.EffectiveAmount) AS netto_umsatzFROM vw_Receipts AS rJOIN vw_Receipt_Items AS ri ON ri.ReceiptId = r.IdWHERE r.TransactionType IN (3, 4, 5) -- Abrechnungen + Stornos rechnen netto AND r.BusinessDay BETWEEN @from AND @toGROUP BY r.BusinessDay, ri.TaxNameORDER BY r.BusinessDay, ri.TaxName;Top-10-Artikel im aktuellen Monat — direkt über die BI-View:
SELECT TOP 10 ProductName, SUM(Quantity) AS stueck, SUM(EffectiveAmount) AS netto_umsatzFROM vw_Bi_ExportWHERE BusinessDay >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1) AND TransactionType IN (3, 4, 5)GROUP BY ProductNameORDER BY netto_umsatz DESC;Bar vs. Karte für einen einzelnen Geschäftstag:
SELECT PaymentTypeName, SUM(TotalAmount) AS totalFROM vw_PaymentsWHERE CAST(DateTime AS date) = @businessDayGROUP BY PaymentTypeName;