Aller au contenu principal

Concevoir un rapport

Objectif​

Mettre en page un rapport au sein de la plateforme — sur un canevas, à côté des requêtes qui le remplissent — plutôt que de le dessiner dans un outil séparé et de recoller le JSON.

Où il s’ouvre​

Ouvrez votre solution, choisissez Rapports, sélectionnez un rapport et appuyez sur Concevoir. Le canevas s’ouvre sur place, sous le même fil d’Ariane et avec les mêmes sélecteurs d’environnement et de solution que ceux dans lesquels vous travailliez déjà. Ce n’est ni une seconde application ni un nouvel onglet : concevoir un rapport est un travail de créateur, et ceci est le portail des créateurs.

Concevoir et Modifier sont deux commandes, car elles gèrent deux moitiés différentes :

  • Concevoir, c’est la mise en page — la page, ses bandes, ses tableaux, son logo.
  • Modifier, c’est tout ce qu’un canevas ne peut pas savoir — quelles requêtes enregistrées remplissent le modèle, et quel champ restreint chacune d’elles quand quelqu’un imprime un seul enregistrement.

Vous utiliserez les deux sur la plupart des rapports, et aucune n’écrase la moitié de l’autre.

Prérequis​

  • Vous êtes connecté en tant que créateur, avec une solution et un environnement sélectionnés.
  • Le rapport existe déjà. Créez-le d’abord — voir Créer un rapport — puis concevez-le.

Étapes​

  1. Ouvrez votre solution et choisissez Rapports.
  2. Sélectionnez le rapport et appuyez sur Concevoir.
  3. Si le rapport n’a jamais été conçu, le canevas s’ouvre avec seulement le tableau Styles — les couleurs et styles de texte dont part un design, qui ne s’impriment jamais. Utilisez Insérer → Page de rapport pour déposer une page, et disposez votre contenu à l’intérieur.
  4. Dessinez le rapport : des bandes pour l’en-tête et le pied de page, un répéteur pour les lignes, du texte lié aux champs de votre jeu de données. La palette et le panneau des calques fonctionnent comme toujours ; l’inspecteur a désormais deux onglets — voir plus bas.
  5. Appuyez sur Enregistrer.

Partir d’un exemple​

Insérer → Rapports d’exemple dépose une page de rapport terminée sur le canevas à côté de ce que vous avez déjà dessiné — rien n’est remplacé — et charge ses données d’exemple dans l’éditeur de données du rapport, pour que l’aperçu soit immédiat.

La liste a deux moitiés, qui répondent à des questions différentes.

Les cinq premiers sont des documents terminés — Facture, Ventes, Liste de contacts, Synthèse, Tableau de bord — et ils sont là pour montrer à quoi peut ressembler un rapport.

Les quatre suivants illustrent chacun une fonctionnalité, ce qu’il vous faut quand vous savez quel effet vous cherchez mais pas le geste. Chacun porte une ligne dans son propre pied de page indiquant où regarder :

ExempleMontre
Style (zébrures + mise en forme conditionnelle)Des lignes alternées, une couleur et une graisse qui changent au-delà d’un seuil, une couleur de statut, et un indicateur qui n’apparaît que sur les lignes concernées
FiligraneUn tampon BROUILLON sur chaque page, et un bloc de contrôle documentaire dans le coin
En-tête et pied de page répétésUn en-tête de lettre et un pied de page sur chaque feuille, des titres de colonnes qui reviennent partout où le tableau continue, et un sous-total par feuille à côté d’un total de tout le tableau
GraphiquesUn graphique en barres et un graphique linéaire, et un tableau lisant le même jeu de données en dessous

Ouvrez-en un, sélectionnez une bande ou une cellule, et lisez ses expressions dans l’inspecteur ou sur la page Code. Ce sont des dessins ordinaires — modifiez-les, gardez la moitié qui vous intéresse, supprimez le reste.

Ces quatre exemples sont liés à une vraie table

