Een knop iets laten doen
Doel
Een knop op de opdrachtbalk van een formulier of weergave iets geven om te doen als erop wordt gedrukt.
Vereisten
- Een formulier of weergave die je in de bijbehorende ontwerper bewerkt, met ten minste één actie op de strook Acties.
Stappen
-
Open het formulier in de Formulierontwerper, of de weergave in de Weergaveontwerper.
-
Selecteer je knop in de strook Acties.
-
Kies bij Bij indrukken wat hij doet:
Keuze Wat hij nodig heeft Wat er gebeurt Een weergave openen een tabel (leeg betekent deze tabel) en een van haar weergaven de lijst opent in die weergave Nieuw record een tabel (leeg betekent deze tabel) een leeg recordformulier opent Een dashboard openen een dashboard het dashboard opent Een scherm openen een getekend scherm het scherm opent Een rapport uitvoeren een rapport het rapport opent als eigen scherm — beperkt tot het geopende record, als er een is Een webadres openen een http://- ofhttps://-adres, dat velden van het record mag noemenhet opent in een nieuw tabblad Een script uitvoeren hier niets — zie hieronder je BS Lang-script wordt uitgevoerd -
Kies het doel uit de lijst. Elk van die vakken opent een doorzoekbare lijst van wat je omgeving werkelijk heeft, met de weergavenaam van elk item op de eerste regel en de logische naam eronder. Typ om te filteren — beide regels tellen mee, dus
par_invvindt "Invoices", en inv typen ook. -
Sla het formulier of de weergave op.
Laat de tabel leeg wanneer je "deze" bedoelt. Een opdracht die geen tabel noemt, werkt op de tabel waarop ze is geplaatst, dus dezelfde knop kan naar een ander formulier worden gekopieerd zonder hem opnieuw te laten verwijzen. Dat betekent de tekst Deze tabel in het lege vak, en de ✕ naast een gekozen tabel zet het terug.
De weergavenlijst hoort bij de tabel erboven. Kies eerst de tabel; de aangeboden weergaven zijn de lijstweergaven van die tabel, want dat zijn de weergaven die een lijstpagina kan openen. Wijzig je de tabel, dan wordt een weergave die je al had gekozen gewist, omdat een weergave van de ene tabel niet op een andere kan openen — beter opnieuw kiezen dan een knop opslaan die mislukt als iemand erop drukt.
Een rapport kent zijn eigen tabel, dus ernaast valt geen tabel te kiezen.
Een webadres kan het record meenemen
Zet de logische naam van een veld tussen accolades en het adres gebruikt de waarde van dat veld uit het geopende record:
https://teams.microsoft.com/l/call/0/0?users=4:{pw_phone_number}
https://www.openstreetmap.org/search?query={address1_city}
De waarde wordt voor je URL-gecodeerd, dus een telefoonnummer als +44 20 7946 0000 komt in
één stuk aan. Het adres moet nog steeds beginnen met http:// of https://, voluit geschreven: een
veld kan een deel van een adres invullen, maar nooit het schema.
Is het veld leeg, dan opent er niets en krijgt degene die op de knop drukte te horen om welk veld het gaat. In een lijst is er geen geopend record, dus een adres met een veld erin werkt alleen op een formulier.
De eerste vijf brengen de gebruiker ergens heen — en laten een weg terug
Een weergave openen, Nieuw record, Een dashboard openen, Een scherm openen en Een rapport uitvoeren zijn navigaties: elk vervangt het scherm waarop de knop werd ingedrukt, en de adresbalk laat dat zien, zodat het resultaat kan worden vernieuwd, als bladwijzer opgeslagen of naar iemand gestuurd.
Daarom heeft het scherm dat een opdracht opent een knop ← die teruggaat naar waar het vandaan kwam. Beweeg de muis erover en hij noemt de plek — "Terug naar Accounts", of "Terug naar Invoices · Contoso Ltd" als de knop op een record werd ingedrukt.
Hij staat waar de navigatie van dat scherm al zit, dus het is altijd dezelfde hoek:
- een lijst en een recordformulier zetten hem aan het begin van de opdrachtbalk, waar de pijl van een formulier altijd al stond — op een formulier is hij die pijl, zodat er één uitweg is in plaats van twee;
- een rapport zet hem aan het begin van zijn eigen werkbalk, vóór de naam van het rapport;
- een dashboard en een getekend scherm hebben geen werkbalk, dus daar komt hij in de linkerbovenhoek.
De pijl volgt je zolang je binnen de app blijft bewegen, dus als je een record opent vanuit een lijst waar een knop je naartoe stuurde, raak je de weg terug niet kwijt; hij verdwijnt als je iets kiest in de eigen navigatie van de app, want dat is een andere koers en geen onderdeel van de tocht. Een scherm dat je zelf via de navigatie hebt bereikt, heeft geen terugpijl, omdat er niets ongedaan te maken is.
Heeft het formulier dat je verlaat niet-opgeslagen wijzigingen, dan wordt je dat gevraagd voordat het verdwijnt — dezelfde vraag die elke andere uitweg uit een formulier stelt.
Een rapport dat vanaf een record wordt uitgevoerd, drukt dat record af; een rapport dat vanuit een lijst wordt uitgevoerd, gaat over de hele tabel. De zoekopdracht en het filter van een lijst gaan niet mee, omdat een rapport wordt aangesproken met zijn eigen naam en een filter niet iets is wat een adres kan meenemen. Wil je een rapport over een kleinere set records, geef het rapport zelf dan het filter.
Wanneer je in plaats daarvan een script schrijft
Kies Een script uitvoeren en de knop Code bewerken verschijnt. Gebruik die als wat de knop doet afhangt van iets wat alleen de browser weet — wat de gebruiker heeft getypt, of welke rijen hij heeft aangevinkt.
Een script kan het volgende aanroepen:
| Aanroep | Wat het doet |
|---|---|
getValue(field) | de huidige waarde van een veld op het geopende formulier |
setValue(field, value) | stelt een veld op het geopende formulier in (slaat niet op) |
recordId() | de id van het geopende record, of "" |
selectedCount() / selectedId(index) | hoeveel rijen zijn aangevinkt, en een ervan |
openRecord(table, id) | opent een record; een lege id opent een leeg record |
newRecord(table, { field: value }) | opent een leeg record met die velden al ingevuld. Er wordt niets opgeslagen totdat de persoon op Opslaan drukt |
openView(table, view) / openDashboard(name) / openScreen(name) / runReport(name) | dezelfde stappen als de kiezer |
openUrl(url) | opent een http/https-adres in een nieuw tabblad; een {field} erin wordt ingevuld, zoals hierboven |
notify(message) | zegt iets tegen de gebruiker |
refresh() | laadt opnieuw wat er op het scherm staat |
save() | drukt op Opslaan van het formulier, na wat het script heeft ingesteld. Alleen op een formulier |
if (selectedCount() == 0) {
notify("Tick a ticket first.");
} else {
openRecord("par_ticket", selectedId(0));
}
Zo opent de knop Call van Sales met één druk Teams en een telefoongesprek over de klant:
openUrl("https://teams.microsoft.com/l/call/0/0?users=4:{telephone1}");
newRecord("pw_activity", {
pw_type: 110000002,
pw_regarding: "contact:" + recordId(),
pw_phone_number: getValue("telephone1")
});
Een zoekveld dat naar meerdere tabellen kan verwijzen, wordt ingevuld als table:id, zoals
pw_regarding hier.
De editor onderstreept fouten terwijl je typt en vult die functies aan — dezelfde editor waarin een bedrijfsregel wordt geschreven.
Wat een opdracht niet kan
Ze kan geen record schrijven, en ze kan niets afdwingen. setValue wijzigt het formulier dat de
gebruiker voor zich heeft, en wat mag worden opgeslagen, beslist de server. Een regel die moet gelden
wie er ook op wat drukt, hoort in een plug-instap op de server.
save() is geen manier om daaromheen te komen. Het drukt namens de gebruiker op de eigen knop
Opslaan van het formulier, met dezelfde controles: verplichte velden, de regels die bij het
opslaan worden uitgevoerd, en wat de server ook weigert. Hiermee kan één knop zowel een veld
instellen als opslaan, zoals Verzenden bij een e-mail:
setValue("pw_delivery", 110000001);
save();
Elk oppervlak heeft ook zijn eigen grenzen, en een opdracht die om meer vraagt, krijgt dat te horen in plaats van te doen alsof ze werkt:
- een lijst heeft geen geopend record, dus
setValuedoet daar niets; - een tabblad met gerelateerde records in een formulier heeft geen eigen adres, dus kan niet navigeren;
- een formulier laadt zichzelf niet opnieuw bij
refresh(), omdat het wijzigingen bevat die niemand kwijt wilde.
De items van een gesplitste knop doen elk hun eigen ding
Voeg een gesplitste knop toe en de menu-items ervan kunnen hun eigen gedrag hebben — het ene item opent een webadres terwijl een ander een record begint. Een item dat je niet aanpast, valt terug op het gedrag van de bovenliggende knop.
In het Meer-menu (…) is een gesplitste knop een groep: de naam, met de items eronder. De naam is zelf alleen een item als de knop zelf iets doet; anders is het alleen de kop.
In de balk werkt het net zo: heeft een gesplitste knop geen eigen gedrag, dan opent een klik op zijn naam het menu, net als de pijl.
Problemen oplossen
- “… does nothing yet: it has neither an action nor a script.” — de knop heeft nooit een gedrag gekregen. Kies er een bij Bij indrukken.
- “… is missing what it should open.” — het gedrag is ingesteld, maar het vak ervan is leeg, of
het webadres is geen
http/https. Eenjavascript:-adres wordt op elk niveau geweigerd, ook bij het importeren. - “… needs …, which is empty on this record.” — het webadres noemt een veld waar niets in staat. Vul het veld in, of druk op de knop bij een record dat het wel heeft.
- “… could not run: …” — het script is mislukt. Het bericht komt van de interpreter zelf, en het scherm blijft werken.
- “… asked for something this screen cannot do.” — zie de grenzen hierboven.
- Het rapport is geopend maar toont elk record. Het is uitgevoerd vanuit een lijst, of vanaf een record dat nooit is opgeslagen — er is geen record om het tot te beperken. Open eerst het record.
- De knop Code bewerken ontbreekt. — de knop noemt al een gedrag. Kies Een script uitvoeren om de editor terug te krijgen; twee gedragingen op één knop zou betekenen dat een ervan stilletjes verliest.
Gerelateerde scenario's
- Knoppen groeperen op een opdrachtbalk.
- Een opdracht hernoemen, verbergen of verplaatsen — de woorden, het symbool, de volgorde en of ze verborgen begint.
- Een bedrijfsregel schrijven — de andere helft van formulierlogica: wat er gebeurt zonder dat iemand ergens op drukt.