Diese Seite beschreibt Calíope 1.7, die Version, die ich gerade baue. Die 1.6 ist im App Store für Mac, iPad, iPhone, Apple Watch, Apple TV und Apple Vision Pro. Das Changelog sagt, in welcher Version jede Funktion kam.
Fügt jedem Thema einen Button „In Calíope öffnen“ hinzu. Funktioniert nur mit installierter App.
Eine gesicherte Abfrage mit definierter Ausgabe und deklarierten Parametern.
Wo es zu finden ist: Workspace › Werkzeuge › Berichte
Ein Bericht ist kein Snippet. Ein Snippet ist Text, den man in den Editor einfügt; ein Bericht ist ein Artefakt, das man ausführt: er merkt sich die Spalten, die er erwartet, wie sie dargestellt werden, welche Parameter er verlangt und aus welcher Quelle er kommt.
Deshalb liefert zweimaliges Ausführen dasselbe, und deshalb wird dir oben gesagt, wenn das Ankommende nicht zum Deklarierten passt, statt stillschweigend eine andere Tabelle zu zeigen.
Funktioniert mit relationalen Datenbanken, mit MongoDB und mit Redis.
Ein Bericht darf aus mehreren Anweisungen bestehen, solange die letzte das SELECT ist, das die Tabelle erzeugt.
Wo es zu finden ist: Workspace › Werkzeuge › Berichte
Nicht jeder Bericht entsteht aus einer einzigen Abfrage. Du kannst eine Sitzungsvariable setzen, eine temporäre Tabelle in mehreren Durchgängen aufbauen, sie indizieren und am Ende lesen. Das gesamte Skript läuft über eine einzige Verbindung, deshalb existiert die in der ersten Anweisung erzeugte temporäre Tabelle auch noch in der letzten.
Was du vor dem abschließenden SELECT verwenden darfst: SET und USE für die Sitzung, CREATE TEMPORARY TABLE sowie Schreibzugriffe auf Tabellen, die dieser Bericht selbst erzeugt hat — INSERT, UPDATE, DELETE, Indizes, ALTER. Auch Lesevorgänge dazwischen sind erlaubt.
Was nicht: Schreiben in eine echte Tabelle, CREATE TABLE ohne TEMPORARY, SET GLOBAL, PREPARE, EXECUTE und CALL. Es ist eine geschlossene Liste; alles andere wird abgelehnt — mit Angabe der Anweisungsnummer und bevor irgendetwas ausgeführt wird.
SELECT … INTO in eine echte Tabelle ist ebenfalls ausgeschlossen: In mehreren Engines legt es diese Tabelle an.
SQL Server
In SQL Server ist eine temporäre Tabelle eine, deren Name mit # beginnt (CREATE TABLE #t, SELECT … INTO #t, DROP TABLE #t), ohne TEMPORARY. Lege sie ohne Parameter an und fülle sie danach mit einem INSERT: Gebundene Werte laufen über sp_executesql, und eine darin angelegte temporäre Tabelle verschwindet, wenn diese Anweisung endet. Calíope sagt das, bevor etwas ausgeführt wird.
ClickHouse
In ClickHouse wird die temporäre Tabelle mit CREATE TEMPORARY TABLE angelegt und lebt im Speicher des Servers. Über HTTP ist jede Anweisung eine eigene Anfrage, deshalb öffnet Calíope für jede Ausführung des Berichts eine eigene Serversitzung und löscht die temporäre Tabelle am Ende. Die temporäre Tabelle aus der ersten Anweisung existiert in der letzten, und niemand sonst sieht sie. Das Konto braucht das Recht CREATE TEMPORARY TABLE; mit einem schreibgeschützten Konto scheitert der Bericht bei der ersten Anweisung, und die Meldung sagt es.
Oracle
In Oracle wird jede Anweisung des Berichts festgeschrieben, sobald sie fertig ist, und das bestimmt, wie die temporäre Tabelle geschrieben wird. Eine GLOBAL TEMPORARY TABLE braucht ON COMMIT PRESERVE ROWS: Mit dem voreingestellten ON COMMIT DELETE ROWS kommt sie leer beim letzten SELECT an. Eine private (CREATE PRIVATE TEMPORARY TABLE ora$ptt_…) braucht ON COMMIT PRESERVE DEFINITION: Mit der Voreinstellung ist sie bei der zweiten Anweisung verschwunden. Am Ende leert und löscht Calíope die temporäre Tabelle auf derselben Verbindung, auch wenn der Bericht fehlschlägt, sodass die globale nicht in deinem Schema zurückbleibt. Oracle kennt kein SET und kein USE: Der Bericht läuft im Schema des Kontos, und eine Tabelle aus einem anderen Schema wird mit diesem davor geschrieben (demo.pedidos).
Der Grund ist ein Versprechen: Ein Bericht rührt deine Daten nie an. Genau das macht es sicher, einen um drei Uhr morgens einzuplanen.
Auf einer Verbindung mit einem schreibgeschützten Umgebungsetikett kann ein Bericht seine temporären Tabellen anlegen; mehr nicht.
Stichwörter: Stapel, temporäre Tabelle, mehrere Anweisungen, Skript, Vorbereitung
Mit Typ und Vorgabewert deklariert, und sie reisen getrennt von der Abfrage.
Wo es zu finden ist: Berichte › Parameter deklarieren
Deklariert werden sie unter „Parameter deklarieren“ in der Werkzeugleiste: jeder mit Namen, Typ, ob er erforderlich ist und mit welchem Wert er ankommt. Im Text schreibt man sie als „:name“ in SQL und als "$$name" im JSON von MongoDB.
Sie in den Text zu schreiben deklariert sie nicht. Nicht auf diesem Weg: ein nicht deklarierter Platzhalter lässt den Bericht bei der Prüfung scheitern. Was das Blatt hingegen tut, ist dir die anzubieten, die die Abfrage bereits verwendet, damit du sie mit dem exakten Namen deklarierst.
Ein Parameter ist ein Wert, kein Stück Abfrage. Er wird nie in den Text eingefügt: er reist separat gebunden, also kann nichts, was du dort eingibst, die Abfrage zerstören oder ihr Verhalten ändern.
Der Preis dafür: weder ein Tabellenname noch eine IN(…)-Liste variabler Länge lassen sich mit einem einzigen Platzhalter parametrisieren. Für die Liste gibt es den Typ „Liste“, der so viele Platzhalter erzeugt wie Werte; für den Tabellennamen gibt es keine Unterstützung, und das ist Absicht.
Welche Spalten erscheinen, in welcher Reihenfolge, mit welchem Titel und Format.
Wo es zu finden ist: Berichte › Ausgabe
Das ist es, was aus einer gesicherten Abfrage einen Bericht macht. Du kannst Spalten ausblenden, umsortieren, ihnen einen eigenen Titel geben, das Format wählen (Tausender, zwei Nachkommastellen, Prozent, Währung, Datum, Bytes) und ihre Ausrichtung.
In der Fußzeile kannst du Aggregate je Spalte hinzufügen: Summe, Mittelwert, Minimum, Maximum und Anzahl. Nullwerte zählen nicht: ein Mittelwert teilt durch die vorhandenen Werte, nicht durch die Zeilen.
Die hier gewählte Reihenfolge ist Darstellung und schreibt deine Abfrage nicht um.
CSV, TSV, JSON, Markdown, HTML, XML, Text, Excel und ein paginiertes PDF.
Wo es zu finden ist: Berichte › Exportieren
Exportiert wird das, was die Ausgabe deklariert: die sichtbaren Spalten, in ihrer Reihenfolge, mit ihren Titeln und Formaten. Ein PDF, das „Betrag“ sagt, und ein CSV, das „total_eur“ sagte, wären nicht derselbe Bericht.
Eine Spalte ohne deklariertes Format wird nach CSV, TSV, JSON, XML und Excel mit ihrem genauen Wert exportiert —alle Nachkommastellen, ohne Tausendertrennzeichen, und das Datum als 2020-01-01—, weil ein anderes Programm sie liest; im PDF, HTML, Markdown und Text erscheint sie wie auf dem Bildschirm. Ein Format, das du deklarierst, wird immer exportiert.
Das PDF ist paginiert, mit auf jeder Seite wiederholter Kopfzeile und Nummerierung; Aggregate und Hinweise stehen auf der letzten.
Alles läuft über das Sicherungsfenster des Systems: Calíope schreibt nie in einen Ordner, den du nicht ausgewählt hast.
Täglich, wöchentlich, werktags, monatlich oder alle N Stunden — mit einer Grenze, die man kennen sollte.
Wo es zu finden ist: Berichte › Planen
Geplante Läufe finden nur statt, solange Calíope offen ist. Es gibt keinen Hintergrunddienst, keinen Daemon, keinen Launch Agent: am Mac läuft es bei geöffneter App, und am iPad nur im Vordergrund — einem Bericht wird kein Hintergrundfenster gewährt.
Ist die App zur vorgesehenen Zeit geschlossen, wird der Lauf im Verlauf als übersprungen vermerkt, mit seinem Grund, und beim nächsten erneut versucht. Verpasste Läufe werden nie alle auf einmal ausgelöst.
Ohne jemanden davor wird der Vorgabewert jedes Parameters benutzt. Ein erforderlicher Parameter ohne Wert wird nie erfunden: der Lauf wird als übersprungen vermerkt.
Programmieren lassen sich nur Berichte eines relationalen Servers: In einer MongoDB- oder Redis-Sitzung fehlt die Schaltfläche.
Apple Vision Pro: wie auf dem iPad, nur im Vordergrund.
Was lief, wann, mit welchen Werten und auf welchem Gerät.
Wo es zu finden ist: Berichte › Verlauf
Jede Ausführung hinterlässt ihre Zeile: was auch passiert, auch die abgebrochenen und die übersprungenen. Gespeichert wird, mit welchen Parametern sie lief, wie viele Zeilen sie lieferte, wie lange sie dauerte, welches Gerät sie ausführte und — wenn es zwei mögliche Adressen gibt — über welche sie sich verbunden hat.
Berichte und Backups teilen sich denselben Verlauf mit zwei dichten Bereichen: von Berichten aus siehst du nie eine einzige Backup-Zeile, und umgekehrt genauso.
Zeilen, die älter als 180 Tage sind, werden automatisch gelöscht. Der Verlauf bleibt auf diesem Gerät: Er geht nicht zu iCloud.
Wenn der Verlauf selbst nicht geschrieben werden konnte —etwa bei vollem Speicher—, sagt es die Fußzeile: dann fehlen Zeilen, und was du siehst, ist nicht alles, was gelaufen ist.
Im Ausgabeblatt schaltet man ein Balken-, Linien- oder Kreisdiagramm ein: Eine Spalte liefert die Beschriftungen, die numerischen Spalten die Werte.
Wo es zu finden ist: Workspace › Werkzeuge › Berichte
Im Ausgabeblatt eines Berichts schaltet der Abschnitt Diagramm mit „Diagramm zeichnen“ ein Diagramm ein. Wähle seine Art —Balken, Linien oder Kreis—, die Beschriftungsspalte, die die Beschriftungen liefert, und eine oder mehrere numerische Spalten für die Werte. Ist keine Spalte des Ergebnisses numerisch, sagt das Blatt es.
Das Diagramm wird über der Tabelle gezeichnet. Muss es Reihen weglassen, weist es darauf hin, und VoiceOver liest es als Zusammenfassung.
Auf dem Mac druckt ⌘P bei sichtbarem Ergebnis dieselbe Tabelle, die du siehst; ohne Ergebnis ist der Menüpunkt deaktiviert.
Wo es zu finden ist: Tastaturkürzel: ⌘P
Auf dem Mac, mit dem Ergebnis eines Berichts auf dem Bildschirm, druckt ⌘P dieselbe Tabelle, die du siehst. Ohne Ergebnis ist der Menüpunkt deaktiviert.
Das Drucken eines Berichts ist eine Funktion des Mac.