Leurs cellules lisent row.par_name, row.par_amount, row.par_currency et row.par_status — les colonnes de la table d’exemple expenses — plutôt que des noms inventés. C’est ce qui permet d’installer le même dessin comme un rapport fonctionnel avec de vraies lignes derrière, au lieu d’un aperçu flatteur et d’une impression vide. Repointez-les vers votre propre table en modifiant le jeu de données et les liaisons ; les techniques restent les mêmes.

Copiez la règle des lignes alternées

Les zébrures sont l’Arrière-plan du cadre de ligne du répéteur, et elles lisent rowIndex % 2 == 1 ? '#f8fafc' : '' — le numéro de ligne, pas un champ. Lire une valeur donne exactement le même résultat, jusqu’à ce que quelqu’un trie à nouveau le tableau.

Un test en cascade demande des parenthèses

a ? b : c ? d : e ne s’analyse pas. Écrivez row.status == 'Approved' ? '#059669' : (row.status == 'Rejected' ? '#be123c' : '#b45309'). Une expression qui ne peut pas être analysée laisse la propriété exactement telle que vous l’avez dessinée : le symptôme est donc une couleur qui ne change jamais plutôt qu’une erreur.

Générer avec l’IA​

Générer avec l’IA décrit une page en mots et la dessine. Décrivez ce que vous voulez — la zone est grande à dessein, une page qui vaut la peine d’être générée demande un paragraphe — et appuyez sur Générer, ou sur Ctrl/⌘+Entrée. Ce qui revient est ajouté à ce qui se trouve déjà sur le canevas ; rien de ce que vous avez dessiné n’est remplacé. Pour repartir de zéro, videz d’abord le canevas, puis générez.

Ce qui revient est vérifié avant que quoi que ce soit n’apparaisse — chaque forme doit être une forme que cet éditeur sait réellement construire — si bien qu’une réponse nommant une forme inexistante ne dépose pas de boîte cassée sur votre page.

Elle se corrige avant d’abandonner. Quand rien d’utilisable ne revient, la plateforme renvoie directement la réponse au modèle en nommant le problème, plutôt que de vous demander de corriger une erreur que vous n’avez jamais écrite. Elle essaie jusqu’à trois fois, et le bouton affiche Correction… tentative 2 sur 3 pendant ce temps.

Une réponse partiellement utilisable est conservée, pas jetée. Les formes qui ont pu être dessinées sont sur le canevas et la boîte de dialogue reste ouverte en listant ce qui a été laissé de côté — une réponse de dix formes dont deux étaient inutilisables arrive donc sous la forme de huit formes et de deux phrases, plutôt que de huit formes et d’un silence. Un résultat partiel dont on ne vous dit rien, c’est un résultat que vous interprétez comme si votre description avait demandé moins.

Vous décrivez la conception, et rien d’autre. Le modèle d’IA qui répond est configuré une fois pour toute la plateforme par un administrateur — il n’y a ni clé à coller ni fournisseur à choisir.

S’il n’y a pas de bouton IA, cette plateforme n’a pas d’IA configurée. Adressez-vous à un administrateur ; c’est un réglage du serveur, pas quelque chose qu’un créateur peut activer.

Les deux onglets de l’inspecteur​

Le panneau des propriétés, à droite, a deux onglets, qui répondent à deux questions différentes :

  • Graphique — ce que l’objet est : où il se trouve, sa taille, son remplissage, son contour, son texte.
  • Rapport — ce que l’objet signifie pour le rapport : que ce cadre est la page, ou une bande d’en-tête, ou un répéteur, et à quoi un texte ou une image est lié.

Un point sur l’onglet Rapport signifie que l’objet sélectionné fait déjà partie du rapport — la page, une bande, un texte lié — pour que vous le voyiez sans ouvrir l’onglet. L’onglet que vous laissez ouvert reste ouvert quand vous sélectionnez d’autres objets.

Certains objets n’ont rien à mettre dans l’onglet Rapport : seul un cadre peut être la page ou une bande, et seul un texte ou une image peut être lié à des données. L’onglet le dit plutôt que de s’ouvrir vide.

