Een rapport ontwerpen
Doel
Een rapport binnen het platform opmaken — op een canvas, naast de query's die het vullen — in plaats van het in een aparte tool te tekenen en JSON terug te plakken.
Waar het opent
Open je oplossing, kies Rapporten, selecteer een rapport en druk op Ontwerpen. Het canvas opent ter plekke, onder hetzelfde kruimelpad en dezelfde omgevings- en oplossingskiezer waarin je al werkte. Het is geen tweede applicatie en geen nieuw tabblad: een rapport ontwerpen is makerwerk, en dit is het makerportaal.
Ontwerpen en Bewerken zijn twee opdrachten omdat ze elk een andere helft beheren:
- Ontwerpen is de opmaak — de pagina, de banden, de tabellen, het logo.
- Bewerken is alles wat een canvas niet kan weten — welke opgeslagen query's het sjabloon vullen, en welk veld elk daarvan beperkt wanneer iemand één record afdrukt.
Bij de meeste rapporten gebruik je beide, en geen van beide overschrijft de helft van de ander.
Vereisten
- Je bent aangemeld als maker, met een oplossing en een omgeving geselecteerd.
- Het rapport bestaat al. Maak het eerst — zie Een rapport maken — en ontwerp het daarna.
Stappen
- Open je oplossing en kies Rapporten.
- Selecteer het rapport en druk op Ontwerpen.
- Is het rapport nog nooit ontworpen, dan opent het canvas met alleen het bord Styles — de kleuren en tekststijlen waarmee een ontwerp begint, die nooit worden afgedrukt. Gebruik Invoegen → Rapportpagina om een pagina neer te zetten, en maak je inhoud daarbinnen op.
- Teken het rapport: banden voor de kop- en voettekst, een repeater voor de rijen, tekst die is gekoppeld aan de velden van je dataset. Het palet en het lagenpaneel werken zoals altijd; de inspector heeft nu twee tabbladen — zie hieronder.
- Druk op Opslaan.
Beginnen met een voorbeeld
Invoegen → Voorbeeldrapporten zet een afgewerkte rapportpagina op het canvas naast wat je al hebt getekend — er wordt niets vervangen — en laadt de voorbeeldgegevens in de editor voor rapportgegevens, zodat er meteen een voorbeeld te zien is.
De lijst heeft twee helften, en die beantwoorden verschillende vragen.
De eerste vijf zijn afgewerkte documenten — Factuur, Verkoop, Contactenlijst, Samenvatting, Dashboard — en die zijn er om te laten zien hoe een rapport eruit kan zien.
De volgende vier laten elk één functie zien, en dat wil je wanneer je het effect kent dat je zoekt maar niet het handgebaar. Elk heeft een regel in de eigen paginavoettekst die zegt waar je moet kijken:
| Voorbeeld | Laat zien |
|---|---|
| Opmaak (zebra + voorwaardelijke opmaak) | Afwisselend gekleurde rijen, een kleur en dikte die boven een drempel veranderen, een statuskleur, en een markering die alleen verschijnt op de rijen waarop ze van toepassing is |
| Watermerk | Een stempel CONCEPT over elke pagina, en een documentbeheerblok in de hoek |
| Herhalende kop- en voettekst | Een briefhoofd en een voettekst op elk vel, kolomkoppen die terugkomen waar de tabel verdergaat, en een subtotaal per vel naast een totaal voor de hele tabel |
| Grafieken | Een staafdiagram en een lijndiagram, met daaronder een tabel die dezelfde dataset leest |
Open er een, selecteer een band of een cel, en lees de expressies in de inspector of op de pagina Code. Het zijn gewone tekeningen — bewerk ze, houd de helft die je wilde en verwijder de rest.
Hun cellen lezen row.par_name, row.par_amount, row.par_currency en row.par_status — de
kolommen van de voorbeeldtabel expenses — in plaats van verzonnen namen. Daardoor kan dezelfde
tekening worden geïnstalleerd als een werkend rapport met echte rijen erachter, in plaats van een
mooi voorbeeld dat leeg wordt afgedrukt. Laat ze naar je eigen tabel wijzen door de dataset en de
koppelingen te bewerken; de technieken blijven hetzelfde.
Zebrastrepen zijn Achtergrond op het rijframe van de repeater, en dat leest
rowIndex % 2 == 1 ? '#f8fafc' : '' — het rijnummer, geen veld. Een waarde lezen ziet er precies
hetzelfde uit, totdat iemand de tabel anders sorteert.
a ? b : c ? d : e wordt niet geparseerd. Schrijf
row.status == 'Approved' ? '#059669' : (row.status == 'Rejected' ? '#be123c' : '#b45309').
Een expressie die niet kan worden geparseerd, laat de eigenschap precies zoals je haar tekende, dus
het symptoom is een kleur die nooit verandert in plaats van een foutmelding.
Genereren met AI
Genereren met AI beschrijft een pagina in woorden en tekent haar. Beschrijf wat je wilt — het vak is bewust groot, een pagina die het genereren waard is, kost een alinea — en druk op Genereren, of Ctrl/⌘+Enter. Wat terugkomt, wordt toegevoegd aan wat al op het canvas staat; niets wat je hebt getekend, wordt vervangen. Wil je opnieuw beginnen, maak dan eerst het canvas leeg en genereer daarna.
Wat terugkomt, wordt gecontroleerd voordat er iets verschijnt — elke vorm moet er een zijn die deze editor echt kan bouwen — dus een antwoord dat een niet-bestaande vorm noemt, zet geen kapot vak op je pagina.
Het corrigeert zichzelf voordat het opgeeft. Komt er niets bruikbaars terug, dan stuurt het platform het antwoord meteen terug naar het model met het probleem erbij, in plaats van jou te vragen een fout op te lossen die je nooit hebt geschreven. Het probeert het tot drie keer, en de knop toont intussen Bezig met corrigeren… poging 2 van 3.
Een gedeeltelijk bruikbaar antwoord wordt bewaard, niet weggegooid. De vormen die konden worden getekend, staan op het canvas, en het dialoogvenster blijft open met een lijst van wat is weggelaten — dus een antwoord van tien vormen waarvan er twee onbruikbaar waren, komt aan als acht vormen en twee zinnen, in plaats van acht vormen en stilte. Een gedeeltelijk resultaat waarover je niets wordt verteld, lees je alsof je eigen beschrijving om minder vroeg.
Een gegenereerd rapport is sober, tenzij je om kleur vraagt: donkere tekst op wit, een lichtgrijze kopbalk voor een tabel, rechte hoeken. Zeg "in onze huiskleuren" of "met een gekleurde kop" voor meer.
Voeg eerst de dataset toe. De AI krijgt de datasets van dit ontwerp te horen, met de velden van elke rij. Een rapport dat je genereert nadat je een dataset hebt toegevoegd, herhaalt daarover en toont de echte velden. Genereer je het eerder, dan moet de AI de naam van een dataset raden, en het venster zegt welke naam het raadde.
Jij beschrijft het ontwerp, en verder niets. Welk AI-model antwoordt, wordt één keer voor het hele platform door een beheerder ingesteld — er is geen sleutel om te plakken en geen provider om te kiezen.
Is er geen AI-knop, dan heeft dit platform geen AI ingesteld. Vraag het een beheerder; het is een instelling op de server, niet iets wat een maker kan inschakelen.
De twee tabbladen van de inspector
Het eigenschappenpaneel rechts heeft twee tabbladen, en die beantwoorden twee verschillende vragen:
- Grafisch — wat het object is: waar het staat, hoe groot het is, de vulling, de lijn, de tekst.
- Rapport — wat het object voor het rapport betekent: dat dit frame de pagina is, of een kopband, of een repeater, en waaraan een tekst of een afbeelding is gekoppeld.
Een stip op het tabblad Rapport betekent dat het geselecteerde object al deel uitmaakt van het rapport — de pagina, een band, een gekoppelde tekst — zodat je dat ziet zonder het tabblad te openen. Welk tabblad je ook open laat, het blijft open terwijl je andere objecten selecteert.
Sommige objecten hebben niets voor het tabblad Rapport: alleen een frame kan de pagina of een band zijn, en alleen een tekst of een afbeelding kan aan gegevens worden gekoppeld. Het tabblad zegt dat, in plaats van leeg te openen.
Opslaan doet twee dingen tegelijk, en dit is het deel dat de moeite waard is om te begrijpen: het compileert wat je hebt getekend tot het sjabloon dat wordt afgedrukt, en het slaat je tekening ernaast op. Daarom kun je morgen opnieuw op Ontwerpen drukken en je opmaak terugkrijgen in plaats van een reconstructie ervan — de tekening wordt bewaard, niet alleen het resultaat.
Eén paginaontwerp, hoeveel vellen het ook afdrukt
Een paginaontwerp pagineert: de hoofdtekst loopt door over zoveel vellen als de inhoud nodig heeft, en de paginakop en paginavoet worden boven- en onderaan elk vel opnieuw getekend. Een factuurlijst van honderd rijen is één paginaontwerp en vier afgedrukte pagina's.
Meerdere paginaontwerpen in één rapport — secties
Teken een tweede frame Rapportpagina op het canvas en je krijgt een sectie: een voorblad dat op de ene manier is opgemaakt, de hoofdtekst op een andere, de algemene voorwaarden op de achterkant. Elk frame dat als rapportpagina is gemarkeerd, is één sectie, in de volgorde waarin ze op het canvas staan, en elke sectie begint op een eigen vel.
Elke sectie heeft eigen marges en een eigen paginakop, paginavoet, briefhoofd en watermerk — een voorblad zonder kop en zonder paginanummer, en een hoofdtekst met beide, in één rapport. Een sectie waar niets in staat, drukt helemaal niets af in plaats van een leeg vel.
De paginanummers tellen het hele rapport, niet de sectie: het voorblad is pagina 1 van n, waarbij n ook elk vel meetelt dat de hoofdtekst en de voorwaarden innemen. Wie een afgedrukte pagina in handen heeft, wil "3 van 9".
Elke sectie wordt op hetzelfde papierformaat afgedrukt, genomen van het eerste paginaframe. Een printer heeft één lade, dus een rapport dat A4 en A5 mengde, zou nergens correct worden afgedrukt. Wijzig de grootte van een van de frames en de designer meldt dat bij het opslaan, en drukt dan alles af op het papier van het eerste frame. Marges mag je per sectie wijzigen; het vel niet.
Een sectie is "vanaf hier ziet de pagina er anders uit". Wil je alleen een nieuw vel met hetzelfde ontwerp, dan is dat de markering hieronder.
Een gebied op een nieuwe pagina laten beginnen
Paginering breekt een pagina af als het volgende blok niet meer past. Dat beantwoordt "splits deze rij niet"; het kan niet beantwoorden "dit deel begint op een eigen pagina", want dat heeft niets te maken met hoeveel ruimte er nog over is.
Selecteer het gebied — een band, een repeater, een kolommencontainer, een grafiek — en vink Begint op een nieuwe pagina aan op het tabblad Rapport van de inspector. Het rapport breekt direct ervoor af, of de pagina nu vol is of niet. Gebruik het voor een reeks declaraties per klant, of overal waar een nieuw vel gewenst is met hetzelfde paginaontwerp. Moet de pagina zelf er anders uitzien, teken dan een tweede paginaframe en gebruik een sectie.
Twee details om te weten:
- Het laat nooit een leeg vel achter. Een afbreking bovenaan een pagina die al leeg is, doet niets, dus het aanvinken op het eerste gebied van het rapport — of op twee gebieden achter elkaar — kost je geen papier.
- Op een band die zich herhaalt als tabelkop valt de afbreking vóór de kop, en dat is wat je wilt: de nieuwe pagina opent met de kolomkoppen en de rijen volgen.
Gebruik het niet om een band netjes te laten uitvallen — een band opvullen met lege ruimte tot hij overloopt, ziet er vandaag goed uit en gaat mis zodra de gegevens veranderen. Het vinkje is de duurzame manier om het te zeggen.
Herhalen over een dataset
Een repeater-frame tekent zijn inhoud één keer per rij. Markeer het frame als repeater op het tabblad Rapport van de inspector en kies dan bij Herhalen over wat hij doorloopt.
Herhalen over is een vervolgkeuzelijst met de eigen datasets van dit rapport — rows,
invoices — dus er is geen naam om te onthouden en geen om verkeerd te spellen. Staat de gewenste
dataset er niet tussen, voeg hem dan toe onder Bewerken in het paneel Rapporten en hij verschijnt
hier.
Bewust een lijst en geen vak om in te typen: een repeater doorloopt een hele dataset, dus "welke" heeft precies zoveel antwoorden als het rapport datasets heeft. De rijen beperken — alleen de goedgekeurde declaraties, bijvoorbeeld — hoort thuis in de dataset zelf, waar de query staat en waar elke band die de dataset leest hetzelfde antwoord krijgt; zet je het in het vak van één frame, dan heeft de volgende band een eigen kopie nodig.
Wat een tekst of afbeelding toont
Een tekst of afbeelding binnen een repeater is gekoppeld, en de koppeling wordt geschreven in dezelfde editor als elk ander stuk BS Lang in het platform: hij vult aan wat je kunt aanroepen, toont wat een functie verwacht, en onderstreept een fout terwijl je typt in plaats van later een lege cel af te drukken.
Op het tabblad Rapport van de inspector is Koppeling een vervolgkeuzelijst met de velden waaraan je kunt koppelen, want dat is wat een koppeling meestal is, en een naam die je kiest is een naam die je niet verkeerd kunt spellen.
Alles wat meer is dan een veld schrijf je op de codepagina: selecteer de tekst en druk op
Code schrijven in de werkbalk (de knop </>). De lijst aan de zijkant begint met Wat het
toont, de koppeling, en gaat verder met elke eigenschap die de gegevens kan volgen (zie Opmaak die
uit de gegevens komt, hieronder). De editor heeft ruimte om in te werken: aanvulling, wat elke
functie verwacht en een rode onderstreping onder een fout terwijl je typt; de lijst markeert elk
item als Geschreven of Bevat een fout. Daar hoort concat('Page ', pageNumber, ' of ', pageCount).
Het ✕ in de hoek brengt je terug naar de tekening, en wat je schreef wordt ermee opgeslagen als je op
Opslaan drukt.
Open het oog om te zien wat je kunt schrijven. Elk expressievak in het platform heeft er een, en
daarachter staat alles wat deze expressie kan bereiken: Pagina (pageNumber, pageCount,
page.rows), Repeaterrij (row, rowIndex, rows, rowCount), de kolommen van de dataset die
deze repeater doorloopt, de eigen aggregaties van het rapport met wat elk ervan verwacht, en de eigen
functies van de taal. Doorzoek het, klik op een item en het wordt ingevoegd waar je cursor staat. Het is
er omdat aanvulling niet kan beantwoorden "wat zit er in deze rij?" — aanvulling zegt wat er volgt
zodra je bent begonnen met typen, en het oog zegt wat er is voordat je begint.
Binnen een repeater worden de kolommen geschreven als row.<field> — row is een record van precies
één dataset, en een veld uit een andere zou naar niets verwijzen. Buiten een repeater bestaat row
helemaal niet, dus worden dezelfde velden via hun dataset aangesproken: rows[0].total.
Een kolom uit een gerelateerde tabel wordt geschreven onder de naam die de query de koppeling gaf.
Een opgeslagen query die de klant koppelt als customer biedt zijn kolommen aan als
row.customer.par_name en row.customer.par_credit_limit, en de lijstfuncties nemen dezelfde naam
tussen aanhalingstekens: sum(rows, 'customer.par_credit_limit'). Hernoem de koppeling in de query
en de bindingen moeten volgen.
En het is een expressie, niet alleen een veldnaam. row.amount * 1.2,
row.status == 'Approved' ? 'Yes' : 'No', concat(row.first, ' ', row.last),
sum(page.rows, 'amount') voor een totaal per pagina — dezelfde taal als een bedrijfsregel, de
koppelingen van een scherm en een oplossingsscript.
| Waar je bent | Wat er beschikbaar is |
|---|---|
| Een rij van een repeater | row, rowIndex, rows, rowCount, en elke dataset op naam |
| Een paginakop of -voet | pageNumber, pageCount, page.rows, page.rowCount |
| Overal | de datasets op naam, data, en de aggregaties hieronder |
Totalen, groepen en lopende sommen
Een tabeltotaal hoort in een totaalrij. Teken een band onder de repeater en vink Totaalrij voor
de repeater hierboven aan op het tabblad Rapport. Hij wordt één keer getekend na de laatste rij en ziet
rows en rowCount voor de hele dataset — dus sum(rows, 'amount') is daar het totaal van de
tabel.
Dat is een ander getal dan een paginatotaal, dat is sum(page.rows, 'amount') in de paginavoet en
telt alleen de rijen die op dat vel zijn beland. Beide zijn nuttig; kies bewust.
Een lopend totaal is sum(take(rows, rowIndex + 1), 'amount') in de rij zelf — elke rij tot en met
deze.
Groeperen is de taak van de dataset. Sla een query op die groepeert — één rij per status, met een aantal en een totaal (zie Een query opslaan) — voeg die onder Datasets als tweede dataset aan het rapport toe en herhaal erover zoals over elke andere: elke rij die het tekent is één groep, al geteld en opgeteld, en een totaalrij eronder telt de groepen op. Een repeater kan niet in de rij van een andere repeater staan, dus een rapport zet de eigen rijen van elke groep niet onder een kop voor die groep.
Een tweede dataset bereiken is lookup(regions, 'code', row.region).manager — de eerste rij waarvan
de kolom overeenkomt, zodat je een naam kunt afdrukken die je eigen query niet heeft opgehaald.
Opmaak die uit de gegevens komt
Selecteer een band, cel of vorm, druk op Code schrijven en kies een eigenschap uit de lijst onder Eigenschappen: elke eigenschap krijgt een expressie, die per rij wordt beantwoord:
| Eigenschap | Voorbeeld |
|---|---|
| Achtergrond | row.amount > 1000 ? '#fee2e2' : '' |
| Tekstkleur | row.overdue ? '#b91c1c' : '' |
| Tekstdikte | row.isTotal ? '700' : '' |
| Tonen wanneer | row.note != '' |
Leeg betekent "laat het zoals ik het tekende" — daarom hebben de voorbeelden een kale '' aan de
andere kant in plaats van je eigen kleur te herhalen, en daarom kan het aanzetten hiervan nooit een
rapport leegmaken dat in orde was. Tonen wanneer is de uitzondering: een onwaar antwoord verwijdert
het element volledig, inclusief achtergrond en rand, en dat kon tekst koppelen aan '' nooit.
Wil je een hele rij kleuren, stel dan Achtergrond in op het rijframe van de repeater in plaats van op een cel erin.
De aggregaties: sum · count · avg · min · max · pluck · round · abs · upper ·
lower · concat · ifEmpty · format. Elk neemt een lijst en, waar nodig, de kolom om te lezen:
sum(claims, 'par_amount').
De lijstfuncties: where · exclude · take · skip · sortBy · groupBy · lookup ·
distinct. Elk ervan noemt een kolom, nooit een voorwaarde —
where(claims, 'status', 'Approved'), niet where(claims, row.status == 'Approved'). Dat is een echte
beperking, geen stijlkwestie: een functie krijgt haar argumenten al uitgerekend aangereikt, dus een
voorwaarde zou één keer worden beantwoord in plaats van één keer per rij.
pluck is degene die antwoordt met een lijst in plaats van één waarde, en daaraan wordt een
grafiek gekoppeld. Een grafiek wil een reeks, en een dataset bestaat uit rijen — dus
pluck(revenue, 'amount') geeft de bedragen en pluck(revenue, 'month') de labels ernaast, allebei uit
dezelfde dataset, zodat ze niet een rij uit de pas kunnen raken.
Een grafiek
Invoegen → Staafdiagram of Lijndiagram zet een grafiek op de pagina onder het midden van je weergave: een kader waarin de rapportengine tekent, met een titel. Er valt niets met de hand in te tekenen — de schaal, de maatstreepjes en de labels worden bij elke uitvoering van het rapport uit de gegevens bepaald. Op een scherm biedt hetzelfde menu meer soorten aan, als tekeningen; een rapport biedt de twee die het kan afdrukken.
Selecteer het kader, druk op Code schrijven en vul Grafiekwaarden en Grafieklabels in,
allebei met pluck, zodat ze gelijk opgaan uit één dataset: pluck(bystatus, 'total') en
pluck(bystatus, 'par_status'). Staaf of lijn, en de kleur, staan op het tabblad Rapport. De
voorbeeldweergave en de afgedrukte pagina tekenen dezelfde grafiek.
Een grafiek die niet meer onder het voorgaande past, schuift door naar het volgende vel, net als elk ander blok.
Barcodes en QR-codes
Invoegen → Streepjescode of Invoegen → QR-code zet een echte, scanbare code in het frame midden in je beeld: zet je hem in een paginakoptekst, dan wordt hij op elk vel afgedrukt. Stel op het tabblad Rapport de Waarde in, de Witmarge (de lege rand die een scanner nodig heeft) en ofwel De waarde onder de streepjes afdrukken (Code 128), ofwel Foutcorrectie (QR). Code 128 bevat afdrukbare ASCII; een QR-code bevat elke tekst, ook een link.
Voor een code die op elke rij anders is, selecteer je hem in de herhaler, druk je op Code
schrijven en vul je Barcodewaarde in: row.par_reference. Het canvas tekent de vaste waarde,
omdat een canvas geen rijen heeft.
Papier en afdrukstand
De grootte van het paginaframe is het papier, in punten (72 per inch): 595 × 842 is A4. Om het papier van een pagina te wijzigen, typ je de B en H; de Papier-formaten in het menu Frame tekenen een nieuw frame.
Voor liggend vertel je de banden eerst dat ze het papier volgen: zet de horizontale beperking van elke band op Links en rechts, en alles wat tegen de rechterrand staat op Rechts. Maak de pagina daarna 842 × 595.
Marge, op het tabblad Rapport van de pagina, is de ruimte die boven en onder op elk vel vrij blijft. In de breedte wordt alles afgedrukt waar je het tekende. Afdrukken / PDF drukt elke pagina af op een vel van precies de grootte van de pagina, zodat de browser geen marge heeft voor zijn eigen kop- en voettekst.
Een rapport in het Perzisch of Arabisch
Typ de woorden en de ontwerper zet de tekst van rechts naar links. Een tekst met Perzische, Arabische of Hebreeuwse woorden wordt bij het afronden van het typen op Van rechts naar links gezet en rechts uitgelijnd, en de pagina drukt hem zo af: een punt of een getal aan het eind van een regel blijft aan het eind. Een gebonden tekst heeft geen woorden om dat aan af te lezen, dus zet Van rechts naar links zelf op het tabblad Grafisch, naast de uitlijningsknoppen. Leg de kolommen van rechts aan, zoals een Perzische lezer leest.
De cijfers en de kalender zijn van de lezer. Een tekst met Opmaak number of date wordt
geschreven in de taal en de kalender van wie het rapport opent: Perzische cijfers voor een lezer die in
het Perzisch werkt, en een Jalali-datum voor wie bij Weergave-instellingen → Kalender Perzisch heeft
gekozen. Het Voorbeeld in de ontwerper volgt uw eigen instellingen, de app die van elke lezer, en
hetzelfde rapport drukt 7,890.50 voor de een en ۷٬۸۹۰٫۵۰ voor de ander.
Een getal binnen concat wordt geschreven zoals het is opgeslagen, dus geef het een eigen opmaak:
concat('صفحهٔ ', format(pageNumber, 'integer'), ' از ', format(pageCount, 'integer')).
Voorbeeld van een rapport dat voor één record wordt afgedrukt
Heeft de eerste gegevensset een recordveld, dan wordt het rapport vanuit één record afgedrukt, en het voorbeeld toont het ook zo: het neemt de eerste rij van de eerste gegevensset als record en beperkt elke gegevensset met een recordveld daartoe. Een factuur verschijnt als de eerste factuur met haar eigen regels, niet met die van alle facturen.
Een rapport waarvoor je een sjabloon hebt geüpload
Rapporten die zijn gemaakt door een sjabloon te plakken, hebben geen tekening erachter. Druk je op zo'n rapport op Ontwerpen, dan opent een leeg canvas in plaats van een poging om de opmaak uit het sjabloon te herbouwen.
Dat is bewust. Een sjabloon legt banden, repeaters en koppelingen vast — niet de frames, hulplijnen en stijlen die je hebt geschikt om daar te komen — dus alles wat het platform eruit zou tekenen, zou een gok zijn, en die gok opslaan zou je echte sjabloon vervangen door de gok. Wil je een geüpload rapport op het canvas, maak het dan één keer op en sla het op; vanaf dan gaat het heen en terug.
Andersom is het veilig: de datasets van een ontworpen rapport bewerken via het paneel Rapporten laat de tekening ongemoeid.
Opslaan, en waar het heen gaat
Er is precies één Opslaan, en die staat in de titelbalk bovenaan het scherm — op dezelfde plek als op elk ander scherm van het product. Het schrijft het rapport weg als oplossingsonderdeel: gelaagd, van je oplossing, gevalideerd en klaar om te exporteren.
Het eigen menu Bestand van de designer wordt hier niet getoond. Los gebruikt slaat dat menu een JSON-bestand op je schijf op; binnen het platform zou dat een tweede opdracht zijn die eruitziet alsof je werk is opgeslagen, terwijl dat niet zo is. Exporteren (PNG, SVG) blijft beschikbaar, want een afbeelding van een rapport is hoe dan ook nuttig.
Het tussen omgevingen verplaatsen
Er verandert niets: het rapport is een oplossingsonderdeel en reist zoals altijd, met het sjabloon erin. Je tekening reist ook mee, zodat wie het importeert op Ontwerpen kan drukken en met jouw opmaak verder kan in plaats van opnieuw te beginnen.
Problemen oplossen
- "This design has no report page yet." — je hebt op het canvas getekend, maar niet binnen een rapportpagina. Gebruik Invoegen → Rapportpagina en zet je inhoud erin; het paginaframe vertelt de compiler waar het rapport begint.
- Opslaan is grijs. — er is niets veranderd sinds je het opende. Teken eerst iets.
- Het rapport wordt afgedrukt, maar de pagina is leeg. — de repeater wijst niet naar een dataset. Open Herhalen over: daar staat elke dataset die dit rapport echt heeft. Kies er een, of voeg de ontbrekende dataset toe onder Bewerken en kies hem dan.
- "Every page frame is a section of this report, but they must all be the same size…" — een van je frames Rapportpagina heeft een ander formaat dan het eerste. Pas het formaat aan; tot je dat doet, wordt alles afgedrukt op het papier van het eerste frame. Zie Meerdere paginaontwerpen in één rapport, hierboven.
- Mijn opmaak kwam anders terug. — je werkt aan een rapport waarvan het sjabloon is geüpload in plaats van ontworpen. Zie Een rapport waarvoor je een sjabloon hebt geüpload, hierboven.
- Eén cel is leeg en de rest van het rapport is in orde. — de koppeling ervan kon niet worden uitgevoerd. Open hem: de editor onderstreept het deel dat hij niet begreep. Een koppeling die faalt, laat bewust een lege plek achter in plaats van de hele pagina mee te sleuren.
rows.lengthzegt 'length' is a method — write length() to call it. Het is een methode in BS Lang, dus hij heeft haakjes nodig:rows.length().count(rows)leest in een rapport sowieso beter. (Vroeger antwoordde het met de hele lijst in plaats van het aantal, zonder iets te zeggen. Dat doet het nu niet meer.)sumis rood onderstreept. — controleer de spelling aan de hand van de lijst hierboven. De editor kent de eigen aggregaties van het rapport en verder niets; een functie die het platform niet heeft, is een functie die niets zal aanroepen.- Een koppeling die vóór deze release is geschreven, werkt niet meer. — rapportexpressies zijn nu
BS Lang, dezelfde taal als overal elders in het platform. Bijna alles werkt ongewijzigd —
veldpaden, rekenwerk, vergelijkingen,
?:, de aggregaties — maar een expressie die leunde op iets wat de oude evaluator toevallig toestond, is het waard om opnieuw te openen, want de editor zegt het je nu.