Cette page décrit Calíope 1.7, la version que je construis en ce moment. La 1.6 est sur l'App Store pour Mac, iPad, iPhone, Apple Watch, Apple TV et Apple Vision Pro. Le changelog indique dans quelle version chaque fonction est arrivée.
Ajoute un bouton « Ouvrir dans Calíope » à chaque sujet. Ne fonctionne qu'avec l'app installée.
Une requête enregistrée avec une sortie définie et des paramètres déclarés.
Où le trouver : Espace de travail › Outils › Rapports
Un rapport n’est pas un fragment. Un fragment est du texte qu’on colle dans l’éditeur ; un rapport est un artefact qu’on exécute : il mémorise les colonnes qu’il attend, leur présentation, les paramètres qu’il demande et la source dont il provient.
C’est pourquoi l’exécuter deux fois donne la même chose, et pourquoi lorsque ce qui arrive ne correspond pas à ce qui était déclaré on vous le dit en haut au lieu d’afficher un tableau différent en silence.
Fonctionne avec les bases relationnelles, MongoDB et Redis.
Un rapport peut comporter plusieurs instructions, à condition que la dernière soit le SELECT qui produit le tableau.
Où le trouver : Espace de travail › Outils › Rapports
Tout rapport ne provient pas d’une seule requête. Vous pouvez définir une variable de session, construire une table temporaire en plusieurs passes, l’indexer et la lire à la fin. Le script entier s’exécute sur une seule connexion : la table temporaire créée à la première instruction existe encore à la dernière.
Ce que vous pouvez utiliser avant le SELECT final : SET et USE pour la session, CREATE TEMPORARY TABLE, et l’écriture dans les tables créées par ce même rapport — INSERT, UPDATE, DELETE, index, ALTER. Les lectures intermédiaires sont également permises.
Ce que vous ne pouvez pas : écrire dans une table réelle, CREATE TABLE sans TEMPORARY, SET GLOBAL, PREPARE, EXECUTE et CALL. C’est une liste fermée, et ce qui n’y figure pas est refusé, avec le numéro de l’instruction, avant toute exécution.
SELECT … INTO une vraie table est exclu aussi : dans plusieurs moteurs, cela crée cette table.
SQL Server
Dans SQL Server, une table temporaire est celle dont le nom commence par # (CREATE TABLE #t, SELECT … INTO #t, DROP TABLE #t), sans TEMPORARY. Créez-la sans paramètres et remplissez-la ensuite avec un INSERT : les valeurs liées passent par sp_executesql, et une table temporaire créée à l'intérieur disparaît à la fin de cette instruction. Calíope le signale avant toute exécution.
ClickHouse
Dans ClickHouse, la table temporaire se crée avec CREATE TEMPORARY TABLE et vit dans la mémoire du serveur. En HTTP chaque instruction est une requête indépendante, donc Calíope ouvre pour chaque exécution du rapport une session serveur qui lui est propre, et supprime la table temporaire à la fin. La table temporaire de la première instruction existe dans la dernière, et personne d’autre ne la voit. Le compte a besoin du privilège CREATE TEMPORARY TABLE ; avec un compte en lecture seule le rapport échoue dès la première instruction, et le message le dit.
Oracle
Dans Oracle, chaque instruction du rapport est validée quand elle se termine, et c’est ce qui décide comment s’écrit la table temporaire. Une GLOBAL TEMPORARY TABLE a besoin de ON COMMIT PRESERVE ROWS : avec le ON COMMIT DELETE ROWS par défaut, elle arrive vide au SELECT final. Une privée (CREATE PRIVATE TEMPORARY TABLE ora$ptt_…) a besoin de ON COMMIT PRESERVE DEFINITION : avec celle par défaut, elle disparaît dès la deuxième instruction. À la fin, Calíope vide et supprime la table temporaire sur la même connexion, même si le rapport échoue, donc la globale ne reste pas dans votre schéma. Oracle n’a ni SET ni USE : le rapport s’exécute dans le schéma du compte, et une table d’un autre schéma s’écrit précédée de celui-ci (demo.pedidos).
La raison est une promesse : un rapport ne touche jamais à vos données. C’est ce qui permet d’en programmer un à trois heures du matin.
Sur une connexion avec une étiquette d’environnement en lecture seule, un rapport peut créer ses tables temporaires ; rien de plus.
Mots-clés : lot, table temporaire, plusieurs instructions, script, préparation
Déclarés avec un type et une valeur par défaut, ils voyagent à part de la requête.
Où le trouver : Rapports › Déclarer les paramètres
Ils se déclarent dans « Déclarer les paramètres », dans la barre de l’outil : chacun avec son nom, son type, s’il est obligatoire et la valeur avec laquelle il arrive. Dans le texte ils s’écrivent « :nom » en SQL et "$$nom" dans le JSON de MongoDB.
Les écrire dans le texte ne les déclare pas. Ce n’est pas le chemin : un marqueur non déclaré fait échouer la validation du rapport. Ce que la feuille fait, en revanche, c’est vous proposer ceux que la requête utilise déjà, pour les déclarer avec le nom exact.
Un paramètre est une valeur, pas un morceau de requête. Il n’est jamais collé dans le texte : il voyage lié séparément, donc rien de ce que vous y saisissez ne peut casser la requête ni changer ce qu’elle fait.
En contrepartie, on ne peut paramétrer ni un nom de table, ni une liste IN(…) de longueur variable avec un seul marqueur. Pour la liste il y a le type « liste », qui déploie autant de marqueurs que de valeurs ; pour le nom de table il n’y a pas de prise en charge, et c’est délibéré.
Quelles colonnes s’affichent, dans quel ordre, avec quel titre et quel format.
Où le trouver : Rapports › Sortie
C’est ce qui transforme une requête enregistrée en rapport. Vous pouvez masquer des colonnes, les réordonner, leur donner votre propre titre, choisir le format (milliers, deux décimales, pourcentage, monnaie, date, octets) et leur alignement.
En pied de page vous pouvez ajouter des agrégats par colonne : somme, moyenne, minimum, maximum et comptage. Les valeurs nulles ne comptent pas : une moyenne divise par les valeurs présentes, pas par les lignes.
L’ordre choisi ici relève de la présentation et ne réécrit pas votre requête.
CSV, TSV, JSON, Markdown, HTML, XML, texte, Excel et un PDF paginé.
Où le trouver : Rapports › Exporter
Ce qui est exporté, c’est ce que déclare la sortie : les colonnes visibles, dans leur ordre, avec leurs titres et leurs formats. Un PDF qui dit « Montant » et un CSV qui dirait « total_eur » ne seraient pas le même rapport.
Une colonne sans format déclaré est exportée en CSV, TSV, JSON, XML et Excel avec sa valeur exacte —toutes les décimales, sans séparateur de milliers, et la date comme 2020-01-01—, car un autre programme la lira ; dans le PDF, le HTML, le Markdown et le Texte, elle sort comme à l'écran. Un format que vous déclarez est toujours exporté.
Le PDF est paginé, avec l’en-tête répété sur chaque page et sa numérotation ; les agrégats et les avis figurent sur la dernière.
Tout passe par le panneau d’enregistrement du système : Calíope n’écrit jamais dans un dossier que vous n’avez pas choisi.
Quotidien, hebdomadaire, jours ouvrés, mensuel ou toutes les N heures — avec une limite à connaître.
Où le trouver : Rapports › Planifier
Les exécutions planifiées n’ont lieu que si Calíope est ouverte. Il n’y a pas de service en arrière-plan, pas de démon, pas d’agent de lancement : sur le Mac cela tourne avec l’app ouverte, et sur iPad, uniquement au premier plan — aucune fenêtre d’arrière-plan n’est accordée à un rapport.
Si l’app est fermée à l’heure prévue, l’exécution est notée dans l’historique comme ignorée, avec son motif, et retentée à la suivante. Les exécutions manquées ne sont jamais déclenchées toutes d’un coup.
Sans personne devant, la valeur par défaut de chaque paramètre est utilisée. Un paramètre obligatoire sans valeur n’est jamais inventé : l’exécution est notée comme ignorée.
On ne programme que les rapports d’un serveur relationnel : dans une session MongoDB ou Redis, le bouton n’est pas là.
Apple Vision Pro : comme sur iPad, uniquement au premier plan.
Ce qui a tourné, quand, avec quelles valeurs et sur quelle machine.
Où le trouver : Rapports › Historique
Chaque exécution laisse sa ligne : quoi qu’il arrive, y compris les annulées et les ignorées. On y mémorise avec quels paramètres elle a tourné, combien de lignes elle a renvoyées, combien de temps elle a pris, quelle machine l’a exécutée et — lorsqu’il y a deux adresses possibles — par laquelle elle s’est connectée.
Rapports et sauvegardes partagent le même historique avec deux portées étanches : depuis Rapports vous ne voyez jamais une seule ligne de sauvegarde, et inversement.
Les lignes de plus de 180 jours sont supprimées automatiquement. L'historique reste sur cet appareil : il ne passe pas par iCloud.
Si l’historique lui-même n’a pas pu être écrit —un disque plein, par exemple—, le pied de page vous le dit : il manque alors des lignes, et ce que vous voyez n’est pas tout ce qui s’est exécuté.
Dans la feuille de sortie, on active un graphique en barres, en lignes ou en secteurs : une colonne donne les étiquettes et les colonnes numériques, les valeurs.
Où le trouver : Espace de travail › Outils › Rapports
Dans la feuille de sortie d’un rapport, la section Graphique active un graphique avec « Tracer un graphique ». Choisissez son Type —barres, lignes ou secteurs—, la Colonne d’étiquette qui donne les étiquettes, et une ou plusieurs colonnes numériques pour les valeurs. Si aucune colonne du résultat n’est numérique, la feuille le dit.
Le graphique est dessiné au-dessus du tableau. S’il doit laisser des séries de côté, il le signale, et VoiceOver le lit comme un résumé.
Mots-clés : graphique, diagramme, barres, lignes, secteurs, rapport