Naar hoofdinhoud gaan

Definitie van een modelgestuurde keuzeset

Schema-id: model-driven-option-set@1 Machineleesbaar schema: model-driven-option-set.schema.json

De canonieke weergave van een keuzeset — een herbruikbare lijst met een naam van toegestane waarden die een veld kan aannemen (sectie 6.14). Dataverse noemt hetzelfde concept een Choice. Wordt op dezelfde manier gevalideerd, of hij nu uit de ontwerper komt, uit een API-aanroep, van een AI-assistent of uit een oplossingsimport.

Structuur​

VeldTypeVerplichtOpmerkingen
logicalNametekenreeksjaMet uitgeversvoorvoegsel, in kleine letters snake_case (bijv. par_invoicestatus).
displayNametekenreeksjaLeesbare naam.
descriptiontekenreeksneeWaar de set voor dient.
publisherPrefixtekenreeksneeHet voorvoegsel van de eigenaar-uitgever. Meegenomen zodat de definitie haar eigen uitgever noemt, in plaats van een importeur die uit de logische naam te laten afleiden.
optionValueBasegeheel getaljaDe optiewaardebasis van de eigenaar-uitgever; de value van elke optie is daarbinnen absoluut — 110000001, nooit 1. Verplicht sinds 2026-09-12: een definitie zonder basis wordt bij import geweigerd, en de eerste productoplossing was zo geschreven en slaagde voor elke test.
nextOptionValuegeheel getalneeDe hoogwatermarkering van de set — de volgende waarde die ze uitdeelt. Opgeslagen in plaats van afgeleid uit options, zodat het nummer van een buiten gebruik gestelde optie nooit opnieuw wordt uitgegeven. Zie hieronder.
optionsarrayjaDe opties, in weergavevolgorde. Minstens één — een set waaruit niemand kan kiezen, is geen set.

Optie​

VeldTypeVerplichtOpmerkingen
valuegeheel getaljaDe opgeslagen waarde. Door het platform toegewezen uit de basis van de eigenaar-uitgever en onveranderlijk zodra ze is toegekend. Minimaal 1 — zie hieronder.
displayNametekenreeksjaWat een gebruiker kiest.
descriptiontekenreeksneeWat de optie betekent.

Waarom waarden grote getallen zijn, nooit 0/1/2​

De value is wat de database daadwerkelijk opslaat. Elke uitgever bezit een reeks getallen (bijv. 270150000–270159999), en de opties van een set worden vanaf de basis oplopend genummerd:

270150000, 270150001, 270150002, …

Als elke uitgever bij 0 begon, zou het importeren van oplossingen van twee uitgevers in één omgeving ongemerkt de "Concept" van de ene uitgever laten betekenen wat "Geannuleerd" bij de andere betekent — omdat beide als 0 zouden worden opgeslagen. Het bereik per uitgever maakt dat onmogelijk. Het is de numerieke tegenhanger van het uitgeversvoorvoegsel, dat hetzelfde doet voor namen.

Daaruit volgen twee regels, en beide worden afgedwongen:

  • Je kiest geen waarden. De create-API neemt geen waarde; het platform wijst de volgende toe uit het bereik van de uitgever. Bij een update is een optie met een waarde er een die je behoudt — een onbekende waarde wordt geweigerd, niet geaccepteerd.
  • Een waarde verandert nooit. Een optie hernoemen is vrij en veilig; haar hernummeren zou elke record die haar al opslaat, laten verwijzen naar iets anders. Het nummer van een verwijderde optie wordt buiten gebruik gesteld in plaats van opnieuw uitgegeven.

Importeren en exporteren​

De waarden reizen met de definitie mee; bij import worden ze niet opnieuw toegewezen. De records van de bronomgeving bevatten ze al, dus een oplossing die in Test of Prod wordt geïmporteerd, moet het met Dev eens zijn over wat 270150001 betekent.

nextOptionValue reist om dezelfde reden mee, één stap verder. Het is de volgende waarde die de set uitdeelt, en die wordt opgeslagen in plaats van berekend uit de aanwezige opties. Is er een optie verwijderd, dan blijft de markering boven het nummer dat die optie had — zodat het nummer buiten gebruik wordt gesteld in plaats van aan de volgende nieuwe optie te worden gegeven. Dat is belangrijk, want ergens kan een record het nog bevatten. Een importerende omgeving die de markering opnieuw zou afleiden uit de opties die ze ontvangt, zou precies die bescherming tenietdoen. Een definitie zonder nextOptionValue valt terug op de afgeleide markering; dat is het beste antwoord dat er is voor een document dat er nooit een heeft vastgelegd.

Een import controleert wat de toewijzing anders zou hebben gegarandeerd: elke waarde moet binnen het bereik van de uitgever liggen, geen twee opties mogen een waarde of een label delen, en de logische naam moet in de doelomgeving vrij zijn. Een waarde uit het bereik van een andere uitgever wordt geweigerd in plaats van opgeslagen — haar accepteren zou precies de botsing veroorzaken die het bereiksysteem moet voorkomen.

Een veld aan een set koppelen​

Een tabelveld verwijst op naam naar een set, in de tabeldefinitie:

{ "logicalName": "par_status", "displayName": "Status", "dataType": "OptionSet", "optionSet": "par_invoicestatus" }

De kolom is een bigint met de waarde van de gekozen optie. De server weigert een schrijfactie waarvan de waarde niet een van de opties van de set is.

Voorbeeld​

{
"logicalName": "par_invoicestatus",
"displayName": "Invoice Status",
"description": "The lifecycle of an invoice",
"publisherPrefix": "par",
"optionValueBase": 270150000,
"nextOptionValue": 270150003,
"options": [
{ "value": 270150000, "displayName": "Draft", "description": "Not yet sent to the customer" },
{ "value": 270150001, "displayName": "Sent" },
{ "value": 270150002, "displayName": "Paid" }
]
}