L’enregistrement fait deux choses à la fois, et c’est la partie qu’il vaut la peine de comprendre : il compile ce que vous avez dessiné en modèle imprimable, et il stocke votre dessin à côté. C’est pourquoi vous pouvez appuyer à nouveau sur Concevoir demain et retrouver votre mise en page plutôt qu’une reconstruction de celle-ci — le dessin est conservé, pas seulement son résultat.

Une seule conception de page, quel que soit le nombre de feuilles imprimées​

Une conception de page se pagine : le corps s’étend sur autant de feuilles que le contenu l’exige, et l’en-tête et le pied de page sont redessinés en haut et en bas de chacune. Une liste de factures de cent lignes, c’est une conception de page et quatre pages imprimées.

Plusieurs conceptions de page dans un rapport — les sections​

Dessinez un second cadre Page de rapport sur le canevas et vous obtenez une section : une couverture mise en page d’une façon, le corps d’une autre, les conditions générales au verso. Chaque cadre étiqueté comme page de rapport est une section, dans l’ordre où ils se trouvent sur le canevas, et chaque section commence sur sa propre feuille.

Chaque section a ses propres marges et ses propres en-tête, pied de page, en-tête de lettre et filigrane — une couverture sans en-tête ni numéro de page, et un corps qui a les deux, dans un même rapport. Une section vide n’imprime rien du tout plutôt qu’une feuille blanche.

Les numéros de page comptent tout le rapport, pas la section : la couverture est la page 1 sur n, où n compte aussi chaque feuille qu’occupent le corps et les conditions. Quelqu’un qui tient une page imprimée veut « 3 sur 9 ».

remarque

Chaque section s’imprime sur le même format de papier, celui du premier cadre de page. Une imprimante n’a qu’un bac : un rapport qui mélangerait A4 et A5 ne s’imprimerait correctement nulle part. Redimensionnez l’un des cadres et le concepteur le signale à l’enregistrement, puis imprime tout sur le papier du premier cadre. Les marges peuvent être modifiées section par section ; la feuille, non.

Une section signifie « à partir d’ici, la page change d’aspect ». Quand vous voulez seulement une nouvelle feuille avec la même conception, c’est l’option ci-dessous.

Faire commencer une zone sur une nouvelle page​

La pagination coupe une page quand le bloc suivant ne tient pas. Cela répond à « ne coupe pas cette ligne » ; cela ne peut pas répondre à « cette partie commence sur sa propre page », car cela n’a rien à voir avec la place restante.

Sélectionnez la zone — une bande, un répéteur, un conteneur de colonnes, un graphique — et cochez Commence sur une nouvelle page dans l’onglet Rapport de l’inspecteur. Le rapport passe à la page juste avant elle, que la page soit pleine ou non. Utilisez-le pour une série de demandes par client, ou partout où une nouvelle feuille est souhaitée avec la même conception de page. Quand la page elle-même doit changer d’aspect, dessinez un second cadre de page et utilisez plutôt une section.

Deux détails à connaître :

  • Cela ne laisse jamais de feuille blanche. Un saut en haut d’une page déjà vide ne fait rien : le cocher sur la première zone du rapport — ou sur deux zones consécutives — ne vous coûte pas de papier.
  • Sur une bande qui se répète comme en-tête de tableau, le saut se place avant l’en-tête, ce qui est ce que vous voulez : la nouvelle page s’ouvre sur les titres de colonnes, et les lignes suivent.

N’y recourez pas pour qu’une bande tombe bien — remplir une bande d’espace vide jusqu’à ce qu’elle déborde paraît juste aujourd’hui et se casse dès que les données changent. La case à cocher est la façon durable de le dire.

Répéter sur un jeu de données​

Un cadre répéteur dessine son contenu une fois par ligne. Étiquetez le cadre comme répéteur dans l’onglet Rapport de l’inspecteur, puis choisissez ce qu’il parcourt dans Répéter sur.

Répéter sur est une liste déroulante des jeux de données propres à ce rapport — rows, invoices — il n’y a donc aucun nom à retenir ni à mal orthographier. Si celui que vous voulez n’est pas dans la liste, ajoutez-le sous Modifier dans le panneau Rapports et il apparaîtra ici.

