En værdi er data, der oprettes ved at evaluere et udtryk. I dette afsnit beskrives typerne af værdier på M-sproget. Hver type værdi er knyttet til en konstantsyntaks, et sæt værdier, der er af denne type, et sæt operatorer, der er defineret for det pågældende værdisæt, og en indbygget type, der er tilskrevet nyligt oprettede værdier.
Kind
Literal
Nul
null
Logisk
truefalse
Tal
01-11.52.3e-5
Time
#time(09,15,00)
Dato
#date(2013,02,26)
DateTime
#datetime(2013,02,26, 09,15,00)
DateTimeZone
#datetimezone(2013,02,26, 09,15,00, 09,00)
Varighed
#duration(0,1,30,0)
Tekst
"hello"
Binær
#binary("AQID")
Liste
{1, 2, 3}
Post
[ A = 1, B = 2 ]
Tabel
#table({"X","Y"},{{0,1},{1,0}})
Funktion
(x) => x + 1
Skriv
type { number }type table [ A = any, B = text ]
I følgende afsnit beskrives hver værdi af typen i detaljer. Typer og typebeskrivelse defineres formelt i Typer. Funktionsværdier er defineret i Functions. I følgende afsnit vises de operatorer, der er defineret for hver værdi, og der vises eksempler. Den fulde definition af operatorens semantik følger i Operatorer.
Null
En null-værdi bruges til at repræsentere fraværet af en værdi eller en værdi af ubestemt eller ukendt tilstand. En null-værdi skrives ved hjælp af konstantværdien null. Følgende operatorer er defineret for null-værdier:
Operator
Resultat
x > y
Større end
x >= y
Større end eller lig med
x < y
Mindre end
x <= y
Mindre end eller lig med
x = y
Lig med
x <> y
Ikke lig med
x ?? y
Coalesce
Den oprindelige type af værdien null er den indbyggede type null.
Logisk
En logisk værdi bruges til booleske handlinger, der har værdien true eller false. En logisk værdi skrives ved hjælp af konstanterne true og false. Følgende operatorer er defineret for logiske værdier:
Operator
Resultat
x > y
Større end
x >= y
Større end eller lig med
x < y
Mindre end
x <= y
Mindre end eller lig med
x = y
Lig med
x <> y
Ikke lig med
x or y
Betinget logisk OR
x ?? y
Coalesce
x and y
Betinget logisk AND
not x
Logisk NOT
Den oprindelige type af både logiske værdier (true og false) er den indbyggede type logical.
Nummer
En talværdi bruges til numeriske og aritmetiske handlinger. Følgende er eksempler på talkonstanter:
3.14 // Fractional number
-1.5 // Fractional number
1.0e3 // Fractional number with exponent
123 // Whole number
1e3 // Whole number with exponent
0xff // Whole number in hex (255)
Et tal repræsenteres med mindst præcisionen af et dobbelt reelt tal (men kan bevare mere præcision). Dobbeltrepræsentationen er i overensstemmelse med IEEE 64-bit dobbelt præcisionsstandarden for binært flydende tal aritmetik defineret i [IEEE 754-2008]. (Den Dobbelt repræsentation har et omtrentligt dynamisk område fra 5,0 x 10324 til 1,7 x 10308 med en præcision på 15-16 cifre.)
Følgende specialværdier anses også for at være talværdier :
Positivt nul og negativt nul. I de fleste situationer fungerer positivt nul og negativt nul identisk som den simple værdi nul, men visse handlinger skelner mellem de to.
Positiv uendelighed (#infinity) og negativ uendelighed (-#infinity). Uendeligheder produceres af sådanne handlinger som at dividere et tal, der ikke er nul, med nul. Giver f.eks 1.0 / 0.0 . positiv uendelighed og -1.0 / 0.0 giver negativ uendelighed.
Not-a-Number-værdien (#nan), ofte forkortet NaN. NaN'er er produceret af ugyldige flydende talhandlinger, f.eks. ved at dividere nul med nul.
Binære matematiske handlinger udføres ved hjælp af en Præcision. Præcisionen bestemmer det domæne, som operanderne afrundes til, og det domæne, hvor handlingen udføres. Hvis der ikke er angivet en eksplicit præcision, udføres disse handlinger ved hjælp af dobbelt præcision.
Hvis resultatet af en matematisk handling er for lille til destinationsformatet, bliver resultatet af handlingen positivt nul eller negativt nul.
Hvis resultatet af en matematisk handling er for stort til destinationsformatet, bliver resultatet af handlingen positiv uendelighed eller negativ uendelighed.
Hvis en matematisk handling er ugyldig, bliver resultatet af handlingen NaN.
Hvis en eller begge operander for en handling med flydende tal er NaN, bliver resultatet af handlingen NaN.
Følgende operatorer er defineret for talværdier:
Operator
Resultat
x > y
Større end
x >= y
Større end eller lig med
x < y
Mindre end
x <= y
Mindre end eller lig med
x = y
Lig med
x <> y
Ikke lig med
x + y
Sum
x - y
Difference
x * y
Produkt
x / y
Kvotient
x ?? y
Coalesce
+x
Monadisk plus
-x
Negation
Den oprindelige type af talværdier er den indbyggede type number.
Tid
En klokkeslætsværdi gemmer en uigennemsigtig repræsentation af klokkeslæt på dagen. Et klokkeslæt kodes som antallet af akser siden midnat, hvilket tæller antallet af 100-nanosekunder akser, der er gået på et 24-timers ur. Det maksimale antal akser siden midnat svarer til 23:59:59.9999999 timer.
Selvom der ikke er nogen konstantsyntaks for gange, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Klokkeslæt kan også oprettes ved hjælp af den indbyggede funktion #time:
#time(hour, minute, second)
Følgende skal være i venteposition, eller der udløses en fejl med årsagskoden Expression.Error :
0 ≤ time ≤ 24
0 ≤ minut ≤ 59 minutter
0 ≤ anden ≤ 59
Hvis time = 24, skal minut og sekund desuden være nul.
Følgende operatorer er defineret for klokkeslætsværdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x ?? y
Coalesce
Følgende operatorer tillader, at en eller begge operander er en dato:
Operator
Venstre operand
Højre operand
Betydning
x + y
time
duration
Datoforskydning efter varighed
x + y
duration
time
Datoforskydning efter varighed
x - y
time
duration
Datoforskydning efter negeret varighed
x - y
time
time
Varighed mellem datoer
x & y
date
time
Flettet datetime
Den oprindelige type af klokkeslætsværdier er den indbyggede type time.
Dato
En datoværdi gemmer en uigennemsigtig repræsentation af en bestemt dag. En dato kodes som et antal dage siden epoken fra den 1. januar 0001 Common Era i den gregorianske kalender. Det maksimale antal dage siden epoken er 3652058, svarende til den 31. december 9999.
Selvom der ikke er nogen konstantsyntaks for datoer, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Datoer kan også oprettes ved hjælp af den indbyggede funktion #date:
#date(year, month, day)
Følgende skal være i venteposition, eller der udløses en fejl med årsagskoden Expression.Error :
1 ≤ år ≤ 9999
1 ≤ måned ≤ 12
1 ≤ dag ≤ 31
Desuden skal dagen være gyldig for den valgte måned og det valgte år.
Følgende operatorer er defineret for datoværdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x ?? y
Coalesce
Følgende operatorer tillader, at en eller begge operander er en dato:
Operator
Venstre operand
Højre operand
Betydning
x + y
date
duration
Datoforskydning efter varighed
x + y
duration
date
Datoforskydning efter varighed
x - y
date
duration
Datoforskydning efter negeret varighed
x - y
date
date
Varighed mellem datoer
x & y
date
time
Flettet datetime
Den oprindelige type datoværdier er den indbyggede type date.
Dato/klokkeslæt
En datetime-værdi indeholder både en dato og et klokkeslæt.
Selvom der ikke er nogen konstantsyntaks for datetimes, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Datetimes kan også oprettes ved hjælp af den indbyggede funktion #datetime:
#datetime(year, month, day, hour, minute, second)
Følgende skal være i venteposition, eller der udløses en fejl med årsagskoden Expression.Error: 1 ≤ år ≤ 9999
1 ≤ måned ≤ 12
1 ≤ dag ≤ 31
0 ≤ time ≤ 23
0 ≤ minut ≤ 59 minutter
0 ≤ anden ≤ 59
Desuden skal dagen være gyldig for den valgte måned og det valgte år.
Følgende operatorer er defineret for datetime-værdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x ?? y
Coalesce
Følgende operatorer tillader, at en eller begge operander er en datetime:
Operator
Venstre operand
Højre operand
Betydning
x + y
datetime
duration
Datetime-forskydning efter varighed
x + y
duration
datetime
Datetime-forskydning efter varighed
x - y
datetime
duration
Datetime-forskydning efter negeret varighed
x - y
datetime
datetime
Varighed mellem datetimes
Den oprindelige type af datetime-værdier er den indbyggede type datetime.
DateTimeZone
En datetimezone-værdi indeholder en datetime og en tidszone. En tidszone kodes som et antal minutters forskydning fra UTC, som tæller antallet af minutter, hvor klokkeslætsdelen af datetime skal forskydes fra UTC (Universal Coordinated Time). Det mindste antal minutter, der forskydes fra UTC , er -840, hvilket repræsenterer en UTC-forskydning på -14:00 eller fjorten timer tidligere end UTC. Det maksimale antal minutter, der forskydes fra UTC , er 840, svarende til en UTC-forskydning på 14:00.
Selvom der ikke er nogen konstantsyntaks for datetimezones, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Datetimezones kan også oprettes ved hjælp af den indbyggede funktion #datetimezone:
Følgende skal være i venteposition, eller der udløses en fejl med årsagskoden Expression.Error :
1 ≤ år ≤ 9999
1 ≤ måned ≤ 12
1 ≤ dag ≤ 31
0 ≤ time ≤ 23
0 ≤ minut ≤ 59 minutter
0 ≤ anden ≤ 59
-14 ≤ forskydningstimer ≤ 14
-59 ≤ forskydningsminutter ≤ 59
Desuden skal dagen være gyldig for den valgte måned og det valgte år, og hvis forskydningstimer = 14, skal forskydningsminutter <= 0 og, hvis forskydningstimer = -14, derefter forskydningsminutter >= 0.
Følgende operatorer er defineret for datetimezone-værdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x ?? y
Coalesce
Følgende operatorer tillader, at en eller begge operander er en datetimezone:
Operator
Venstre operand
Højre operand
Betydning
x + y
datetimezone
duration
Datetimezone-forskydning efter varighed
x + y
duration
datetimezone
Datetimezone-forskydning efter varighed
x - y
datetimezone
duration
Datetimezone-forskydning efter negeret varighed
x - y
datetimezone
datetimezone
Varighed mellem datetimezones
Den oprindelige type af datetimezone-værdier er den indbyggede type datetimezone.
Varighed
En varighedsværdi gemmer en uigennemsigtig repræsentation af afstanden mellem to punkter på en tidslinje, der måles med 100-nanosekunder-akser. Størrelsen af en varighed kan være enten positiv eller negativ, hvor positive værdier angiver status fremad i tiden og negative værdier, der angiver status bagud i tiden. Den mindste værdi, der kan gemmes i en varighed , er -9.223.372.036.854.775.808 akser eller 10.675.199 dage 2 timer og 48 minutter 05,4775808 sekunder bagud i tiden. Den maksimale værdi, der kan gemmes i en varighed , er 9.223.372.036.854.775.807 akser eller 10.675.199 dage 2 timer og 48 minutter 05,4775807 sekunder frem i tiden.
Selvom der ikke er nogen konstantsyntaks for varigheder, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Varigheder kan også oprettes ved hjælp af den indbyggede funktion #duration:
Følgende operatorer er defineret for varighedsværdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x ?? y
Coalesce
Desuden tillader følgende operatorer, at en eller begge operander er en varighedsværdi:
Operator
Venstre operand
Højre operand
Betydning
x + y
datetime
duration
Datetime-forskydning efter varighed
x + y
duration
datetime
Datetime-forskydning efter varighed
x + y
duration
duration
Sum af varigheder
x - y
datetime
duration
Datetime-forskydning efter negeret varighed
x - y
datetime
datetime
Varighed mellem datetimes
x - y
duration
duration
Forskel på varigheder
x * y
duration
number
N gange en varighed
x * y
number
duration
N gange en varighed
x / y
duration
number
Brøkdel af en varighed
Den oprindelige type af varighedsværdier er den indbyggede type duration.
SMS-besked
En tekstværdi repræsenterer en sekvens af Unicode-tegn. Tekstværdier har en konstant form, der er i overensstemmelse med følgende grammatik:
_text-konstant: " text-literal-charactersopt" text-literal-characters:
text-literal-character text-literal-charactersopt
text-literal-character:
enkelt-tekst-tegn
character-escape-sequence
double-quote-escape-sequence
enkelt-tekst-tegn:
Alle tegn undtagen " (U+0022) eller # (U+0023) efterfulgt af ( (U+0028) double-quote-escape-sequence: "" (U+0022, U+0022)
Følgende er et eksempel på en tekstværdi :
"ABC" // the text value ABC
Følgende operatorer er defineret for tekstværdier :
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x & y
Sammenkædning
x ?? y
Coalesce
Den oprindelige type tekstværdier er den indbyggede type text.
Binær
En binær værdi repræsenterer en sekvens af byte.
Selvom der ikke er nogen konstantsyntaks for binære værdier, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Binære værdier kan også oprettes ved hjælp af den indbyggede funktion #binary.
I følgende eksempel konstrueres en binær værdi ud fra en liste over byte:
#binary( {0x00, 0x01, 0x02, 0x03} )
Følgende operatorer er defineret for binære værdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x >= y
Større end eller lig med
x > y
Større end
x < y
Mindre end
x <= y
Mindre end eller lig med
x ?? y
Coalesce
Den oprindelige type binære værdier er den indbyggede type binær.
List
En listeværdi er en værdi, der opretter en sekvens af værdier, når den optæles. En værdi, der er produceret af en liste, kan indeholde alle typer værdier, herunder en liste. Lister kan oprettes ved hjælp af initialiseringssyntaksen på følgende måde:
Følgende er et eksempel på et listeudtryk, der definerer en liste med tre tekstværdier: "A", og ."C""B"
{"A", "B", "C"}
Værdien "A" er det første element på listen, og værdien "C" er det sidste element på listen.
Elementerne på en liste evalueres ikke, før de åbnes.
Mens listeværdier, der er oprettet ved hjælp af listesyntaksen, opretter elementer i den rækkefølge, de vises i elementlisten, kan lister, der returneres fra biblioteksfunktioner, producere et andet sæt eller et andet antal værdier, hver gang de optæles.
Hvis du vil medtage en sekvens af heltal på en liste, kan formularen a..b bruges:
{ 1, 5..9, 11 } // { 1, 5, 6, 7, 8, 9, 11 }
Antallet af elementer på en liste, der kaldes antallet af lister, kan bestemmes ved hjælp af funktionen List.Count .
Den oprindelige type listeværdier er den indbyggede type list, som angiver elementtypen any.
Post
En postværdi er en sorteret sekvens af felter. Et felt består af et feltnavn, som er en tekstværdi, der entydigt identificerer feltet i posten og en feltværdi. Feltværdien kan være en hvilken som helst værdi, herunder post. Poster kan oprettes ved hjælp af initialiseringssyntaks på følgende måde:
record-expression: [field-listopt] field-list:
mark
feltfeltliste,
mark:
field-name-udtryk=
field-name:
generalized-identifier
quoted-identifier
I følgende eksempel oprettes en post med et felt med navnet x med værdien 1og et felt med navnet y med værdien 2.
[ x = 1, y = 2 ]
I følgende eksempel konstrueres en post med et felt med a navnet a med en indlejret postværdi. Den indlejrede post har et felt med navnet b med værdien 2.
[ a = [ b = 2 ] ]
Følgende gælder ved evaluering af et postudtryk:
Det udtryk, der er tildelt hvert feltnavn, bruges til at bestemme værdien af det tilknyttede felt.
Hvis det udtryk, der er tildelt et feltnavn, opretter en værdi, når det evalueres, bliver det værdien af feltet for den resulterende post.
Hvis det udtryk, der er tildelt et feltnavn, udløser en fejl, når det evalueres, registreres det faktum, at der opstod en fejl, sammen med feltet sammen med den fejlværdi, der blev udløst. Efterfølgende adgang til dette felt medfører, at der udløses en fejl igen med den registrerede fejlværdi.
Udtrykket evalueres kun i et miljø som det overordnede miljø med variabler, der er flettet med, og som svarer til værdien for hvert felt i posten, bortset fra det, der initialiseres.
En værdi i en post evalueres ikke, før det tilsvarende felt åbnes.
En værdi i en post evalueres højst én gang.
Resultatet af udtrykket er en postværdi med en tom metadatapost.
Rækkefølgen af felterne i posten er defineret af den rækkefølge, de vises i record-initializer-expression.
Hvert feltnavn, der er angivet, skal være entydigt i posten, eller det er en fejl. Navne sammenlignes ved hjælp af en sammenligning af ordenstal.
[ x = 1, x = 2 ] // error: field names must be unique
[ X = 1, x = 2 ] // OK
En post uden felter kaldes en tom post og skrives på følgende måde:
[] // empty record
Selvom rækkefølgen af felterne i en post ikke er vigtig, når du får adgang til et felt eller sammenligner to poster, er den vigtig i andre kontekster, f.eks. når felterne i en post optæles.
De samme to poster giver forskellige resultater, når felterne hentes:
Record.FieldNames([ x = 1, y = 2 ]) // [ "x", "y" ]
Record.FieldNames([ y = 1, x = 2 ]) // [ "y", "x" ]
Antallet af felter i en post kan bestemmes ved hjælp af Record.FieldCount funktionen . Eksempler:
Record.FieldCount([ x = 1, y = 2 }) // 2
Record.FieldCount([]) // 0
Ud over at bruge syntaksen for [ ]initialisering af poster kan poster oprettes ud fra en liste over værdier og en liste over feltnavne eller en posttype. Eksempler:
Record.FromList({1, 2}, {"a", "b"})
Ovenstående svarer til:
[ a = 1, b = 2 ]
Følgende operatorer er defineret for postværdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x & y
Fletning
x ?? y
Coalesce
Følgende eksempler illustrerer ovenstående operatorer. Bemærk, at postfletning bruger felterne fra højre operand til at tilsidesætte felter fra den venstre operand, hvis der er et overlap i feltnavne.
[ a = 1, b = 2 ] & [ c = 3 ] // [ a = 1, b = 2, c = 3 ]
[ a = 1, b = 2 ] & [ a = 3 ] // [ a = 3, b = 2 ]
[ a = 1, b = 2 ] = [ b = 2, a = 1 ] // true
[ a = 1, b = 2, c = 3 ] <> [ a = 1, b = 2 ] // true
Den oprindelige type postværdier er den indbyggede type record, som angiver en åben tom liste over felter.
Table
En tabelværdi er en sorteret rækkesekvens. En række er en sorteret sekvens af kolonneværdier. Tabellens type bestemmer længden af alle rækker i tabellen, navnene på tabellens kolonner, typerne af tabellens kolonner og strukturen af tabellens nøgler (hvis der er nogen).
Selvom der ikke er nogen konstantsyntaks for tabeller, leveres der flere standardbiblioteksfunktioner til at konstruere dem. Tabeller kan også oprettes ved hjælp af den indbyggede funktion #table.
I følgende eksempel oprettes en tabel ud fra en liste over kolonnenavne og en liste over rækker. Den resulterende tabel indeholder to kolonner og type any tre rækker.
#table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})
#table kan også bruges til at angive en komplet tabeltype:
#table(
type table [Digit = number, Name = text],
{{1,"one"}, {2,"two"}, {3,"three"}}
)
Her har den nye tabelværdi en tabeltype, der angiver kolonnenavne og kolonnetyper.
Følgende operatorer er defineret for tabelværdier:
Operator
Resultat
x = y
Lig med
x <> y
Ikke lig med
x & y
Sammenkædning
x ?? y
Coalesce
Tabelsammenkædning justerer kolonner med samme navn og udfyldes null for kolonner, der kun vises i en af operandtabellerne. I følgende eksempel illustreres tabelsammenkædning:
Den oprindelige type tabelværdier er en brugerdefineret tabeltype (afledt af den indbyggede type table), der viser kolonnenavnene, angiver alle kolonnetyper, der skal være nogen, og som ikke har nogen nøgler. (Gå til Tabeltyper til detaljer om tabeltyper.)
Funktion
En funktionsværdi er en værdi, der knytter et sæt argumenter til en enkelt værdi. Detaljerne om funktionsværdier er beskrevet i Functions.
Skriv
En typeværdi er en værdi, der klassificerer andre værdier. Oplysningerne om typeværdier er beskrevet i Typer.
Do you want to learn about table types in Business Central? In this module, you'll learn about the different functional table types and their specific characteristics, such as special fields, properties, and linked pages.