Datatyper

Bemærk

Microsoft Power Fx er det nye navn til formelsproget for lærredapps. Vi arbejder på disse artikler, mens vi udtrækker sproget fra lærredapps, integrerer det i andre Microsoft Power Platform-produkter og gør det tilgængeligt som open source. Start med Microsoft Power Fx-oversigten for at få en introduktion til sproget.

Oplysninger strømmer gennem Microsoft Power Fx i små, separate værdier, næsten på samme måde som cellerne i et regneark. Data i feltet Fødselsdag og feltet Mærkedag vil f.eks. flyde som en Dato-værdi, der omfatter årstallet, måneden og dagen. Appen ved, hvordan disse værdier formateres, begrænser input til det, der er passende for hver enkelt, og dele værdierne med en database. Fødselsdage adskiller sig fra personers mærkedage, men systemet håndterer dem på præcis samme måde. I dette tilfælde er Dato et eksempel på en datatype.

Denne artikel indeholder oplysninger om de datatyper, som Power Fx understøtter. Når eksterne data føres ind i sproget, knyttes hver enkelt datatype i den pågældende kilde til en datatype til Power Fx.

Datatype Beskrivelse Eksempler
Boolean En sand- eller falsk-værdi. Kan bruges direkte i If, Filter og andre funktioner uden en sammenligning. true
Farve En farvespecifikation, der inkluderer en alfakanal. Color.Red
ColorValue( "#102030" )
RGBA( 255, 128, 0, 0.5 )
Valuta En valutaværdi, der gemmes i et flydende tal. Valutaværdier er de samme som talværdier med indstillinger for valutaformatering. 123
4.56
Dato En dato uden et tidspunkt i tidszonen for appens bruger. Date( 2019, 5, 16 )
DateTime En dato med et klokkeslæt i tidszonen for appens bruger. DateTimeValue( "May 16, 2019 1:23:09 PM" )
GUID En Globally Unique Identifier. GUID()
GUID( "123e4567-e89b-12d3-a456-426655440000" )
Link En tekststreng, der indeholder et link. "https://powerapps.microsoft.com"
Billede En URI-adressetekststreng (Universal Resource Identifier) til et billede i .jpeg-, .png-, .SVG-, .gif- eller andre almindelige webbilledformater. MyImage tilføjet som en appressource
"https://northwindtraders.com/logo.jpg"
"appres://blobmanager/7b12ffa2..."
Medier En URI-adressetekststreng til en video- eller lydoptagelse. MyVideo tilføjet som en appressource
"https://northwindtraders.com/intro.mp4"
"appres://blobmanager/3ba411c..."
Tal Et flydende tal. 123
-4,567
8,903e121
Grupperet indstilling En valg fra et sæt af indstillinger, der er baseret på et tal. Denne datatype kombinerer en tekstetiket, der er lokaliseret, med en numerisk værdi. Etiketten vises i appen, og den numeriske værdi gemmes og bruges til sammenligninger. ThisItem.OrderStatus
Post En post med dataværdier. Denne sammensatte datatype indeholder forekomster af andre datatyper, der er angivet i denne emne. Flere oplysninger: Arbejde med tabeller. {Virksomhed: "Northwind Traders",
Medarbejdere: 35,
Almennyttig organisation: falsk}
Postreference En henvisning til en post i et objekt. Sådanne referencer bruges ofte sammen med polymorfe opslag. Flere oplysninger: Arbejde med referencer. First(Accounts).Owner
Table En tabel med poster. Alle poster skal have de samme navne til deres felter med de samme datatyper, og de udeladte felter behandles som tomme. Denne sammensatte datatype indeholder forekomster af andre datatyper, der er angivet i denne emne. Flere oplysninger: Arbejde med tabeller. Table( { FirstName: "Sidney",
LastName: "Higa" },
{ FirstName: "Nancy",
LastName: "Anderson" } )
Tekst En Unicode-tekststreng. "Hello, World"
Klokkeslæt Et klokkeslæt uden en dato i tidszonen for appens bruger. Time( 11, 23, 45 )
To muligheder En valg ud fra to muligheder, der er baseret på en boolesk værdi. Denne datatype kombinerer en tekstetiket, der er lokaliseret, med en boolesk værdi. Etiketten vises i appen, og den booleske værdi gemmes og bruges til sammenligninger. ThisItem.Taxable

Mange af disse datatyper ligner hinanden og har samme underliggende repræsentation, f.eks et Link-felt, der behandles som Tekst. De ekstra datatyper giver bedre standardfunktioner i formularer og andre kontrolelementer.