Une liste plutôt qu’une zone de saisie, à dessein : un répéteur parcourt un jeu de données entier, si bien que « lequel ? » a exactement autant de réponses que le rapport a de jeux de données. Restreindre les lignes — seulement les demandes approuvées, par exemple — relève du jeu de données lui-même, là où se trouve la requête et où chaque bande lisant ce jeu de données obtient la même réponse ; placez-le dans la zone d’un cadre, et la bande suivante aura besoin de sa propre copie.

Ce qu’affiche un texte ou une image​

Un texte ou une image à l’intérieur d’un répéteur est lié, et la liaison s’écrit dans le même éditeur que tout autre morceau de BS Lang de la plateforme : il complète ce que vous pouvez appeler, il montre ce qu’attend une fonction, et il souligne une erreur pendant que vous tapez plutôt que d’imprimer une cellule vide plus tard.

Dans l’onglet Rapport de l’inspecteur, Liaison est une liste déroulante des champs auxquels vous pouvez le lier, car c’est ce qu’est le plus souvent une liaison, et un nom que l’on choisit est un nom que l’on ne peut pas mal orthographier.

Tout ce qui dépasse un champ s’écrit sur la page de code : sélectionnez le texte et appuyez sur Écrire du code dans la barre d’outils (le bouton </>). La liste sur son côté commence par Ce qu’il affiche, la liaison, puis donne chaque propriété qui peut suivre les données (voir Un style issu des données, plus bas). L’éditeur laisse de la place pour travailler : complétion, ce que prend chaque fonction et un soulignement rouge sous une erreur pendant la saisie ; la liste marque chaque entrée Écrit ou Contient une erreur. C’est là que va concat('Page ', pageNumber, ' of ', pageCount). Le ✕ dans son coin vous ramène au dessin, et ce que vous avez écrit est enregistré avec lui quand vous appuyez sur Enregistrer.

Ouvrez l’œil pour voir ce que vous pouvez écrire. Chaque zone d’expression de la plateforme en porte un, et derrière se trouve tout ce que cette expression peut atteindre : Page (pageNumber, pageCount, page.rows), Ligne du répéteur (row, rowIndex, rows, rowCount), les colonnes du jeu de données que parcourt ce répéteur, les agrégats propres au rapport avec ce qu’attend chacun, et les fonctions propres au langage. Cherchez-y, cliquez sur une entrée, et elle est insérée à l’emplacement du curseur. Il est là parce que la complétion ne peut pas répondre à « qu’y a-t-il dans cette ligne ? » — la complétion vous dit ce qui vient ensuite une fois que vous avez commencé à taper, et l’œil vous dit ce qui existe avant même que vous ayez commencé.

Dans un répéteur, les colonnes s’écrivent row.<field> — row est un enregistrement d’un seul et même jeu de données, et un champ d’un autre jeu ne se résoudrait en rien. Hors d’un répéteur, il n’y a pas du tout de row : les mêmes champs sont donc désignés par leur jeu de données : rows[0].total.

Une colonne d’une table liée s’écrit sous le nom que la requête a donné à la jointure. Une requête enregistrée qui joint le client sous le nom customer propose ses colonnes comme row.customer.par_name et row.customer.par_credit_limit, et les fonctions de liste prennent le même nom entre guillemets : sum(rows, 'customer.par_credit_limit'). Renommez la jointure dans la requête, et les liaisons doivent suivre.

Et c’est une expression, pas seulement un nom de champ. row.amount * 1.2, row.status == 'Approved' ? 'Yes' : 'No', concat(row.first, ' ', row.last), sum(page.rows, 'amount') pour un total par page — le même langage qu’une règle métier, que les liaisons d’un écran et qu’un script de solution.

Où vous êtesCe qui est accessible
Une ligne d’un répéteurrow, rowIndex, rows, rowCount, et chaque jeu de données par son nom
Un en-tête ou un pied de pagepageNumber, pageCount, page.rows, page.rowCount
Partoutles jeux de données par leur nom, data, et les agrégats ci-dessous

Totaux, groupes et cumuls​

