Richard Kupke
Hallo Herr Mauch, ich denke der Export und Import ist semi-zielführend. Meist gibts doch gewisse Individualitäten. Nutzen Sie lieber die KI oder das Cockpit, welches Ihnen Frau Milnik sicher als nächsten nahelegen wird. :-)
Falls Sie dennoch alle Exportieren wollen hier der passende SQL Query dazu. Dann haben Sie eine CSV. In jeder Zeile ist die gesamte SQL-Abfrage. Sie müssten dann die Spalte SQL_block vereinzeln/ weiterverarbeiten. Also nur ein Backup Ihrer eigenen Statistiken.
BG Richard Kupke
-- ==================================================================
-- Export aller in der Statistikverwaltung gespeicherten Statistiken
-- ------------------------------------------------------------------
-- Liefert je Statistik: Ordnerpfad, Name, Erklaertext, das komplette
-- SQL im Original sowie die Elemente kombinierter Statistiken.
-- Ergebnis enthaelt keine Patientendaten.
-- Getestet auf tomedo mit PostgreSQL-Backend, Stand 08/2026.
--
-- Zwei Tabellen tragen alles:
-- outlineviewelement dtype = 'StatistikOutlineElement'
-- -> Name, Erklaertext, sqlquery
-- customstatistikelement -> Elemente kombinierter Statistiken,
-- verbunden ueber die Bruecke
-- outlineviewelement_customstatistikelemente
--
-- Wichtig: Statistiken, die aus einer Mengenoperation gebaut sind
-- (sqlquery enthaelt nur A, B-A, A und B), haben ihren Inhalt
-- ausschliesslich in den Elementen. Ein Export ueber sqlquery allein
-- verliert diese Statistiken.
--
-- Um auch die mitgelieferten tomedo-Standardstatistiken zu sehen:
-- Zeile "AND OVE.iscustom = true" auskommentieren.
-- Um geloeschte Statistiken auszublenden:
-- "AND OVE.removed = false" ergaenzen. Geloeschte Statistiken
-- verlieren ihre Baumverknuepfung, ihre Ordnerspalten sind leer.
-- ==================================================================
SELECT OVE.ident AS statistikID,
COALESCE(GPA.name, '') AS ordner_oben,
COALESCE(PAR.name, '') AS ordner,
OVE.name AS bezeichnung,
CASE WHEN OVE.iscustom THEN 'eigen' ELSE 'tomedo' END AS herkunft,
CASE WHEN OVE.isgroup THEN 'Ordner' ELSE 'Statistik' END AS art,
CASE WHEN OVE.removed THEN 'ja' ELSE 'nein' END AS geloescht,
CASE WHEN OVE.visibleingui THEN 'ja' ELSE 'nein' END AS sichtbar,
-- Bauart: eigenes SQL oder nur Mengenoperation ueber die Elemente
CASE WHEN OVE.isgroup THEN 'Ordner'
WHEN COALESCE(OVE.sqlquery, '') = '' THEN 'leer'
WHEN length(OVE.sqlquery) < 30 THEN 'Mengenalgebra'
ELSE 'SQL' END AS bauart,
-- Hinweisspalte: gibt die Statistik Klarnamen aus
CASE WHEN strpos(lower(COALESCE(OVE.sqlquery, '')), 'nachname') > 0
THEN 'ja' ELSE 'nein' END AS gibt_namen_aus,
CAST(OVE.erstellt AS text) AS erstellt,
OVE.listenpos,
OVE.zsident,
OVE.stdrequestfor,
OVE.sqltyp,
OVE.explanation,
OVE.sqlquery,
-- Elemente: Kuerzel, Elementtyp, Bezugsraum von/bis und die
-- gespeicherte Filterbelegung als ZS-XML
(SELECT string_agg(
concat(CSE.kuerzel, ' typ=', CSE.elementtyp,
' zeit=', CSE.vonbezugsraumtyp, '/', CSE.vonbezugsraumanzahl,
'..', CSE.bisbezugsraumtyp, '/', CSE.bisbezugsraumanzahl,
' filter=', COALESCE(CSE.suchfreitext, '')),
' ;; ' ORDER BY CSE.kuerzel, CSE.listenpos)
FROM outlineviewelement_customstatistikelemente BRC
JOIN customstatistikelement CSE
ON CSE.ident = BRC.customstatistikelemente_ident
WHERE BRC.outlineviewelement_ident = OVE.ident) AS elemente
FROM outlineviewelement OVE
-- Ordnerpfad ueber die Baum-Bruecke. Zwei Ebenen reichen in der Praxis.
-- Falls diese Bruecke in aelteren Versionen fehlt: die vier LEFT JOIN
-- streichen und ordner_oben / ordner aus dem SELECT nehmen.
LEFT JOIN outlineviewelement_children BRP ON BRP.children_ident = OVE.ident
LEFT JOIN outlineviewelement PAR ON PAR.ident = BRP.outlineviewelement_ident
LEFT JOIN outlineviewelement_children BRG ON BRG.children_ident = PAR.ident
LEFT JOIN outlineviewelement GPA ON GPA.ident = BRG.outlineviewelement_ident
WHERE OVE.dtype = 'StatistikOutlineElement'
AND OVE.iscustom = true
ORDER BY 2, 3, 4