Blank

Alle datatyper kan have værdien tom (med andre ord, ingen værdi). Udtrykket "NULL" bruges ofte i databaser for dette begreb.

Brug funktionen Tom med funktionen Sæt eller Rettelse til at indstille en variabel eller et felt til tom. Set( x, Blank() ) fjerner f.eks. enhver værdi i den globale variabel x.

Test for en tom værdi vha. funktionen IsBlank. Erstat mulige tomme værdier med værdier, der ikke er tomme, vha. funktionen Coalesce.

Da alle datatyper understøtter tom, har datatyperne Booleske og To muligheder faktisk har tre mulige værdier.

Alle disse fire datatyper er baseret på en Unicode-tekststreng.

Integreret tekst

Integrerede tekststrenge i en formel er omgivet af dobbelte anførselstegn. Brug to dobbelte anførselstegn sammen for at repræsentere et enkelt dobbelt anførselstegn i tekststrengen. Hvis du f.eks. bruger følgende formel i egenskaben OnSelect til et Button-kontrolelement:

Notify( "Jane said ""Hello, World!""" )

giver det et banner, når der trykkes på knappen, hvor det første og sidste dobbelte anførselstegn udelades (da de afgrænser tekststrengen) og de gentagne dobbelte anførselstegn omkring Hello, World! erstattes med et enkelt dobbelt anførselstegn:

popup-meddelelse med Janes meddelelse "Hello, World".

Enkelte anførselstegn bruges ikke til identifikatornavne, der indeholder specialtegn, og som ikke har nogen betydning i en tekststreng.

Billed- og medieressourcer

Via menuen Filer kan du tilføje billed-, video- og lydfiler som appressourcer. Navnet på den importerede fil bliver til ressourcenavnet i appen. I dette grafikelement er logoet Northwind Trades, som hedder nwindlogo, blevet føjet til en app:

Northwind-ressource.

Hvis du vil bruge denne ressource i en app, skal du angive den i egenskaben Billede til et Image-kontrolelement:

Northwind-billede.

URI-adresser for billeder og andre medier

Du kan over grave en smule dybere til dette sidste eksempel ved at angive egenskaben Tekst til et Label-kontrolelement til nwindlogo. Etiketten viser en tekststreng:

Northwind-tekst.

Power Fx refererer til hvert billede eller en anden mediefil, uanset om den er i skyen eller tilføjet som en appressource, ved hjælp af en URI-tekststreng.

Egenskaben Billede for et billedkontrolelement accepterer f.eks. ikke kun appressourcer, men også links til billeder på internettet, f.eks. "https://northwindtraders.com/logo.jpg". Egenskaben accepterer også indbyggede billeder, der bruger dataenes URI-adresseskema som i dette eksempel:

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFAQMAAACtnVQoAAAABlBMVEUAAAB0J3UMNU6VAAAAAXRSTlMAQObYZgAAABRJREFUCNdjUGJgCGVg6GgAkkA2AA8/AffqCEBsAAAAAElFTkSuQmCC"

Den pågældende URI-adresse viser en skaleret udgave af to lilla diamanter:

Dobbelte diamanter.

Du kan få vist det sidst optagede billede i et Camera-kontrolelement, hvis du har indstillet egenskaben Billede af et billedkontrolelement til egenskaben Foto i kamerakontrolelementet. Appen beholder billedet i hukommelsen, og egenskaben Foto for kameraets kontrolelement returnerer en URI-adressereference til billedet. Du kan f.eks. tage et billede, og egenskaben Foto i kameraet kan returnere "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1".

Du bruger en URI-adresse til at referere til et billede eller en anden mediefil, der er gemt i en database. På den måde hentes de faktiske data først, når der er behov for det. En vedhæftet fil i et Microsoft Dataverse-objekt kan f.eks. returnere "appres://datasources/Contacts/table/...". Som i kameraeksemplet kan du få vist dette billede ved at indstille egenskaben Billede for et billedkontrolelement til denne reference, som henter de binære data.

Når du gemmer en mediedatatype, f.eks. et billede, i en database, sender appen de faktiske billed- eller mediedata, ikke URI-adressereferencen.

Størrelsesgrænser

Som tekststrenge og URI-adresser har disse datatyper ingen forudindstillet grænse for deres længde.

De binære data, som disse datatyper refererer til, har heller ikke nogen forudindstillet grænse for størrelse. Et billede, som f.eks. er oprettet via kameraets kontrolelement, der nu refereres til som "appres://...", kan være så stor og have så høj en opløsning, som enhedens kamera kan håndtere. Opløsningen, rammehastigheden og andre attributter for mediefiler er ikke begrænset af datatypen, men specifikke kontrolelementer til afspilning og optagelse af medier kan have deres egne begrænsninger.