Un total de tableau se place dans une ligne de total. Dessinez une bande sous le répéteur et cochez Ligne de total pour le répéteur ci-dessus dans l’onglet Rapport. Elle est dessinée une fois après la dernière ligne et elle voit rows et rowCount pour tout le jeu de données — ainsi, sum(rows, 'amount') y donne le total du tableau.

C’est un chiffre différent d’un total de page, qui s’écrit sum(page.rows, 'amount') dans le pied de page et ne compte que les lignes tombées sur cette feuille. Les deux sont utiles ; choisissez en connaissance de cause.

Un cumul s’écrit sum(take(rows, rowIndex + 1), 'amount') dans la ligne elle-même — toutes les lignes jusqu’à celle-ci incluse.

Le regroupement est l’affaire du jeu de données. Enregistrez une requête qui regroupe — une ligne par statut, avec un nombre et un total (voir Enregistrer une requête) —, ajoutez-la au rapport comme second jeu de données sous Jeux de données, et répétez dessus comme sur n’importe quel autre : chaque ligne dessinée est un groupe, déjà compté et totalisé, et une ligne de total en dessous additionne les groupes. Un répéteur ne peut pas se trouver dans la ligne d’un autre répéteur ; un rapport ne liste donc pas les lignes propres à chaque groupe sous un titre de groupe.

Atteindre un second jeu de données s’écrit lookup(regions, 'code', row.region).manager — la première ligne dont la colonne correspond, pour que vous puissiez imprimer un nom que votre propre requête n’a pas récupéré.

Un style issu des données​

Sélectionnez une bande, une cellule ou une forme, appuyez sur Écrire du code et choisissez une propriété dans la liste sous Propriétés : chacune accepte une expression, évaluée pour chaque ligne :

PropriétéExemple
Arrière-planrow.amount > 1000 ? '#fee2e2' : ''
Couleur du texterow.overdue ? '#b91c1c' : ''
Graisse de policerow.isTotal ? '700' : ''
Affiché quandrow.note != ''

Vide signifie « laisse-le tel que je l’ai dessiné » — c’est pourquoi les exemples ont un simple '' de l’autre côté au lieu de répéter votre propre couleur, et pourquoi activer cette option ne peut jamais vider un rapport qui fonctionnait. Affiché quand est l’exception : une réponse fausse retire complètement l’élément, arrière-plan et bordure compris, ce que lier un texte à '' ne pourrait jamais faire.

Pour colorer toute une ligne, réglez l’Arrière-plan sur le cadre de ligne du répéteur plutôt que sur une cellule à l’intérieur.

Les agrégats : sum · count · avg · min · max · pluck · round · abs · upper · lower · concat · ifEmpty · format. Chacun prend une liste et, s’il en a besoin, la colonne à lire : sum(claims, 'par_amount').

Les fonctions de liste : where · exclude · take · skip · sortBy · groupBy · lookup · distinct. Chacune nomme une colonne, jamais une condition — where(claims, 'status', 'Approved'), et non where(claims, row.status == 'Approved'). C’est une vraie limite plutôt qu’une question de style : une fonction reçoit ses arguments déjà évalués, si bien qu’une condition serait évaluée une fois au lieu d’une fois par ligne.

pluck est celle qui répond par une liste plutôt que par une valeur unique, et c’est à elle qu’est lié un graphique. Un graphique veut une série, et un jeu de données, ce sont des lignes : pluck(revenue, 'amount') lui donne donc les montants et pluck(revenue, 'month') les libellés correspondants, tous deux issus du même jeu de données pour qu’ils ne puissent pas se décaler d’une ligne.

Un graphique​

Insérer → Graphique en barres ou Graphique en courbes place un graphique sur la page, sous le milieu de votre vue : un cadre dans lequel dessine le moteur de rapports, avec un titre. Il n’y a rien à y dessiner à la main — l’échelle, les graduations et les étiquettes sont calculées à partir des données à chaque exécution du rapport. Sur un écran, le même menu propose d’autres types, sous forme de dessins ; un rapport propose les deux qu’il sait imprimer.

