Data types
Notitie
Microsoft Power Fx is de nieuwe naam voor de formuletaal van canvas-apps. Aan deze artikelen wordt gewerkt terwijl we de taal extraheren uit canvas-apps en deze integreren met andere Microsoft Power Platform-producten en het beschikbaar maken als open source. Begin met het Microsoft Power Fx-overzicht voor een inleiding in de taal.
Informatie stroomt door Microsoft Power Fx in kleine, discrete waarden, vergelijkbaar met de cellen van een spreadsheet. Gegevens in een veld Geboortedatum en een veld Verjaardag stromen allemaal als een Datum-waarde door die het jaar, de maand en de dag omvat. De app weet hoe deze waarden moeten worden opgemaakt, hoe de invoer wordt beperkt tot de geschikte informatie en hoe waarden worden gedeeld met een database. Geboortedatums zijn anders van verjaardagen, maar het systeem verwerkt ze op precies dezelfde manier. In dit geval is Datum een voorbeeld van een gegevenstype.
Dit artikel bevat details voor de gegevenstypen die Power Fx ondersteunt. Wanneer externe gegevens in de taal worden gebracht, wordt elk gegevenstype in die bron toegewezen aan een gegevenstype voor Power Fx.
| Gegevenstype | Beschrijving | Voorbeelden |
|---|---|---|
| Booleaans | Een true- of false-vraag. Kan direct worden gebruikt in Als, Filter en andere functies zonder vergelijking. | true |
| Kleur | Een kleurspecificatie, inclusief een alfakanaal. | Color.Red ColorValue( "#102030" ) RGBA( 255, 128, 0, 0.5 ) |
| Valuta | Een valutawaarde die is opgeslagen in een geval met een drijvende komma. Valutawaarden zijn hetzelfde als numerieke waarden met een valuta-opmaak. | 123 4.56 |
| Datum | Een datum zonder tijd in de tijdzone van de app-gebruiker. | Date( 2019, 5, 16 ) |
| DateTime | Een datum met een tijd in de tijdzone van de app-gebruiker. | DateTimeValue( "May 16, 2019 1:23:09 PM" ) |
| GUID | Een Globally Unique Identifier. | GUID() GUID( "123e4567-e89b-12d3-a456-426655440000" ) |
| Hyperlink | Een tekenreeks met een hyperlink. | "https://powerapps.microsoft.com" |
| Image | Een Universal Resource Identifier-tekenreeks (URI) naar een afbeelding in een .jpeg-, .png-, .svg-, .gif- of een andere veelgebruikte indeling voor webafbeeldingen. | MyImage toegevoegd als een app-resource "https://northwindtraders.com/logo.jpg" "appres://blobmanager/7b12ffa2..." |
| Media | Een URI-tekenreeks naar een video- of audio-opname. | MyVideo toegevoegd als een app-resource "https://northwindtraders.com/intro.mp4" "appres://blobmanager/3ba411c..." |
| Nummer | Een getal met drijvende komma. | 123 -4.567 8.903e121 |
| Optieset | Een keuze uit een reeks opties, ondersteund door een nummer. Dit gegevenstype combineert een lokaliseerbaar tekstlabel met een numerieke waarde. Het label verschijnt in de app en de numerieke waarde wordt opgeslagen en gebruikt voor vergelijkingen. | ThisItem.OrderStatus |
| Record | Een record met gegevenswaarden. Dit samengestelde gegevenstype bevat exemplaren van andere gegevenstypen die in dit onderwerp worden vermeld. Meer informatie: Werken met tabellen. | { Bedrijf: "Northwind Traders", Personeel: 35, NonProfit: false } |
| Referentie vastleggen | Een verwijzing naar een record in een entiteit. Dergelijke verwijzingen worden vaak gebruikt bij polymorfe zoekopdrachten. Meer informatie: Werken met verwijzingen. | First(Accounts).Owner |
| Table | Een tabel met records. Alle records moeten dezelfde namen hebben voor hun velden met dezelfde gegevenstypen en weggelaten velden worden behandeld als leeg. Dit samengestelde gegevenstype bevat exemplaren van andere gegevenstypen die in dit onderwerp worden vermeld. Meer informatie: Werken met tabellen. | Tabel( { FirstName: "Sidney", LastName: "Higa" }, { FirstName: "Nancy", LastName: "Anderson" } ) |
| Tekst | Een Unicode-tekenreeks. | "Hallo wereld" |
| Tijd | Een tijd zonder datum in de tijdzone van de app-gebruiker. | Time( 11, 23, 45 ) |
| Twee opties | Een keuze uit een reeks van twee opties, ondersteund door een booleaanse waarde. Dit gegevenstype combineert een lokaliseerbaar tekstlabel met een booleaanse waarde. Het label verschijnt in de app en de booleaanse waarde wordt opgeslagen en gebruikt voor vergelijkingen. | ThisItem.Taxable |
Veel van deze gegevenstypen zijn vergelijkbaar en hebben dezelfde onderliggende weergave, zoals een veld Hyperlink dat wordt behandeld als Text. De aanvullende gegevenstypen zorgen voor betere standaardervaringen in formulieren en andere besturingselementen.
Blank
Alle gegevenstypen kunnen een lege waarde hebben (met andere woorden, geen waarde). De term "null" wordt voor dit concept vaak gebruikt in databases.
Gebruik de functie Blank met de functie Set of Patch om een variabele of veld in te stellen op leeg. Met Bijvoorbeeld, Set( x, Blank() ) verwijdert u bijvoorbeeld elke waarde in de globale variabele x.
Test op een lege waarde met de functie IsBlank. Vervang mogelijk lege waarden door niet-lege waarden met de functie Coalesce.
Omdat alle gegevenstypen leeg ondersteunen, hebben de gegevenstypen Booleaans en Twee opties in feite drie mogelijke waarden.
Text, Hyperlink, Image en Media
Al deze vier gegevenstypen zijn gebaseerd op een Unicode-tekenreeks.
Ingesloten tekst
Ingesloten tekenreeksen in een formule staan tussen dubbele aanhalingstekens. Gebruik twee dubbele aanhalingstekens samen om een één dubbel aanhalingsteken in de tekenreeks weer te geven. Overweeg het gebruik van bijvoorbeeld de volgende formule in de eigenschap OnSelect van een besturingselement Button:
Notify( "Jane said ""Hello, World!""" )
dit resulteert in een banner wanneer de knop wordt ingedrukt, waarbij de eerste en laatste dubbele aanhalingstekens worden weggelaten (omdat ze de tekenreeks afscheiden) en de herhaalde dubbele aanhalingstekens rond Hallo Wereld! worden vervangen door enkel dubbele quotes:

Enkele aanhalingstekens worden niet gebruikt voor identificatienamen die speciale tekens bevatten en geen betekenis hebben binnen een tekenreeks.
Afbeeldings- en mediaresources
Via het menu File kunt u afbeeldings-, video- en audiobestanden toevoegen als app-resources. De naam van het geïmporteerde bestand wordt de resourcenaam in de app. In deze afbeelding wordt het Northwind Traders-logo, dat nwindlogo wordt genoemd, toegevoegd aan een app:

Als u deze resource in een app wilt gebruiken, specificeert u deze in de eigenschap Afbeelding van een besturingselement Image:

URI's voor afbeeldingen en andere media
U kunt een beetje verdergaan met dat laatste voorbeeld door de eigenschap Tekst van een besturingselement Label in te stellen op nwindlogo. Het label toont een tekenreeks:

Power Fx verwijst naar elke afbeelding of elk ander mediabestand, of het nu in de cloud is of als app-resource is toegevoegd, door middel van een URI-tekstreeks.
De eigenschap Afbeelding bijvoorbeeld van een afbeeldingsbesturingselement accepteert niet alleen app-resources, maar ook koppelingen naar afbeeldingen op internet, zoals "https://northwindtraders.com/logo.jpg". De eigenschap accepteert ook inline afbeeldingen die gebruikmaken van het schema met gegevens-URI-'s, zoals in dit voorbeeld:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFAQMAAACtnVQoAAAABlBMVEUAAAB0J3UMNU6VAAAAAXRSTlMAQObYZgAAABRJREFUCNdjUGJgCGVg6GgAkkA2AA8/AffqCEBsAAAAAElFTkSuQmCC"
Deze URI geeft een opgeschaalde versie weer van twee paarse diamanten:

U kunt de meest recente afbeelding weergeven die is vastgelegd in een besturingselement Camera als u de eigenschap Afbeelding van een afbeeldingsbesturingselement instelt op de eigenschap Photo van het camerabesturingselement. De app bevat de afbeelding in het geheugen en de Foto-eigenschap van jet camerabesturingselementen retourneert een URI-verwijzing naar de afbeelding. U maakt bijvoorbeeld een foto en de eigenschap Foto van de camera stuurt dit terug: "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1".
U gebruikt een URI om te verwijzen naar een afbeelding of een ander mediabestand dat is opgeslagen in een database. Op die manier haalt de app de feitelijke gegevens pas op als ze nodig zijn. Een bijlage in een Microsoft Dataverse-entiteit stuurt bijvoorbeeld "appres://datasources/Contacts/table/..." terug. Net als in het cameravoorbeeld, kunt u deze afbeelding weergeven door de eigenschap Afbeelding van een afbeeldingsbesturingselement in te stellen op deze referentie, die de binaire gegevens ophaalt.
Wanneer u een mediagegevenstype, zoals een afbeelding, opslaat in een database, verzendt de app de daadwerkelijke afbeelding of mediagegevens, niet de URI-referentie.
Maximale grootte
Als tekenreeksen en URI's hebben deze gegevenstypen geen vooraf ingestelde limiet voor hun lengte.
De binaire gegevens waarnaar deze gegevenstypen verwijzen, hebben ook geen vooraf ingestelde limiet voor grootte. Een afbeelding bijvoorbeeld die is vastgelegd met het camerabesturingselement waarnaar nu wordt verwezen als "appres://...", kan resolutie hebben met een hoogte en breedte als de camera van het apparaat aankan. De resolutie, framesnelheid en andere kenmerken van mediabestanden worden niet beperkt door het gegevenstype, maar specifieke besturingselementen voor het afspelen en vastleggen van media hebben mogelijk hun eigen beperkingen.
Alle gegevensgroottes zijn echter afhankelijk van de hoeveelheid beschikbaar geheugen in de app. Browsers die op een desktopcomputer draaien, ondersteunen doorgaans meer dan 100 megabytes aan gegevens. De hoeveelheid beschikbaar geheugen op een apparaat zoals een telefoon kan echter veel lager zijn, meestal in het bereik van 30-70 megabytes. Test algemene scenario's op alle apparaten waarop deze moet worden uitgevoerd om te bepalen of uw app binnen deze limieten werkt.
Pas de goede gewoonte toe om gegevens niet langer dan nodig in het geheugen te bewaren. Upload afbeeldingen zo snel mogelijk naar een database; download afbeeldingen alleen wanneer de gebruiker van de app daarom vraagt.
Getal en valuta
De gegevenstypen Getal en Valuta gebruiken de IEEE 754-standaard voor zwevende kommagetallen met dubbele precisie. Deze norm biedt een groot aantal getallen om mee te werken, van –1,79769 x 10308 tot 1,79769 x 10308. De kleinste waarde die kan worden weergegeven is 5 x 10–324.
Power Fx kan exact hele getallen (of gehele getallen) weergeven tussen –9.007.199.254.740.991 (- (253 - 1)) en 9.007.199.254.740.991 (253 - 1), inclusief. Dit bereik is groter dan de integer-gegevenstypen met 32-bits (of 4-bytes) die databases vaak gebruiken. Power Fx kan echter geen 64-bits (of 8-bytes) gegevenstypen voor gehele getallen weergeven. U kunt het getal in een tekstveld opslaan of een berekende kolom gebruiken om een kopie van het getal in een tekstveld te maken, zodat het wordt toegewezen aan het gegevenstype Tekst in Power Fx. Op deze manier kunt u deze waarden vasthouden, weergeven en invoeren, en ze vergelijken om te bepalen of ze gelijk zijn; u kunt er in dit formulier echter geen numerieke berekeningen op uitvoeren.
Drijvende-kommaberekeningen zijn bij benadering, dus het kan soms onverwachte resultaten opleveren met veel gedocumenteerde voorbeelden. Je zou verwachten dat de formule 55 / 100 * 100 precies 55 retourneert en dat (55 / 100 * 100) - 55 precies nul retourneert. De laatste formule retourneert echter 7,1054 x 10–15, die klein is maar niet nul. Dat kleine verschil veroorzaakt normaal gesproken geen probleem en de app rondt het af bij het tonen van het resultaat. Kleine verschillen kunnen echter in latere berekeningen samenkomen en lijken dan het verkeerde antwoord te geven.
Databasesystemen slaan vaak valuta's op en voeren decimale berekeningen uit, wat een kleiner bereik maar meer controle over de precisie biedt. Standaard wijzen Power Fx-apps valuta's toe aan en uit drijvende-kommawaarden; daarom kan het resultaat verschillen van berekeningen die zijn uitgevoerd in een native decimaal gegevenstype. Als dit type discrepantie problemen veroorzaakt, kunt u met deze waarden werken als Tekst, zoals u dat kunt doen met grote gehele getallen die eerder in deze sectie zijn beschreven.
Datum, Tijd en DateTime
Tijdzones
Datum-/tijdwaarden vallen in deze categorieën:
- Gebruikersinstelling: deze waarden zijn opgeslagen in UTC (Coordinated Universal Time ), maar de tijdzone van de app-gebruiker heeft invloed op hoe de app deze waarden toont en hoe de app-gebruiker ze specificeert. Zo ziet hetzelfde moment er voor een gebruiker in Canada anders uit dan voor een gebruiker in Japan.
- Tijdzone-onafhankelijk: de app geeft deze waarden op dezelfde manier weer en de app-gebruiker specificeert ze op dezelfde manier, ongeacht de tijdzone. Hetzelfde moment ziet er voor een gebruiker in Canada anders uit dan voor een gebruiker in Japan. App-auteurs die niet verwachten dat hun apps in verschillende tijdzones worden uitgevoerd, gebruiken deze waarden omdat ze over het algemeen eenvoudiger zijn.
Deze tabel toont enkele voorbeelden:
| Type Datum/tijd | Waarde opgeslagen in de database | Waarde weergegeven en 7 uur ten westen van UTC ingevoerd | Waarde weergegeven en 4 uur ten oosten van UTC ingevoerd |
|---|---|---|---|
| Gebruikersinstelling | Zondag, 19 mei 2019 4:00 uur |
Zaterdag, 18 mei 2019 21:00 uur |
Zondag, 19 mei 2019 8:00 uur |
| Tijdzone-onafhankelijk | Zondag, 19 mei 2019 4:00 uur |
Zondag, 19 mei 2019 4:00 uur |
Zondag, 19 mei 2019 4:00 uur |
Indien gebruikt in Power Apps gebruikt Power Fx voor datum/tijden van Gebruiker lokaal de tijdzone van de browser of het apparaat, maar modelgestuurde apps gebruiken de gebruikersinstelling in Dataverse. Deze instellingen komen doorgaans overeen, maar de resultaten kunnen verschillen als deze instellingen verschillen.
Gebruik de functies DateAdd en TimeZoneInformation om lokale tijd om te zetten naar UTC en weer terug. Zie de voorbeelden aan het einde van de documentatie voor deze functies.
Numerieke equivalenten
Power Fx bevat en berekent alle datum/tijd-waarden, Gebruiker lokaal of Tijdzone-onafhankelijk in UTC. De app vertaalt de waarden op basis van de tijdzone van de app-gebruiker wanneer ze worden weergegeven en wanneer de app-gebruiker ze specificeert.
Wanneer Power Fx een Tijdzone-onafhankelijke waarde van een gegevensbron leest of een dergelijke waarde naar een gegevensbron schrijft, past de app de waarde automatisch aan om te compenseren voor de tijdzone van de gebruiker van de app. De app behandelt de waarde vervolgens als een UTC-waarde, consistent met alle andere datum-/tijdwaarden in de app. Vanwege deze compensatie verschijnt de originele tijdzone-onafhankelijke waarde wanneer de app de UTC-waarde aanpast voor de tijdzone van de app-gebruiker.
U kunt dit gedrag nauwkeuriger observeren door de functie Value te gebruiken om toegang te krijgen tot de onderliggende numerieke waarde voor een datum-/tijdwaarde. Deze functie retourneert de datum-/tijdwaarde als het aantal milliseconden sinds 1 januari 1970 00:00:00.000 UTC.
Omdat elke datum-/tijdwaarde in UTC wordt gehouden, zal de formule Value( Date( 1970, 1, 1 ) ) in de meeste delen van de wereld niet nul opleveren omdat de functie Date een datum in UTC retourneert. De formule retourneert bijvoorbeeld 28.800.000 in een tijdzone die acht uur is verschoven ten opzichte van UTC. Dat aantal weerspiegelt het aantal milliseconden in acht uur.
Terugkomend op het voorbeeld hierboven:
| Type Datum/tijd | Waarde opgeslagen in de database | Waarde weergegeven en 7 uur ten westen van UTC ingevoerd | Functie Value functie geeft |
|---|---|---|---|
| Gebruikersinstelling | Zondag, 19 mei 2019 4:00 uur |
Zaterdag, 18 mei 2019 21:00 uur |
1,558,238,400,000 (Zondag, 19 mei 2019 4:00 AM UTC) |
| Tijdzone-onafhankelijk | Zondag, 19 mei 2019 4:00 uur |
Zondag, 19 mei 2019 4:00 uur |
1,558,263,600,000 (Zondag, 19 mei 2019 11:00 AM UTC) |
Unix-tijden converteren
Unix-tijden geven het aantal seconden weer sinds 1 januari 1970 00:00:00 UTC. Omdat Power Fx milliseconden gebruikt in plaats van seconden, kunt u tussen de twee converteren door te vermenigvuldigen of te delen door 1.000.
Unix-tijd toont bijvoorbeeld 9 september 2001 om 01:46:40 UTC als 1.000.000.000. Om die datum/tijdwaarde als tekst weer te geven, vermenigvuldigt u dat getal met 1.000 om het in milliseconden om te zetten, en gebruikt u het vervolgens in een Tekst-functie. De formule Text( 1000000000 * 1000, DateTimeFormat.UTC ) retourneert de tekenreeks 2001-09-09T01:46:40.000Z.
Die functie geeft echter Zaterdag 8 september, 2001 18:46:40 als u de indeling DateTimeFormat.LongDateTime24 gebruikt in een tijdzone die -7 uur verschoven is ten opzichte van UTC (7 uur ten westen van UTC). Dit resultaat toont correct de DateTime-waarde op basis van de lokale tijdzone.
Om te converteren naar een Unix-tijd deelt u het resultaat van Waarde door 1.000:
RoundDown( Value( UnixTime ) / 1000, 0 )
Als u de Unix-tijd nodig hebt als een Datum-waarde voor verdere berekeningen of weergave binnen Power Apps, gebruikt u deze formule:
DateAdd( Date( 1970,1,1 ), UnixTime, Seconds )
SQL Server
SQL Server heeft Datetime, Datetime2 en andere gegevenstypen voor datum/tijd die geen tijdzoneverschuiving bevatten en niet aangeven in welke tijdzone ze zich bevinden. Power Fx gaat ervan uit dat deze waarden worden opgeslagen in UTC en behandelt ze als Gebruiker lokaal. Als de waarden bedoeld zijn als tijdzone-onafhankelijk, corrigeert u ze voor de UTC-omzettingen met de functie TimeZoneOffset.
Power Fx gebruikt de meegeleverde tijdzonegegevens in Datetimeoffset-velden bij het converteren van een waarde naar de interne UTC-weergave van de app. De apps gebruiken altijd UTC als tijdzone (nul tijdzoneverschuiving) wanneer ze gegevens schrijven.
Power Fx leest en schrijft waarden van het gegevenstype Tijd in SQL Server als tekstreeksen in het Duurformaat volgens ISO 8601. Ontleed bijvoorbeeld de volgende tekenreeksindeling en gebruik de functie Time om de tekenreeks 'PT2H1M39S' te converteren naar een tijd-waarde:
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)
Datum- en tijdinformatie mengen
Datum, Tijd en DateTime hebben verschillende namen, maar ze bevatten allemaal dezelfde informatie over datums en tijden.
Een Datum-waarde kan tijdinformatie bevatten, die meestal middernacht is. Een Tijd-waarde kan datuminformatie bevatten, die gewoonlijk 1 januari 1970 is. Dataverse slaat ook tijdinformatie op met een veld Alleen datum maar toont standaard alleen de datuminformatie. Power Fx maakt soms ook onderscheid tussen deze gegevenstypen om standaardindelingen en besturingselementen te bepalen.
Het optellen en aftrekken van datum- en tijdwaarden wordt niet aanbevolen omdat tijdzones en andere conversies verwarrende resultaten kunnen geven. Gebruik de functie Value om datum/tijd-waarden eerst naar milliseconden te converteren en rekening te houden met de tijdzone van de app-gebruiker, of gebruik de functies DateAdd en DateDiff om op te tellen of af te trekken met een van deze waarden.
Optiesets en Twee opties
Optiesets en gegevenstypen met twee opties bieden een app-gebruiker twee of meer keuzes. Een optieset Bestelstatus biedt bijvoorbeeld de keuzes Nieuw, Verzonden, Gefactureerd en Gesloten. Het gegevenstype met twee opties biedt slechts twee keuzes.
Beide gegevenstypen tonen hun labels in een tekenreekscontext. Een labelbesturingselement toont bijvoorbeeld een van de orderstatusopties als de eigenschap Tekst van het besturingselement is ingesteld op een formule die verwijst naar optieset. Optielabels zijn mogelijk gelokaliseerd voor app-gebruikers op verschillende locaties.
Wanneer een app-gebruiker een optie selecteert en die wijziging opslaat, verzendt de app de gegevens naar de database, die de gegevens opslaat in een taalonafhankelijke weergave. Een optie in een optieset wordt verzonden en opgeslagen als een getal, en een optie in een gegevenstype met twee opties wordt verzonden en opgeslagen als een booleaanse waarde.
De labels zijn alleen voor weergavedoeleinden. U kunt geen directe vergelijkingen maken met de labels omdat ze specifiek zijn voor een taal. In plaats daarvan heeft elke optieset een opsomming die werkt met het onderliggende getal of de booleaanse waarde. U kunt deze formule bijvoorbeeld niet gebruiken:
If( ThisItem.OrderStatus = "Active", ...
Maar u kunt wel deze formule gebruiken:
If( ThisItem.OrderStatus = OrderStatus.Active, ...
Voor globale optiesets (die entiteiten delen), komt de naam van de opsomming van de optieset overeen met de naam van de globale optieset. Voor lokale optiesets (die zijn gericht op een entiteit), kan de naam de entiteitnaam bevatten. Dit gedrag voorkomt conflicten als meerdere entiteiten optiesets hebben met dezelfde naam. Bijvoorbeeld de entiteit Accounts kan een optieset OrderStatus hebben, en de naam zou OrderStatus(Accounts) kunnen zijn. Die naam bevat een of meer spaties en haakjes, dus u moet deze tussen enkele aanhalingstekens plaatsen als u ernaar verwijst in een formule.
Bovendien kunnen waarden met twee opties zich ook gedragen als booleaanse waarden. De waarde met twee opties TaxStatus kan de labels hebben Belastbaar en Niet-belastbaar hebben, die overeenkomen met true en false. Gebruik deze formule om dit te demonstreren:
If( ThisItem.Taxable = TaxStatus.Taxable, ...
U kunt ook deze gelijkwaardige formule gebruiken:
If( ThisItem.Taxable, ...