Alle datastørrelser er dog underlagt mængden af tilgængelig hukommelse i appen. Browsere, der kører på en stationær computer, understøtter typisk mere end 100 MB data. Mængden af tilgængelig hukommelse på en enhed, f.eks. en telefon, kan imidlertid være langt mindre, typisk i intervallet 30-70 MB. Du kan finde ud af, om appen kører inden for disse grænser, ved at teste almindelige scenarier på alle enheder, den skal køre på.

Den bedste fremgangsmåde er kun at opbevare data i hukommelsen så længe, det er nødvendigt. Upload billeder til en database, så snart du kan. Download kun billeder, når appens brugere anmoder om dem.

Tal og valuta

Datatyperne Tal og Valuta bruger IEEE 754-standarden for dobbelt præcision i flydende komma. Denne standard tilbyder et stort antal tal, du kan arbejde i, fra -1,79769 x 10308 til 1,79769 x 10308. Den mindste værdi, der kan repræsenteres, er 5 x 10-324.

Power Fx kan nøjagtigt repræsentere hele tal (eller heltal) mellem -9.007.199.254.740.991 (-(253 - 1)) og 9.007.199.254.740.991 (253 - 1), inklusive. Dette område er større end de 32 bit (eller 4 byte) heltalsdatatyper, som databaser normalt bruger. Power Fx kan dog ikke repræsentere 64-bit (eller 8 byte) heltalsdatatyper. Du kan gemme tallet i et tekstfelt eller bruge en beregnet kolonne til at oprette en kopi af tallet i et tekstfelt, så det er knyttes til datatypen Tekst i Power Fx. På denne måde kan du opbevare, få vist og angive disse værdier og sammenligne dem for at afgøre, om de er ens. Du kan dog ikke udføre numeriske beregninger på dem i denne formular.

Flydende tal-aritmetik er omtrentligt, så det kan nogen gange give uventede resultater med mange dokumenterede eksempler. Du vil måske forvente, at formlen 55/100 * 100 returnerer præcis 55, og (55/100 * 100)-55 returnerer præcis nul. Den sidste formel returnerer dog 7,1054 x 10-15, som er et lille tal, men ikke nul. Denne lille forskel medfører ikke normalt et problem, og appen runder den væk, når resultatet vises. Små forskelle kan dog sammensættes i efterfølgende beregninger og se ud til at give det forkerte svar.

Databasesystemer gemmer ofte valutaer og udfører beregninger ved hjælp af decimalmatematik, hvilket giver et mindre interval, men større kontrol over præcisionen. Som standard tilknytter Power Fx valutaer ind og ud af flydende værdier. Resultatet kan derfor være anderledes end beregninger, der er udført i en indbygget decimaldatatype. Hvis der opstår problemer med denne typeuoverensstemmelse, kan du f.eks. arbejde med disse værdier som Tekst på samme måde, som du kan med store heltal, der er beskrevet tidligere i dette afsnit.

Dato, Klokkeslæt og DateTime

Tidszoner

Dato- og klokkeslætsværdier falder i disse kategorier:

  • Brugers lokaltid : Disse værdier gemmes i UTC (Coordinated Universal Time), men app-brugerens tidszone påvirker, hvordan appen viser disse værdier, og hvordan de pågældende app-brugere angiver dem. Som eksempel vises det samme tidspunkt forskelligt for en bruger i Canada, end det vises for er en bruger i Japan.
  • Tidszoneuafhængig : Appen viser disse værdier på samme måde, og app-brugeren angiver dem på samme måde, uanset tidszone. Det samme tidspunkt vises på samme måde for en bruger i Canada, som det vises for er en bruger i Japan. App-forfattere, der ikke forventer, at deres apps køres i forskellige tidszoner, bruger disse værdier, da de er mere simple at bruge.

I denne tabel vises nogle eksempler:

Dato/klokkeslætstype Værdi gemt i databasen Værdi vist og indtastet 7 timer vest af UTC Værdi vist og indtastet 4 timer øst af UTC
Brugers lokaltid Søndag d. 19 maj 2019
4:00
Lørdag d. 18. maj 2019
21:00
Søndag d. 19 maj 2019
8:00
Tidszoneuafhængig Søndag d. 19 maj 2019
4:00
Søndag d. 19 maj 2019
4:00
Søndag d. 19 maj 2019
4:00