Sélectionnez le cadre, appuyez sur Écrire du code et renseignez Valeurs du graphique et Étiquettes du graphique, toutes deux avec pluck pour qu’elles sortent d’un même jeu de données, dans le même ordre : pluck(bystatus, 'total') et pluck(bystatus, 'par_status'). Barres ou courbe, et la couleur, se règlent dans l’onglet Rapport. L’aperçu et la page imprimée dessinent le même graphique.

Un graphique qui ne tient pas sous ce qui le précède passe à la feuille suivante, comme tout autre bloc.

Codes-barres et QR codes​

Insérer → Code-barres ou Insérer → Code QR place un vrai code, lisible par un scanner, dans le cadre situé au milieu de votre vue : déposé sur un en-tête de page, il s’imprime sur chaque feuille. Dans l’onglet Rapport, réglez sa Valeur, sa Zone de silence (la marge blanche dont un scanner a besoin) et soit Imprimer la valeur sous les barres (Code 128), soit Correction d’erreurs (QR). Code 128 contient de l’ASCII imprimable ; un QR code contient n’importe quel texte, y compris un lien.

Pour un code différent à chaque ligne, sélectionnez-le dans le répéteur, appuyez sur Écrire du code et renseignez Valeur du code-barres : row.par_reference. Le canevas dessine la valeur fixe, car un canevas n’a pas de lignes.

Papier et orientation​

La taille du cadre de page est le papier, en points (72 par pouce) : 595 × 842, c’est l’A4. Pour changer le papier d’une page, saisissez sa L et sa H ; les formats Papier du menu Cadre dessinent un nouveau cadre.

Pour le paysage, dites d’abord aux bandes de suivre le papier : réglez la contrainte Horizontale de chaque bande sur Gauche et droite, et tout ce qui est collé à son bord droit sur Droite. Passez ensuite la page à 842 × 595.

Marge, dans l’onglet Rapport de la page, est l’espace laissé libre en haut et en bas de chaque feuille. Dans la largeur, tout s’imprime là où vous l’avez dessiné. Imprimer / PDF imprime chaque page sur une feuille exactement de la taille de la page, si bien que le navigateur n’a aucune marge où placer son propre en-tête et son pied de page.

Un rapport en persan ou en arabe​

Tapez les mots et le concepteur passe le texte de droite à gauche. Un texte dont les mots sont persans, arabes ou hébreux passe en De droite à gauche, aligné à droite, dès que vous avez fini de taper, et la page l’imprime ainsi : un point ou un nombre en fin de ligne reste à sa fin. Un texte lié n’a pas de mots dont le déduire ; choisissez donc De droite à gauche vous-même dans l’onglet Graphique, à côté des boutons d’alignement. Disposez les colonnes depuis la droite, comme un lecteur persan les lit.

Les chiffres et le calendrier sont ceux du lecteur. Un texte dont le Format est number ou date s’écrit dans la langue et le calendrier de qui ouvre le rapport : des chiffres persans pour un lecteur qui travaille en persan, et une date jalali pour celui dont Paramètres d’apparence → Calendrier est Persan. L’Aperçu du concepteur suit vos propres paramètres, l’application ceux de chaque lecteur, et le même rapport imprime 7,890.50 pour l’un et ۷٬۸۹۰٫۵۰ pour l’autre.

Un nombre dans concat s’écrit tel qu’il est stocké ; donnez-lui donc son propre format : concat('صفحهٔ ', format(pageNumber, 'integer'), ' از ', format(pageCount, 'integer')).

Aperçu d’un rapport imprimé pour un enregistrement​

Quand le premier jeu de données a un champ d’enregistrement, le rapport s’imprime depuis un enregistrement, et l’aperçu le montre ainsi : il prend la première ligne du premier jeu de données comme enregistrement et restreint à celui-ci chaque jeu de données doté d’un champ d’enregistrement. Une facture s’affiche comme la première facture avec ses propres lignes, pas celles de toutes.

Un rapport dont vous avez chargé le modèle​

Les rapports créés en collant un modèle n’ont aucun dessin derrière eux. Appuyer sur Concevoir sur l’un d’eux ouvre un canevas vide plutôt que d’essayer de reconstruire la mise en page à partir du modèle.

