Datatyper
Anteckning
Microsoft Power Fx är det nya namnet på formelspråket för arbetsyteappar. Dessa artiklar är ett arbete som pågår när vi extraherar språket från appar, integrerar det med andra Microsoft Power Platform produkter och gör det tillgängligt som öppen källkod. Börja med Microsoft Power Fx översikten för en introduktion till språket.
Informationen passerar genom Microsoft Power Fx i små, diskreta värden, precis som cellerna i ett kalkylblad. Till exempel data i fältet Födelsedag och fältet Årsdag skulle till exempel kunna passera som värdet Datum som omfattar året, månaden och dagen. Appen vet hur de här värdena ska formateras, begränsar indata till vad som passar för varje och delar värden med en databas. Födelsedagar skiljer sig från årsdagarna till människor, men systemet hanteras på exakt samma sätt. I det här fallet är Datum är ett exempel på en datatyp.
Den här artikeln innehåller information om de datatyper som Power Fx stöder. När externa data förs in i språket mappas varje datatyp i den källan till en datatyp för Power Fx.
| Datatyp | Beskrivning | Exempel |
|---|---|---|
| Boolean | Ett värde för true eller false. Kan användas direkt i If, filter och andra funktioner utan jämförelse. | true |
| Färg | En färgspecifikation, inklusive en alfakanal. | Color.Red ColorValue( "#102030" ) RGBA( 255, 128, 0, 0.5 ) |
| Valuta | Ett valutavärde som lagras i ett flyttal. Valutavärden är samma som numeriska värden med alternativ för valutaformat. | 123 4.56 |
| Datum | Ett datum utan tid, i tidszonen för programmets användare. | Date( 2019, 5, 16 ) |
| DatumTid | Ett datum med en tid, i tidszonen för programmets användare. | DateTimeValue( "May 16, 2019 1:23:09 PM" ) |
| GUID | En globalt unik identifierare. | GUID() GUID( "123e4567-e89b-12d3-a456-426655440000" ) |
| Hyperlänk | En textsträng som innehåller en hyperlänk. | "https://powerapps.microsoft.com" |
| Bild | En Universal Resource Identifier (URI) textsträng till en bild i .jpeg, .png, .svg, .gif eller or något annat vanligt webbbildformat. | Mina bilder har lagts till som en programresurs "https://northwindtraders.com/logo.jpg" "appres://blobmanager/7b12ffa2..." |
| Medium | En URI-textsträng till en inspelning med video eller ljud. | MyVideo har lagts till som en programresurs "https://northwindtraders.com/intro.mp4" "appres://blobmanager/3ba411c..." |
| Antal | Ett flyttalsnummer. | 123 -4,567 8.903e121 |
| Alternativuppsättning | Ett alternativ från en uppsättning alternativ, med ett nummer. Den här datatypen kombinerar en lokaliserad textetikett med ett numeriskt värde. Etiketten visas i appen och det numeriska värdet lagras och används för jämförelser. | ThisItem.OrderStatus |
| Post | En post med datavärden. Den här sammansatta datatypen innehåller instanser av andra datatyper som visas i det här ämnet. Mer information: Arbeta med tabeller. | { Company: "Northwind Traders", Staff: 35, NonProfit: false } |
| Postreferens | En referens till en post i en entitetspost. Sådana referenser används ofta med polymorfa uppslag. Mer information: Arbeta med referenser. | First(Accounts).Owner |
| Table | En tabell med poster. Alla poster måste ha samma namn för sina fält som har samma datatyper och utelämnade fält behandlas som tomma. Den här sammansatta datatypen innehåller instanser av andra datatyper som visas i det här ämnet. Mer information: Arbeta med tabeller. | Table( { FirstName: "Sidney", LastName: "Higa" }, { FirstName: "Nancy", LastName: "Anderson" } ) |
| Text | En Unicode-textsträng. | "Hello, World" |
| Time | En tid utan ett datum, i tidszonen för programmets användare. | Time( 11, 23, 45 ) |
| Två alternativ | Ett alternativ från en uppsättning med två alternativ, med ett booleskt värde. Den här datatypen kombinerar en lokaliserad textetikett med ett boolesk värde. Etiketten visas i appen och det booleska värdet lagras och används för jämförelser. | ThisItem.Taxable |
Många av dessa data typer är likartade och har samma underliggande representation, t.ex. Hyperlänk som behandlas som Text. De ytterligare datatyperna ger bättre standardupplevelser i formulär och andra kontroller.
Blank
Alla datatyper kan ha ett tomt värde tom (d.v.s. inget värde). Termen "null" används ofta i databaser för det här konceptet.
Använd funktionen Blank med Set eller Patch för att ange en variabel eller ett fält som tomt. Om du till exempel Set( x, Blank() ) tas alla värden i den globala variabeln x.
Testa ett tomt värde genom att använda funktionen IsBlank . Ersätt möjliga tomma värden med icke-tomma värden med hjälp av funktionen Coalesce.
Eftersom alla datatyper är tomma, kommer datatyperna Boolesk och Två alternativ i praktiken tre möjliga värden.
Text, hyperlänk, bild och media
Alla fyra datatyperna bygger på en Unicode textsträng.
Inbäddad text
Inbäddade textsträngar i en formel omges av dubbla citattecken. Använd två dubbla citattecken tillsammans för att representera samma dubbla citattecken i textsträngen. Du kan till exempel använda följande formel i egenskapen OnSelect för kontrollen knapp:
Notify( "Jane said ""Hello, World!""" )
resulterar i en banderoll när knappen trycks ned, där det första och sista dubbla citattecknen utelämnas (när de begränsar textsträngen) och de upprepade dubbla citattecknen runt Hej världen! ersätts med ett enkelt dubbelt citattecken:

Enkla citattecken används inte för namn på identifierare som innehåller specialtecken och som inte har någon betydelse inom en textsträng.
Bild- och medieresurser
Via Arkiv-menyn kan du lägga till bild-, video- och ljudfiler som appresurser. Namnet på den importerade filen blir resursnamnet i appen. I det här grafikobjektet har Northwind Traders-logotypen med namnet nwindlogo, har lagts till i en app:

Om du vill använda den här resursen i en app anger du den i egenskapen Bild i kontroll Bild:

URI för bilder och andra media
Du kan göra en del av det senaste exemplet lite djupare genom att ange egenskapen Text för en Etikett kontroll till nwindlogo. Etiketten visar en textsträng:

Power Fx refererar till varje bild eller annan mediefil, oavsett om den finns i molnet eller läggs till som en appresurs, med en URI-textsträng.
Till exempel egenskapen Image för en bildkontroll accepterar till exempel inte bara appresurser utan även länkar till bilder på webben, t.ex. "https://northwindtraders.com/logo.jpg". Egenskapen accepterar även inbyggda bilder som använder data-URI-schemat, som i det här exemplet:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFAQMAAACtnVQoAAAABlBMVEUAAAB0J3UMNU6VAAAAAXRSTlMAQObYZgAAABRJREFUCNdjUGJgCGVg6GgAkkA2AA8/AffqCEBsAAAAAElFTkSuQmCC"
Denna URI visar en uppskalad version av två lila diamanter:

Du kan visa den senaste bilden som fångades in i en kamerakontroll om du anger egenskapen bild för en bildkontroll till egenskapen foto för kamerakontrollen. Appen lagrar bilden i minnet och egenskapen foto för kamerakontrollen returnerar en URI-referens till bilden. Du kan till exempel ta en bild och kamerans egenskap foto kan returnera "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1".
Du använder en URI för att referera till en bild eller en annan mediefil som lagras i en databas. På så sätt hämtar inte appen faktiska data förrän de behövs. En bifogad fil i en Microsoft Dataverse-entitet kan till exempel returnera "appres://datasources/Contacts/table/..." som i ett kameraexempel kan du visa bilden genom egenskapen Bild för en bildkontroll till den här referensen, vilket hämtar binära data.
När du sparar en mediedatatyp, t.ex. en bild, i en databas skickar appen själva bilden eller medieinformationen, inte URI-referensen.
Storleksbegränsningar
Som textsträngar och URI:er har de här datatyperna ingen förinställd begränsning av längden.
De binära data som datatyperna refererar till har inte heller någon förinställd gräns för storlek. En bild som du har hämtat via kamerakontrollen som nu har refererats som "appres://..." kan vara lika stor och hög upplösning eftersom enhetens kamera kan finnas. Upplösning, bildrutehastighet och andra attribut för mediefiler är inte begränsade av datatypen, men specifika kontroller för uppspelning och hämtning av media kan ha egna begränsningar.
Mängden tillgängligt minne i appen påverkas emellertid av alla datastorlekar. Webbläsare som körs på en stationär dator har vanligtvis stöd för mer än 100 MB data. Mängden tillgängligt minne på en enhet, t.ex. en telefon, kan emellertid vara mycket lägre, vanligtvis inom intervallet 30-70 megabyte. Om du vill avgöra om appen kommer att köras inom dessa gränser testar du vanliga scenarier på alla enheter som det ska köras på.
Du bör endast lagra data i minnet om det behövs. Överför bilder till en databas så fort du kan. Hämta endast bilder när appens användare begär dem.
Tal och valuta
Datatyperna Tal och Valuta använder den inbyggda IEEE 754 bitarsstandarden för dubbel precision. Den här standarden innehåller ett stort antal tal att arbeta i, från –1,79769 x 10308 till 1,79769 x 10308. Det minsta värdet som kan representeras är 5 x 10– 324.
Power Fx kan exakt representera heltal (eller heltal) mellan –9,007,199,254,740,991 (–(253 – 1)) och 9,007,199,254,740,991 (253 – 1), inklusive. Det här intervallet är större än de 32-bitars (eller 4 byte) heltals datatyperna som databaser använder ofta. Power Fx kan dock inte representera 64-bitars (eller 8 byte) heltalsdatatyper. Du kanske vill lagra numret i ett textfält eller använda en beräknad kolumn för att göra en kopia av numret i ett textfält så att det mappas till en datatyp Text i Power Fx. På det här sättet kan du hålla i, visa och ange dessa värden och jämföra dem för att avgöra om de är likvärdiga eller inte. Men du kan inte göra numeriska beräkningar på dem i det här formuläret.
Aritmetiskt flyttal är ungefärliga, så det kan ibland ge oväntade resultat med många dokumenterade exempel. Du kan förvänta dig att formeln 55 / 100 * 100 för att returnera exakt 55 och (55 / 100 * 100) - 55 för att returnera exakt noll. Den senare formeln returnerar dock 7,1054 x 10–15, som är liten men inte noll. Att den här små skillnaden vanligen orsakar ett problem och att appen avrundar den bort när resultatet visades. Små skillnader kan emellertid vara desamma i framtida beräkningar och visas för att ge fel svar.
I databassystem lagras ofta valutor och beräkningar med decimal matematik, vilket ger ett mindre intervall men bättre kontroll över precisionen. Som standard mappar Power Fx-appar valutor i och ut ur flyttalsvärden. Därför kan resultatet skilja sig från beräkningar som görs med den ursprungliga decimaldatatypen. Om den här typen av skillnader orsakar problem kanske du vill arbeta med dessa värden som Text, på samma sätt som du kan med stora heltal som beskrivs ovan i det här avsnittet.
Datum, tid och DateTime
Tidszoner
Datum/tid-värden faller i följande kategorier:
- Användarlokalt: dessa värden lagras i UTC (Coordinated Universal Time), men tidszonen för appens användare påverkar hur appen visar dessa värden och hur appens användare anger dem. Som ett exempel ser samma sak annorlunda ut för en användare i Kanada än den gör till en användare i Japan.
- Oberoende av tidszon: appen visar dessa värden på samma sätt och appanvändaren anger samma ordning, oavsett tidszon. Samma ögonblick verkar på samma sätt för en användare i Kanada som för en användare i Japan. Appförfattare som inte förväntar sig att appar ska köras i olika tidszoner använder dessa värden eftersom de är enklare att göra.
I den här tabellen visas några exempel:
| Datum/tidstyp | Värde som lagras i databasen | Värdet visas och anges 7 timmars väster om UTC | Värdet visas och anges 4 timmars öster om UTC |
|---|---|---|---|
| Användarlokalt | Sunday, May 19, 2019 04:00 |
Saturday, May 18, 2019 21:00 |
Sunday, May 19, 2019 08:00 |
| Tidszonsoberoende | Sunday, May 19, 2019 04:00 |
Sunday, May 19, 2019 04:00 |
Sunday, May 19, 2019 04:00 |
När den används i Power Apps, för Lokal användare datum/tid använder Power Fx tidszonen för webbläsaren eller enheten, men modellsbaserade appar använder användarens inställning i Dataverse. Inställningarna överensstämmer oftast med varandra, men resultatet blir annorlunda om inställningarna skiljer sig.
Använd funktionerna DateAdd och TimeZoneInformation för att konvertera lokal tid till UTC och tillbaka igen. Se exemplen i slutet av dokumentationen för de här funktionerna.
Numeriska motsvarigheter
Power Fx håller och beräknar alla datum- och tidsvärden, oavsett Lokal användare or Tidszonsoberoende i UTC. Appen översätter värdena utifrån appanvändarens tidszon när de visar dem och när appen användare anger dem.
När Power Fx läser värdet Tidszonsoberoende från en datakälla eller skriver ett sådant värde till en datakälla, justerar appen automatiskt värdet för att kompensera för appens användares tidszon. Appen behandlar sedan värdet som ett UTC-värde, konsekvent med alla andra datum/tid-värden i appen. På grund av denna kompensation visas det ursprungliga tidszonoberoende värdet när appen justerar UTC-värdet för appanvändarens tidszon.
Du kan observera detta beteende närmare med hjälp av funktionen Value för att få tillgång till underliggande numeriska värdet för ett datum/tid-värde. Funktionen returnerar datum/tid-värdet som antalet millisekunder sedan 1 januari 1970 00:00:00.000 UTC.
Eftersom alla datum/tid-värden lagras i UTC returnerar formeln Value( Date( 1970, 1, 1 ) ) inte noll i de flesta delar av världen eftersom funktionen Datum returnerar ett datum i UTC. Formeln skulle till exempel returnera 28,800,000 i en tidszon som förskjuts från UTC med åtta timmar. Detta tal visar antalet millisekunder på åtta timmar.
Gå tillbaka till vårt exempel ovan:
| Datum/tidstyp | Värde som lagras i databasen | Värdet visas och anges 7 timmars väster om UTC | Funktionen Värde returnerar |
|---|---|---|---|
| Användarlokalt | Sunday, May 19, 2019 04:00 |
Saturday, May 18, 2019 21:00 |
1,558,238,400,000 (Sunday, May 19, 2019 4:00 AM UTC) |
| Tidszonsoberoende | Sunday, May 19, 2019 04:00 |
Sunday, May 19, 2019 04:00 |
1,558,263,600,000 (Sunday, May 19, 2019 11:00 AM UTC) |
Konvertera UNIX-tider
UNIX-tider motsvarar antalet sekunder sedan 1 januari 1970 00:00:00 UTC. Eftersom Power Fx använder millisekunder i stället för sekunder kan du konvertera mellan de två genom att räkna om med 1 000.
UNIX-tid visar till exempel 9 september 2001, klockan 01:46:40 UTC som 1000000,000. Om du vill visa värdet för datum och tid som text måste du räkna antalet med 1 000 för att konvertera det till millisekunder och sedan använda det i funktionen Text. Formeln Text( 1000000000 * 1000, DateTimeFormat.UTC ) returneras strängen 2001-09-09T01:46:40.000Z.
Funktionen returnerar emellertid Saturday, September 8, 2001 18:46:40 om du använder formatet DateTimeFormat.LongDateTime24 i en tidszon som har 7 timmars förskjutning från UTC (7 timmar väster om UTC). Det här resultatet visar att DateTime-värdet är korrekt baserat på den lokala tidszonen.
Om du vill konvertera till en Unix-tid delar du resultatet från värde med 1 000:
RoundDown( Value( UnixTime ) / 1000, 0 )
Om du behöver Unix-tid i ett datum-värde för ytterligare beräkningar eller visning i Power Apps använder du följande formel:
DateAdd( Date( 1970,1,1 ), UnixTime, Seconds )
SQL Server
SQL Server har Datetime, Datetime2 och andra data typer för datum och tid som inte innehåller någon tidszonsförskjutning och som inte anger vilken tidszon de befinner sig i. Power Fx antar att dessa värden lagras i UTC och används som lokal användare. Om värdena är tänkta att vara tidszonsoberoende ska du korrigera för UTC-översättningarna med hjälp av funktionen TimeZoneOffset.
Power Fx använder den medföljande tidszonsinformationen i fälten Datetimeoffset när ett värde konverteras appens interna UTC-representation. Appar använder alltid UTC-tid som tidszon (nolltid för zonförskjutning) när de skriver data.
Power Fx läser och skriver värden av datatypen Tid i SQL Server som textsträngar i ISO 8601 varaktighetsformatet. Du måste t.ex. tolka det här strängformatet och använda funktionen Time för att konvertera textsträngen "PT2H1M39S" till ett värde Tid:
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)
Mixa information om datum och tid
Datum, Tid och DateTime har olika namn, men alla innehåller samma information om datum och tid.
Ett Datum värde kan innehålla tidsinformation med det, vanligtvis midnatt. Ett Tid värde kan bära datuminformation, som vanligtvis är 1 januari 1970. Dataverse lagrar även tidsinformation med ett fält Endast datum endast datuminformation visas som standard. På samma sätt skiljer Power Fx mellan dessa datatyper för att fastställa standardformat och kontroller.
Det är inte viktigt att du lägger till och subtraherar värden för datum och tid direkt, eftersom tids zoner och andra konverteringar kan orsaka förvirrande resultat. Använd antingen funktionen Värde för att först konvertera datum/tidsvärden till millisekunder och ta hänsyn till appanvändarens tidszon eller använda DateAdd och DateDiff för att lägga till eller ta bort från ett av dessa värden.
Alternativ uppsättningar och två alternativ
Alternativ uppsättningar och datatyper med två alternativ tillhandahåller ett eller flera alternativ för att välja en appanvändare. Till exempel Orderstatus kunna erbjuda alternativen Ny, Levererad, Fakturerad och Stängd. Med den här datatypen kan du bara välja mellan två alternativ.
Båda dessa datatyper visar sina etiketter i en textsträngkontext. En etikettkontroll visar t.ex. ett av alternativen för orderstatus om kontrollens egenskap Text anges till en formel som refererar till den alternativuppsättningen. Alternativetiketter kan vara lokaliserade för AppData på olika platser.
När en appanvändare väljer ett alternativ och sparar den ändringen skickar appen data till databasen, där informationen lagras i en representation som är oberoende av språket. Ett alternativ i en alternativuppsättning överförs och lagras som ett tal och ett alternativ i en datatyp i två alternativ överförs och lagras som ett booleskt värde.
Etiketterna är endast avsedda som visningssyften. Det går inte att utföra direkta jämförelser med etiketterna eftersom de är specifika för ett språk. I stället har varje alternativuppsättning en uppräkning som fungerar med underliggande tal eller booleskt värde. Du kan till exempel inte använda den här formeln:
If( ThisItem.OrderStatus = "Active", ...
Men du kan använda den här formeln:
If( ThisItem.OrderStatus = OrderStatus.Active, ...
För globala alternativuppsättningar (t.ex. entitetsdelning), motsvarar namnet på den globala alternativuppsättning namnet för en alternativuppsättning. För lokala alternativuppsättningar (som är begränsade till en entitet) kan namnet innehålla entitetens namn. På så sätt undviker du konflikter om flera entiteter har samma namn. Till exempel entiteten Konton kan ha en alternativuppsättning OrderStatus och dess namn kan vara OrderStatus (Accounts). Namnet innehåller ett eller flera blanksteg och parenteser, så du måste omge det med enkla citattecken om du refererar till det i en formel.
Dessutom kan värden med två alternativ också fungera som booleska värden. Ett tvåsiffrigt värde med namnet TaxStatus kan ha etiketter Taxable och Non-Taxable vilka motsvarar true och false. För att visa kan du använda den här formeln:
If( ThisItem.Taxable = TaxStatus.Taxable, ...
Du kan också använda den motsvarande formeln:
If( ThisItem.Taxable, ...