Når den bruges i Power Apps, bruger Power Fx for dato/klokkeslæt for Brugerlokal browserens eller enhedens tidszone, mens modelbaserede apps bruger brugerens indstilling i Dataverse. Disse indstillinger matcher typisk, men resultatet vil være forskellige, hvis disse indstillinger er forskellige.

Brug funktionerne DateAdd og TimeZoneInformation til at konvertere den lokale tid til UTC og tilbage igen. Se eksemplerne i slutningen af dokumentationen for disse funktioner.

Numeriske ækvivalenter

Power Fx indeholder og beregner alle dato-/klokkeslætsværdier, uanset om de er brugerlokale eller tidszoneuafhængige, i UTC. Appen oversætter værdierne på baggrund af app-brugerens tidszone, når de vises, og når app-brugeren angiver dem.

Når Power Fx læser en tidszoneuafhængig værdi fra en datakilde eller skriver en sådan værdi til en datakilde, justerer appen automatisk værdien for at kompensere for appbrugerens tidszone. Derefter behandler appen værdien som en UTC-værdi, som er konsistent med alle andre dato/klokkeslætsværdier i appen. På grund af denne kompensation vises den oprindelige Tidszoneuafhængige værdi, når appen justerer UTC-værdien for app-brugerens tidszone.

Du kan se denne funktionsmåde mere tydeligt ved at bruge funktionen Value til at få adgang til den underliggende numeriske værdi for en dato/klokkeslætsværdi. Denne funktion returnerer dato/klokkeslætsværdien som antallet af millisekunder siden 1. januar 1970 00:00:00.000 UTC.

Da alle dato/klokkeslætsværdier er i UTC-tid, returnerer formlen Value( Date( 1970, 1, 1 ) ) ikke nul i de fleste dele af verden, fordi Dato-funktionen returnerer en dato i UTC-tid. Formlen returnerer f.eks. 28.800.000 i en tidszone, der er forskudt fra UTC med otte timer. Dette tal afspejler antallet af millisekunder i otte timer.

Vend tilbage til eksemplet fra ovenfor:

Dato/klokkeslætstype Værdi gemt i databasen Værdi vist og indtastet 7 timer vest af UTC Funktionen Værdi returnerer
Brugers lokaltid Søndag d. 19 maj 2019
4:00
Lørdag d. 18. maj 2019
21:00
1,558,238,400,000
(Søndag d. 19 maj 2019
4:00 AM UTC)
Tidszoneuafhængig Søndag d. 19 maj 2019
4:00
Søndag d. 19 maj 2019
4:00
1,558,263,600,000
(Søndag d. 19 maj 2019
11:00 AM UTC)

Konvertering af UNIX-klokkeslæt

UNIX-klokkeslæt afspejler antallet af sekunder siden 1. januar 1970 00:00:00 UTC. Da Power Fx bruger millisekunder i stedet for sekunder, kan du konvertere mellem de to ved at gange eller dividere med 1.000.

UNIX-klokkeslæt viser f.eks. 9. september 2001 kl. 01:46:40 UTC som 1.000.000.000. Hvis du vil have vist dato-/klokkeslætsværdien som tekst, skal du gange tallet med 1.000 for at konvertere det til millisekunder og derefter bruge det i en tekstfunktion. Formlen Text( 1000000000 * 1000, DateTimeFormat.UTC ) returnerer strengen 2001-09-09T 01:46:40.000Z.

Denne funktion returnerer dog lørdag 8. september 2001 18:46:40, hvis du bruger DateTimeFormat. LongDateTime24 -formatet i en tidszone, hvor der er 7 timers forskydning fra UTC (7 timer vest i forhold til UTC). Resultatet viser værdien DateTime korrekt baseret på den lokale tidszone.

Hvis du vil konvertere til et UNIX-klokkeslæt, skal du dividere resultatet fra Værdi med 1.000:
RoundDown( Value( UnixTime ) / 1000, 0 )

Hvis du har brug for UNIX-klokkeslættet i en Dato-værdi for yderligere beregninger eller til at blive vist i Power Apps, skal du bruge denne formel:
DateAdd( Date( 1970,1,1 ), UnixTime, Seconds )

SQL Server

SQL Server har Datetime, Datetime2 og andre dato/klokkeslætsdatatyper, der ikke inkluderer en tidszone, og som ikke angiver, hvilken tidszone de er i. Power Fx antager, at disse værdier er gemt i UTC, og behandler dem som brugerlokale. Hvis værdierne skal være tidszoneuafhængige, der er korrekte til UTC-konvertering, skal du bruge funktionen TimeZoneOffset.