C’est voulu. Un modèle enregistre des bandes, des répéteurs et des liaisons — pas les cadres, repères et styles que vous avez disposés pour y parvenir — si bien que tout ce que la plateforme en tirerait serait une supposition, et enregistrer cette supposition remplacerait votre vrai modèle par elle. Si vous voulez un rapport chargé sur le canevas, mettez-le en page une fois et enregistrez ; à partir de là, l’aller-retour fonctionne.

L’inverse est sans risque : modifier les jeux de données d’un rapport conçu depuis le panneau Rapports laisse son dessin intact.

L’enregistrement, et où il va​

Il y a exactement un bouton Enregistrer, et il se trouve dans la barre de titre en haut de l’écran — au même endroit que sur tous les autres écrans du produit. Il écrit le rapport en tant que composant de solution : en couches, appartenant à votre solution, validé et prêt à être exporté.

Le menu Fichier propre au concepteur n’est pas affiché ici. En mode autonome, ce menu enregistre un fichier JSON sur votre disque ; au sein de la plateforme, ce serait une seconde commande qui semblerait avoir stocké votre travail sans l’avoir fait. L’export (PNG, SVG) reste disponible, car l’image d’un rapport est utile dans tous les cas.

Le déplacer entre environnements​

Rien ne change : le rapport est un composant de solution et voyage comme il l’a toujours fait, avec son modèle à l’intérieur. Votre dessin voyage aussi avec lui : la personne qui l’importe peut appuyer sur Concevoir et poursuivre votre mise en page plutôt que de recommencer.

Dépannage​

  • « Cette conception n’a pas encore de page de rapport. » — vous avez dessiné sur le canevas, mais pas dans une page de rapport. Utilisez Insérer → Page de rapport et placez-y votre contenu ; c’est le cadre de page qui indique au compilateur où commence le rapport.
  • Enregistrer est grisé. — rien n’a changé depuis l’ouverture. Dessinez d’abord quelque chose.
  • Le rapport s’imprime mais la page est vide. — le répéteur ne pointe vers aucun jeu de données. Ouvrez Répéter sur : la liste contient chaque jeu de données dont dispose réellement ce rapport. Choisissez-en un, ou ajoutez le jeu de données manquant sous Modifier puis choisissez-le.
  • « Chaque cadre de page est une section de ce rapport, mais ils doivent tous avoir la même taille… » — l’un de vos cadres Page de rapport n’a pas la même taille que le premier. Redimensionnez-le pour qu’il corresponde ; tout s’imprime sur le papier du premier cadre tant que vous ne l’avez pas fait. Voir Plusieurs conceptions de page dans un rapport, plus haut.
  • Ma mise en page est revenue différente. — vous êtes sur un rapport dont le modèle a été chargé plutôt que conçu. Voir Un rapport dont vous avez chargé le modèle, plus haut.
  • Une cellule est vide alors que le reste du rapport est correct. — sa liaison n’a pas pu s’exécuter. Ouvrez-la : l’éditeur souligne la partie qu’il n’a pas comprise. Une liaison qui échoue laisse un blanc à dessein plutôt que d’entraîner la page dans sa chute.
  • rows.length indique 'length' is a method — write length() to call it. C’est une méthode en BS Lang, elle a donc besoin de ses parenthèses : rows.length(). count(rows) se lit de toute façon mieux dans un rapport. (Elle renvoyait autrefois toute la liste au lieu du nombre, sans rien dire. Ce n’est plus le cas.)
  • sum est souligné en rouge. — vérifiez l’orthographe par rapport à la liste ci-dessus. L’éditeur connaît les agrégats propres au rapport et rien d’autre ; une fonction que la plateforme n’a pas est une fonction que rien n’appellera.
  • Une liaison écrite avant cette version ne fonctionne plus. — les expressions de rapport sont désormais en BS Lang, le même langage que partout ailleurs dans la plateforme. Presque tout se reprend tel quel — chemins de champ, arithmétique, comparaisons, ?:, les agrégats — mais une expression qui s’appuyait sur une tolérance de l’ancien évaluateur mérite d’être rouverte, car l’éditeur vous le signalera désormais.

Scénarios associés​