Power Fx bruger de medfølgende tidszoneoplysninger i Datetimeoffset-felter, når der konverteres en værdi til appens interne UTC-repræsentation. Apps bruger altid UTC som tidszone (nul tidszoneforskydning), når de skriver data.

Power Fx læser og skriver værdier for datatypen Tid i SQL Server som tekststrenge i ISO 8601-varighedsformatet. Du skal f.eks. fortolke strengformatet og bruge funktionen Time til at konvertere tekststrengen "PT2H1M39S" til en Time-værdi:

With( 
    Match( "PT2H1M39S", "PT(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ),
    Time( Value( hours ), Value( minutes ), Value( seconds ) )
)
// Result: 2:01 AM (as shown in a label control, use the Text function to see the seconds)

Blande dato- og klokkeslætsoplysninger

Dato, Klokkeslæt og DateTime har forskellige navne, men de indeholder alle de samme oplysninger om datoer og klokkeslæt.

En Dato-værdi kan indeholde oplysninger om klokkeslæt, som normalt er midnat. En Klokkeslæt-værdi kan indeholde datooplysninger, som normalt er 1. januar 1970. Dataverse gemmer også tidsoplysninger i et Kun dato-felt, men viser kun datooplysningerne som standard. På samme måde skelner Power Fx undertiden mellem disse datatyper for at bestemme standardformater og kontrolelementer.

Det anbefales ikke at tilføje og fratrække dato- og klokkeslætsværdier direkte, da tidszoner og andre konverteringer kan medføre forvirrende resultater. Du kan bruge funktionen Værdi til at konvertere dato/klokkeslætsværdier til millisekunder først og tage højde for app-brugerens tidszone, eller du kan bruge funktionerne DateAdd og DateDiff til at addere til eller subtrahere fra en af disse værdier.

Grupperede indstillinger og to indstillinger

Grupperede indstillinger og datatyper med to indstillinger angiver to eller flere valgmuligheder, en app-bruger kan vælge. En grupperet indstilling Ordrestatus kan f.eks. indeholde valgmulighederne Ny, Leveret, Faktureret og Lukket. Datatypen med to indstillinger giver kun to valgmuligheder.

I begge disse datatyper vises deres etiketter i en tekststrengkontekst. Et etiketobjekt viser f.eks. en af indstillingerne for ordrestatus, hvis kontrolelementets Tekst-egenskab er angivet til en formel, der refererer til den pågældende grupperede indstilling. Indstillingsetiketter kan være lokaliserede til app-brugere forskellige steder.

Når en app-bruger vælger en indstilling og gemmer ændringen, overfører appen dataene til databasen, som lagrer de pågældende data i en repræsentation, der er uafhængig af sproget. En indstilling i en grupperet indstilling overføres og gemmes som et tal, og en indstilling i en datatype med to indstillinger overføres og gemmes som en boolesk værdi.

Etiketterne er kun til visningsformål. Du kan ikke udføre direkte sammenligning med etiketterne, fordi de er specifikke for et bestemt sprog. I stedet har hver grupperet indstilling en optælling, der arbejder med det underliggende tal eller den booleske værdi. Du kan f.eks. ikke bruge denne formel:

If( ThisItem.OrderStatus = "Active", ...

Men du kan bruge denne formel:

If( ThisItem.OrderStatus = OrderStatus.Active, ...

I forbindelse med globale grupperede indstillinger (objekter, der er delt) matcher navnet på optællingens grupperede indstilling med navnet på den globale grupperede indstilling. I forbindelse med lokale grupperede indstillinger (som er beregnet til et objekt) kan navnet indeholde navnet på objektet. Denne funktionsmåde forhindrer konflikter, hvis der findes grupperede indstillinger med det samme navn i flere objekter. Objektet Firmaer kan f.eks. have en grupperet indstilling OrderStatus, og navnet kan være OrderStatus (Firmaer). Navnet indeholder et eller flere mellemrum og parenteser, så du skal omslutte det med enkelte anførselstegn, hvis du refererer til det i en formel.

Derudover kan værdier med to indstillinger også opføre sig som booleske værdier. En værdi for to indstillinger med navnet TaxStatus kan f.eks. have etiketter Afgiftspligtig og Ikke afgiftspligtig, som svarer til hhv. sand og falsk. Du kan f.eks. bruge denne formel:

If( ThisItem.Taxable = TaxStatus.Taxable, ...

Du kan også bruge denne tilsvarende formel:

If( ThisItem.Taxable, ...