Typy danych

Uwaga

Microsoft Power Fx to nowa nazwa języka formuł dla aplikacji kanw. Te artykuły są pracą w toku, gdyż stale wyodrębniamy język z aplikacji kanw, integrujemy go z innymi produktami Microsoft Power Platform i udostępniamy jako rozwiązanie open source. Zacznij od przeglądu Microsoft Power Fx, aby znaleźć wprowadzenie do języka.

Informacje przepływają przez aplikację w postaci małych i dyskretnych wartości, podobnie jak komórki w arkuszu kalkulacyjnym. Na przykład dane znajdujące się w polu Urodziny i Rocznice będą przepływać w programie jako wartość Data i obejmują rok, miesiąc i dzień. Aplikacja wskazuje, jak formatować te wartości, ograniczyć zakres danych wejściowych dla każdego z nich i udostępnić te wartości w bazie danych programu. Urodziny różnią się od rocznicy dla osoby, która świętuje, ale system obsługuje je w dokładnie taki sam sposób. W tym przypadku Data jest przykładowym typem danych.

W tym artykule zamieszczono szczegółowe informacje dotyczące typów danych, które obsługują aplikacje kanwy. Kiedy aplikacja łączy się z zewnętrznym źródłem danych, każdy typ danych w tym źródle jest mapowany do typu danych w aplikacji kanwy.

Typ danych Opis Przykłady
Logiczny Wartość true lub false. Może być używana bezpośrednio, m.in. w funkcjach If lub Filter bez porównywania. prawda
Kolor Specyfikacja kolorów, w tym kanał alfa. Color.Red
ColorValue( "#102030" )
RGBA( 255, 128, 0, 0.5 )
Waluta Wartość waluty przechowywana w liczbie zmiennoprzecinkowej. Wartości waluty są takie same, jak wartości liczbowe z opcjami formatowania waluty. 123
4.56
Date Data bez godziny w strefie czasowej użytkownika aplikacji. Date(16.05.2019)
Data/godzina Data z podaną godziną w strefie czasowej użytkownika aplikacji. DateTimeValue ("16 maja, 2019 roku 13:23:09")
Dziesiętne Liczba o wysokiej dokładności, 10 operacji podstawowych i ograniczony zakres. 123
Dziesiętne( „1,2345” )
Identyfikator GUID Unikatowy globalny identyfikator. GUID()
GUID( "123e4567-e89b-12d3-a456-426655440000" )
Hiperlink Ciąg tekstowy, który zawiera hiperłącze. "https://powerapps.microsoft.com"
Image Ciąg tekstowy identyfikatora URI (Universal Resource Identifier)do obrazu w formacie JPEG, PNG, SVG, GIF lub innego typowego formatu obrazu sieci Web. MyImage dodane jako zasób aplikacji
"https://northwindtraders.com/logo.jpg"
"appres://blobmanager/7b12ffa2..."
Multimedia Ciąg tekstowy identyfikatora URI do nagrania wideo lub audio. MyVideo dodane jako zasób aplikacji
"https://northwindtraders.com/intro.mp4"
"appres://blobmanager/3ba411c..."
Liczba lub Zmiennoprzecinkowa Liczba o standardowej dokładności, 2 operacji podstawowych i szeroki zakres. 123
8.903e121
1.234e200
Opcja wyboru Wybór z zestawu opcji oraz numer. Ten typ danych służy do łączenia lokalizowalnych etykiet tekstowych z wartościami liczbowymi. Etykieta zostanie wyświetlona w aplikacji, a wartość liczbowa jest przechowywana i używana do porównywania. ThisItem.OrderStatus
Rekord Rekord wartości danych. Ten typ danych złożonych zawiera wystąpienia innych typów danych wymienione w tym temacie. Więcej informacji: Praca z tabelami. { Company: "Northwind Traders",
Personel: 35,
NonProfit: false }
Odwołanie do rekordu Odwołanie do rekordu w tabeli. Takie odwołania są często używane z wyszukiwaniami polimorficznymi. Więcej informacji: Praca z odwołaniami. First(Accounts).Owner
Table Tabela rekordów. Wszystkie rekordy muszą mieć te same nazwy w polach o tych samych typach danych, a pominięte pola są traktowane jako puste. Ten typ danych złożonych zawiera wystąpienia innych typów danych wymienione w tym temacie. Więcej informacji: Praca z tabelami. Table( { FirstName: "Sidney",
LastName: "Higa" },
{ FirstName: "Nancy",
LastName: "Anderson" } )
Tekst Ciąg tekstowy w formacie Unicode. "Hello, World"
Time Godzina bez daty w strefie czasowej użytkownika aplikacji. Czas( 11, 23, 45 )
Dwie opcje Wybór z zestawu dwóch opcji oraz wartość logiczna. Ten typ danych służy do łączenia lokalizowalnych etykiet tekstowych z wartościami logicznymi. Etykieta zostanie wyświetlona w aplikacji, a wartość logiczna jest przechowywana i używana do porównywania. ThisItem.Taxable
Obiekt bez typu Obiekt niezadeklarowanego typu. Bazowy obiekt może być dowolnym istniejącym typem i może być konwertowany na kompatybilne typy za pomocą funkcji takich jak Boolean(), Value(), Table() itd. Aby uzyskać więcej informacji, zobacz Obiekt bez typu i Praca z JSON. ParseJSON("{ ""Field"" : 1234 }").Field

Wiele z tych typów danych jest podobnych i ma te same reprezentacje podstawowe, na przykład pole Hiperłącze jest traktowane jako Tekst. Dodatkowe typy danych umożliwiają korzystanie z lepszych ustawień domyślnych w formularzach i innych formantach.

Blank

Wszystkie typy danych mogą mieć wartość pustą (innymi słowy, brak wartości). Termin "null" jest często używany w bazach dla określenia omawianego konceptu.

Użyj funkcji Blank razem z funkcją Set lub Patch, aby nadać zmiennej lub polu wartość puste. Na przykład Set( x, Blank() ) powoduje usunięcie wszelkich wartości ze zmiennej globalnej x.

Można sprawdzić wartość puste za pomocą funkcji IsBlank. Zastąpienie możliwych pustych wartości wartościami niepustymi jest możliwe za pomocą Coalesce.

Ze względu na fakt, że wszystkie typy danych obsługują wartość puste, typy danych Boolean oraz Dwie opcje mają tak naprawdę trzy wartości.

Wszystkie cztery te typy danych są oparte na ciągu tekstowym Unicode.

Osadzony tekst

Osadzone ciągi tekstowe w formule są ujęte w cudzysłowy podwójne. Użyj dwóch cudzysłowów podwójnych razem, aby przedstawić podwójny cudzysłów w łańcuchu tekstowym. Można na przykład użyć następującej formuły we właściwości po OnSelect danego formantu Button:

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

wyświetla banner po naciśnięciu przycisku. w którym cudzysłów pierwszy i ostatni są pomijane (gdyż ograniczają tekst), a powtórzone podwójne cudzysłowy wyświetlane dookoła Hello, World! są zastępowane pojedynczym cudzysłowem:

powiadomienie z wiadomością, że Jane powiedziała

Cudzysłowy są używane w przypadku nazw identyfikatorów zawierających znaki specjalne, które nie wpływają na specjalnie ciąg tekstowy.

Interpolacja ciągów

Korzystanie z ciągów w celu osadzenia formuł w ciągu tekstowym. Jest to często łatwiejsze w obsłudze i wizualizacji danych wyjściowych niż przy użyciu funkcji Concatenate lub operatora &.

Prefiks ciągu tekstowego znakiem dolara $ i ujmij formułę, która ma być osadzona w nawiasach {}. Aby dołączyć do ciągu tekstowego ciąg tekstowy, użyj powtarzających się nawiasów: {{ lub }}. Interpolacji ciągów można używać wszędzie tam, gdzie można użyć standardowego ciągu tekstowego.

Rozważmy na przykład tę formułę ze zmiennymi globalnymi Jabłka ustawioną na 3 i Banany ustawioną na 4:

$"We have {Apples} apples, {Bananas} bananas, yielding {Apples+Bananas} fruit total."

W tym formułie są zwracane ciąg tekstowy: Mamy 3 apples i 4 banany, co daje 7 owoców łącznie. Zmienne Jabłka i Banany są w tekście w miejsce nawiasów klamrowych wraz z wynikiem formuły matematycznej Jabłka+Banany. Spacje i inne znaki w nawiasach są zachowane w takich postaciach, w których są.

Wbudowane formuły mogą zawierać wszystkie funkcje lub operatory. Wynika to z tego, że w wyniku formuły można na przykład na przykład utworzyć ciąg tekstowy. Na przykład ta formuła wstawi NickName, jeśli jest podany, lub FirstName, jeśli nie, w powitaniu:

$"Welcome {Coalesce( NickName, FirstName )}, it's great to meet you!" )

Jeśli parametr NickName ma wartość „Joe”, ta formuła generuje ciąg tekstowy Witaj Joe, miło Cię poznać!. Jeśli jednak NickName jest pusta, a FirstName to "Joseph", wtedy ta formuła daje zamiast tego Drogi Joseph, miło Cię poznać!.

Interpolacja ciągów może obejmować standardowe ciągi tekstowe w osadzonej formule. Na przykład, jeśli nie podano ani NickName ani FirstName, nadal moglibyśmy podać "Przyjaciel" jako substytut:

$"Welcome {Coalesce( NickName, FirstName, "Friend" )}!"

Ciągi mogą być nawet zagnieżdżone. Rozważ ten przykład, w którym nazwy Imię, Drugie imię i Nazwisko są połączone w powitanie. Nawet jeśli jedna lub dwie z tych wartości są puste, między częściami nazwy będzie się znaleźć poprawna liczba spacji. Jeśli żadna z części nie zostanie podana, interpolacja wewnętrznego ciągu zostanie zwinięta do pustego ciągu i zostanie zastąpiona przez funkcję Coalesce przez „Przyjaciel”.

$"Welcome {Coalesce( Trim( $"{First} {Middle} {Last}"}), "Friend" )}!"
Pierwsze Drugie Nazwisko Wynik
Jan Qunicy Doe Welcome John Quincy Doe!
Jan puste Doe Welcome John Doe!
puste puste Doe Welcome Doe!
puste puste puste Welcome Friend!

Nowe wiersze

Osadzone ciągi tekstowe mogą zawierać znaki nowej linii. Na przykład rozważ ustawienie właściwości Text kontrolki Label na następujące:

"Line 1
Line 2
Line 3"

Powyższy formuła zawiera trzy wiersze widoczne w kontrolce etykiety:

Wbudowany ciąg tekstowy i formant etykiety przedstawiający trzy wiersze z wierszem 1, wierszem 2 i wierszem 3.

Znaki nowej linii są również obsługiwane z interpolacją ciągów, jak pokazano poniżej:

$"Line {1}
Line {1+1}
Line {1+1+1}"

Powyższa formuła powoduje, że wyniki są takie same:

Formuła interpolacji ciągów i kontrola etykiet przedstawiająca trzy wiersze z wierszem 1, wierszem 2 i wierszem 3.

Zasoby obrazów i multimediów

Za pośrednictwem menu Plik można dodawać pliki obrazów, filmów i audio jako zasoby aplikacji. Nazwa zaimportowanego pliku stanie się nazwą zasobu w aplikacji. Na tej grafice logo Northwind Traders o nazwie nwindlogo zostało dodane do aplikacji:

Zasób Northwind.

Aby użyć tego zasobu w aplikacji, należy go określić we właściwości Image formantu typu Image:

Obraz Northwind.

Identyfikatory URI dla obrazów i innych multimediów

W ostatnim przykładzie przejdziemy nieco głębiej, ustawiając właściwość Text formantu Label na wartość nwindlogo. Etykieta zawiera łańcuch tekstowy:

Tekst Northwind.

Aplikacje kanwy odwołują się do poszczególnych obrazów lub innych plików multimedialnych, zarówno w chmurze, jak i dodawanych jako zasoby aplikacji za pomocą ciągu tekstowego URI.

Na przykład właściwość Image formantu typu obraz akceptuje nie tylko zasoby aplikacji, ale również łącza do tych samych obrazów w sieci Web, na przykład "https://northwindtraders.com/logo.jpg". Właściwość akceptuje również wbudowane obrazy, które korzystają ze schematu identyfikatora URI danych, tak jak w poniższym przykładzie:

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

W tym identyfikatorze URI jest wyświetlana powiększona wersja dwóch purpurowych karo:

Podwójne diamenty.

Ostatnio zapisany obraz można wyświetlić w formancie Camera, jeśli właściwość formantu Image jest ustawiona na wartość Photo w ustawieniach aparatu. Aplikacja zapisuje obraz w pamięci, a właściwość Photo formantu aparatu zwraca odwołanie do tego obrazu w postaci identyfikatora URI. Na przykład można zrobić zdjęcie i właściwość Photo aparatu mogłaby zwrócić następujący ciąg "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1".

Identyfikator URI jest używany do odwoływania się do tego obrazu lub innego pliku multimedialnego, który jest przechowywany w bazie danych programu. W ten sposób aplikacja nie pobiera rzeczywistych danych do momentu, gdy będzie to rzeczywiście konieczne. Na przykład załącznik w tabeli Microsoft Dataverse może zwrócić "appres://datasources/Contacts/table/..." Tak jak w przykładzie z kamerą, możesz wyświetlić ten obraz, ustawiając właściwość Image kontrolki obrazu do tego odwołania, która pobiera dane binarne.

Kiedy typ danych multimedialnych, np. obraz, jest wysyłany do bazy danych, aplikacja przesyła rzeczywisty obraz lub dane multimedialne, a nie odwołanie do identyfikatora URI.

Limity rozmiarów

W przypadku ciągów tekstowych i identyfikatorów URI te typy danych nie mają wstępnie ustawionych ograniczeń długości.

Dane binarne, do których odnoszą się te typy danych, nie mają wstępnie ustawionego limitu rozmiaru. Na przykład obraz przechwycony przez formant aparatu, który jest obecnie przywoływany jako "appres://...", może być tak duży i wysoki, jak tylko aparat fotograficzny może obsłużyć. Rozpoznawanie, liczba klatek na sekundę i inne atrybuty plików multimedialnych nie są ograniczone przez typ danych, ale specyficzne formanty umożliwiające odtwarzanie i przechwytywanie multimediów mogą mieć własne ograniczenia.

Jednak wszystkie rozmiary danych są uzależnione od ilości pamięci dostępnej w aplikacji. Przeglądarki działające na komputerze stacjonarnym zwykle obsługują więcej niż 100 megabajtów danych. Jednakże ilość dostępnej pamięci na urządzeniu takim jak telefon może być znacznie niższa. Zazwyczaj mówimy o zakresie 30-70 megabajtów. Aby określić, czy aplikacja będzie uruchamiana w ramach tych ograniczeń, należy przetestować typowe scenariusze na wszystkich urządzeniach, w których ma zostać uruchomiona.

Najlepszym rozwiązaniem jest przechowywanie danych w pamięci tylko tak długo, jak jest to konieczne. Przekaż obrazy do bazy danych, jak tylko będzie to możliwe; pobierz tylko te obrazy, których zażądają aplikacje użytkownika.

Liczby

Uwaga

Power Apps obsługuje tylko liczbę zmiennoprzecinkową w dniu dzisiejszym i jest to typ wszystkich liczb. Dziesiętne — obsługa zostanie wkrótce dodana.

Power Fx obsługuje dwa rodzaje liczb: Liczba dziesiętna i i Liczba zmiennoprzecinkowa (z synonimami Liczba i Waluta).

Liczba dziesiętna jest najlepsza w przypadku większości obliczeń biznesowych. Może dokładnie przedstawiać liczby w wartościach podstawowych 10, które 0.1 może dokładnie reprezentować i nie będą podatne na błędy zaokrąglania podczas obliczeń. Posiada on tak duży zakres na tyle duży, że można w nim uzyskać dokładność do 1028 cyfr do 28 cyfr. Liczba dziesiętna jest domyślnym typem danych liczbowych dla większości hostów Power Fx, używanym w przypadku zapisu 2*2.

Zmiennoprzecinkowy jest najlepszym rozwiązaniem do obliczeń wykonywania obliczeń. Może przedstawiać liczby w znacznie większym zakresie do 10308. Dokładność jest ograniczona do 15 miejsc dziesiętnych, a zatem oparta na bazie 2 i nie może dokładnie reprezentować typowych wartości dziesiętnych. Zmiennoprzecinkowa ma również wyższą wydajność i jest preferowana, jeśli nie jest to czynnikiem i dokładnością.

Numery dziesiętne

Typ danych Dziesiętne najczęściej korzysta z typu danych dziesiętnych .NET. Niektóre hosty, na przykład kolumny formuł Dataverse uruchamiane w programie SQL Server, używają typu danych dziesiętnych programu SQL Server.

Liczba dziesiętna działa w sposób poznany w podstawówce i używa 10 cyfr podstawowych. Jest to bardzo ważne, aby uniknąć błędów zaokrąglania z bardzo małych różnic, które mogą się gromadzić podczas używania podstawowego 2 oprogramowania (używanego przez Liczbę zmiennoprzecinkową).

Zakres od dodatnich 79,228,162,514,264,337,593,543,950,335 do ujemnych 79,228,162,514,264,337,593,543,950,335. Separator dziesiętny można umieścić w dowolnym miejscu w obrębie tych liczb, podając dokładność do 28 cyfr. Wciąż jest dokładnie przedstawiany. Na przykład 79 228 162 514 264,337593543950335 może być dokładnie reprezentowany jako 7,9228162514264337593543950335.

Liczby zmiennoprzecinkowe

Typ danych Zmiennoprzecinkowe, zwane także jako Numer lub Waluta, używa standardowego punktu zmiennoprzecinkowego o podwójnej dokładności IEEE 754. Ten standard zawiera bardzo duży zakres liczb, w których można pracować, od –1,79769 x 10308 do 1.79769 x 10308. Najmniejszą wartość, która może być reprezentowana, wynosi 5 x 10 –324.

Liczba zmiennoprzecinkowa może dokładnie reprezentować liczby całkowite (lub liczby całkowite) między wartościami –9 007 199 254 740 991 (–(253 – 1)) a 9 007 199 254 740 991 (253 – 1) — włącznie. Jest to wartość większa niż 32-bitowa (lub 4-bajtowa) liczba całkowita liczbowych typów danych, które zwykle są używane przez bazy danych. Aplikacje kanwy nie mogą jednak reprezentować 64-bitowych (lub ośmiobitowych) liczb całkowitych. Użytkownik może chcieć zapisać liczbę w polu tekstowym lub użyć kolumny obliczanej w celu skopiowania numeru w polu tekstowym, tak aby został zamapowany do typu danych Tekst w aplikacji kanwy. W ten sposób można zatrzymywać, wyświetlać i wprowadzać te wartości, a także porównywać je w celu ustalenia, czy są równe; nie można jednak wykonywać na nich obliczeń numerycznych w tym formularzu.

Arytmetyka zmiennoprzecinkowa jest przybliżona, więc zdarza się, że czasami otrzymywane są nieoczekiwane wyniki w wielu udokumentowanych przykładach. Można oczekiwać, że formuła 55 / 100 * 100 zwróci dokładnie 55, a formuła zwróci (55 / 100 * 100) - 55 dokładnie zero. Natomiast druga formuła zwraca wartość 7,1054 x 10 –15 – wartość niską, ale nie zero. Mała różnica zazwyczaj nie powoduje problemu, a aplikacja zaokrągla wynik. Małe różnice mogą jednak nakładać się w kolejnych obliczeniach i odpowiedzi mogą wydawać się niewłaściwe.

Systemy baz danych często przechowują waluty i realizują obliczenia za pomocą liczb dziesiętnych, które oferują mniejszy zakres, ale większą kontrolę nad precyzją. Domyślnie aplikacje kanwy mapują waluty w programie i poza wartościami zmiennoprzecinkowymi; z tego powodu wyniki mogą różnić się od obliczeń wykonanych w środowisku, gdzie typ danych dziesiętnych jest wartością natywną. Jeśli ten typ rozbieżności spowoduje problemy, może wystąpić konieczność pracy z tymi wartościami jako Tekstem, podobnie jak w przypadku dużej liczby liczb całkowitych opisanych wcześniej w tej sekcji.

Wartości domyślne i konwersje

Uwaga

Power Apps obsługuje tylko liczbę zmiennoprzecinkową w dniu dzisiejszym i jest to typ wszystkich liczb. Dziesiętne — obsługa zostanie wkrótce dodana.

W większości hostów Power Fx domyślnie są używane miejsca dziesiętne. Jego skutki:

  • Liczby dosłowne w formułach. Liczba 1.234 będzie interpretowana jako wartość dziesiętna. Na przykład formuła 1.234 * 2 będzie interpretować 1.234 i 2 jako Dziesiętne i zwróci wynik dziesiętny.
  • Funkcja Value. Value( "1.234" ) zwróci wartość dziesiętną. Na przykład formuła Value( "1.234" ) * 2 funkcji Wartość zinterpretuje zawartość ciągu tekstowego "1.234" jako Dziesiętne.

Do pracy z wartościami Zmiennoprzecinkowy jest używana funkcja Zmiennoprzecinkowa. Rozszerzenie powyższego przykładu Float( 1.234 ) przekonwertuje Dziesiętne1.234 na Zmiennoprzecinkowe. Zmiennoprzecinkowe może także służyć jako zamiennik w przypadku wartości w celu konwersji ciągu zawierającego liczbę zmiennoprzecinkową, taką jak Float( "1.234" ) na wartość Zmiennoprzecinkowa, która jest wymagana, jeśli numer nie może być reprezentowany jako Dziesiętne.

Podsumowując:

Sposób użycia Dziesiętne Zmiennoprzecinkowe
Liczby dosłowne w formułach 1.234 Float( 1.234 )
Float( "1.234" )
Konwersja z ciągu tekstowego Value( "1.234" )
Decimal( "1.234" )
Float( "1.234" )
Konwersja między typami numerycznmi Decimal( float ) Float( decimal )
Konwersja na ciąg tekstowy Text( decimal ) Text( float )

Mieszanie typów numerycznych

Wartości zmiennoprzecinkowe i Dziesiętne można łatwo mieszać. W przypadku mieszania wartości dziesiętne są konwertowane na wartości zmiennoprzecinkowe ze względu na większy zakres. Ponieważ może to spowodować utratę dokładności, ważne jest, aby nie łączyć ich bez potrzeby. Ponieważ typ danych dziesiętnych jest domyślnym typem dosłownym, a większość funkcji liczbowych pozwala zachować ten typ, można łatwo uniknąć przenoszenia go do bez potrzeby przechodzenia do pola Zmiennoprzecinkowe.

Na przykład rozważ następujące obliczenia, używając pac power-fx repl po instalacji Power Platform CLI. Ponieważ obie liczby to Liczba dziesiętna, obliczenia są wykonywane z przecinkiem dziesiętnym, a w wyniku zachowywana jest pełna dokładność:

>> 1.0000000000000000000000000001 * 2
2.0000000000000000000000000002

Jeśli zamiast tego drugi element został zmieniony na Zmiennoprzecinkowe, wówczas całe obliczenie zostanie wykonane na wartości Zmiennoprzecinkowa, a część ułamkowa zostanie utracona:

>> 1.0000000000000000000000000001 * Float(2)
2

Data, godzina oraz DateTime

Strefy czasowe

Wartości daty i godziny są objęte tymi kategoriami:

  • Użytkownik lokalny: te wartości są przechowywane w formacie UTC (skoordynowany czas uniwersalny), ale strefa czasowa użytkownika aplikacji ma wpływ na sposób, w jaki aplikacja wyświetla te wartości i sposób ich określania przez użytkownika aplikacji. Na przykład, ten sam moment wygląda inaczej dla użytkownika w Kanadzie, niż dla użytkownika w Japonii.
  • Niezależne od strefy czasowej: aplikacja zawiera te wartości w taki sam sposób, jak użytkownicy aplikacji określają je. Ten sam moment wygląda tak samo dla użytkownika w Kanadzie, jak dla użytkownika w Japonii. Autorzy aplikacji, którzy nie oczekują, że ich aplikacje są uruchamiane w różnych strefach czasowych, używają tych wartości, ponieważ są one prostsze.

W poniższej tabeli przedstawiono kilka przykładów:

Typ daty/godziny Wartość zapisana w bazie danych programu Wyświetlana i wprowadzona wartość to 7 godzin na zachód od UTC Wyświetlana i wprowadzona wartość to 4 godzin na wschód od UTC
Lokalny użytkownik Niedziela,maj19,2019
04:00
Sobota,18 maja2019
21:00
Niedziela,maj19,2019
08:00
Niezależne od strefy czasowej Niedziela,maj19,2019
04:00
Niedziela,maj19,2019
04:00
Niedziela,maj19,2019
04:00

W przypadku daty/godziny typu Użytkownik lokalny aplikacja kanwy używa strefy czasowej przeglądarki lub urządzenia, ale aplikacje oparte na modelu używają ustawień użytkownika w programie Dataverse. Te ustawienia są zwykle zgodne, ale jeśli te ustawienia się różnią, wyniki mogą być różne.

Korzystając z funkcji DateAdd i TimeZoneInformation można konwertować czas lokalny na UTC i na odwrót. Zapoznaj się z przykładami na końcu dokumentacji tych funkcji.

Ekwiwalenty liczbowe

Aplikacje kanwy przechowują i obliczają wszystkie wartości daty/godziny, albo w formacie Lokalny użytkownika albo Niezależne od strefy czasowej w czasie UTC. Aplikacja tłumaczy wartości na podstawie strefy czasowej użytkownika podczas ich wyświetlania i kiedy użytkownicy aplikacji określą je.

Kiedy aplikacja kanwy odczytuje wartość typu Niezależne od strefy czasowej ze źródła danych lub zapisuje taką wartość w źródle, aplikacja automatycznie koryguje wartość, biorąc pod uwagę strefę czasową użytkownika aplikacji. Aplikacja traktuje wartość jako wartość czasu UTC, zgodnie ze wszystkimi innymi wartościami daty/godziny w aplikacji. Z uwagi na ten szacunek, oryginalna wartość Niezależne od strefy czasowej jest wyświetlana, gdy aplikacja dostosowuje wartość czasu UTC do strefy czasowej użytkownika.

Zachowanie to można dokładniej obserwować, korzystając z funkcji Value, w celu uzyskania dostępu do pierwotnej wartości numerycznej dla wartości data/godzina. Ta funkcja zwraca wartość data/godzina jako liczbę milisekund od 1 stycznia 1970 roku godz. 00:00:00.000 czasu UTC.

Ponieważ każda wartość daty/godziny jest przechowywana w formacie UTC, formuła Value ( Data( 1970, 1, 1) ) nie zwraca zera w większości części świata, ponieważ funkcja Date zwraca datę w formacie UTC. Na przykład formuła zwraca 28,800,000 w strefie czasowej, która jest przesunięta względem UTC o osiem godzin. Liczba ta odzwierciedla liczbę milisekund zawierającą się w ośmiu godzinach.

Powrót do naszego przykładu z wcześniej:

Typ daty/godziny Wartość zapisana w bazie danych programu Wyświetlana i wprowadzona wartość to 7 godzin na zachód od UTC Zwroty funkcji Value
Lokalny użytkownik Niedziela,maj19,2019
04:00
Sobota,18 maja2019
21:00
1,558,238,400,000
(Niedziela,maj19,2019
4:00 rano UTC)
Niezależne od strefy czasowej Niedziela,maj19,2019
04:00
Niedziela,maj19,2019
04:00
1,558,263,600,000
(Niedziela,maj19,2019
11:00 rano UTC)

Konwertowanie godzin systemu UNIX

Czas w systemie UNIX odzwierciedla liczbę sekund od, która upłynęła od dnia 1 stycznia 1970 00:00:00 czasu UTC. Ponieważ aplikacje kanwy korzystają z milisekund, a nie sekund, można dokonać konwersji pomiędzy nimi, mnożąc lub dzieląc je przez 1000.

Na przykład system UNIX pokazuje datę 9 września 2001 roku, 01:46:40 UTC jako 1 000 000 000. Aby wyświetlić tę wartość data/czas w aplikacji kanwy należy pomnożyć tę liczbę przez 1000, aby przekonwertować ją na milisekundy, a następnie użyć jej w funkcji Text. Formuła Tekst( 1000000000 * 1000, DateTimeFormat.UTC ) zwraca ciąg 2001-09-09T01:46:40.000Z.

Jednak ta funkcja zwraca datę Sobota, 8 września, 2001 roku, godz. 18:46:40, jeśli zostanie użyty format DateTimeFormat.LongDateTime24 w strefie czasowej przesuniętej o 7 godzin w stosunku od czasu UTC (7 godzin na zachód od UTC). W wyniku tego wartość DateTime jest wyświetlana w sposób poprawny na podstawie lokalnej strefy czasowej.

Aby przeprowadzić konwersję na czas systemu UNIX, należy podzielić wynik z encji Wartość o 1000:
RoundDown( Value( UnixTime ) / 1000, 0 )

Jeśli czas systemu UNIX jest potrzebny w wartości Data na potrzeby dalszych obliczeń lub wyświetlenia w programie Power Apps, należy użyć następującej formuły:
DateAdd( Date( 1970,1,1 ), UnixTime, Seconds )

SQL Server

Program SQL Server zawiera wartości DateTime, Datetime2 i inne typy danych data/godzina, które nie zawierają kompensacji przesunięcia strefy czasowej i nie wskazują strefy czasowej, w której znajduje się użytkownik. Aplikacje kanwy zakładają, że te wartości są zapisane w formacie UTC i są traktowane jako Lokalne dla użytkownika. Jeśli wartości mają być niezależne od strefy czasowej, należy wprowadzić wyrównanie do UTC za pomocą funkcji TimeZoneOffset.

Aplikacje kanwy używają zawartych w polu Datetimeoffset informacji o strefie czasowej, aby konwertować wartość na wewnętrzną wartość aplikacji w UTC. Aplikacje zawsze używają czasu UTC jako strefy czasowej (brak przesunięcia strefy czasowej) przy zapisywaniu danych.

Aplikacje kanwy odczytują i zapisują wartości Czas w programie SQL Server jako ciągi tekstowe w formacie czasu trwania ISO 8601. Na przykład należy przeanalizować ten format ciągu i użyć funkcji Time, aby przekonwertować ciąg tekstowy "PT2H1M39S" na wartość Czas:

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)

Mieszanie informacji o dacie i godzinie

Data, Godzina i wartość DateTime mają różne nazwy, ale są w nich przechowywane te same informacje o datach i godzinach.

Wartość Data może zawierać także informacje o godzinie – zwykle jest to północ. Wartość Czas może zawierać informację o dacie – zwykle jest to 1 stycznia 1970. W Dataverse także przechowywane są informacje o czasie zawierającym pole Tylko data, ale domyślnie są widoczne tylko informacje o dacie. Podobnie aplikacje kanwy niekiedy odróżniają te typy danych w celu określenia domyślnych formatów i formantów.

Bezpośrednie dodawanie i odejmowanie wartości daty i godziny nie jest zalecane, ponieważ przeliczenia strefy czasowej i inne mogą zwracać mylące wyniki. Użyj funkcji Value, aby przekonwertować wartości typu data/godzina na milisekundy, oraz aby uwzględnić strefę czasową użytkownika aplikacji, lub użyj funkcji DateAdd i DateDiff, aby dodać lub odjąć jedną z tych wartości.

Wybory i tak/nie

Typy danych z dwoma opcjami i dwie opcje zawierają co najmniej dwie możliwości wyboru, które może wybrać użytkownik aplikacji. Na przykład wybór stanu zamówienia może oferować opcje Nowy, Wysłano, Zafakturowany i Zamknięty. Typ danych "Dwie opcje" oferuje tylko dwie opcje.

Oba te typy danych pokazują etykiety w kontekście typu tekst. Na przykład formant etykiety pokazuje jedną z opcji stanu zamówienia, jeśli we właściwości Text formantu ustawiono formułę, która odwołuje się do tego wyboru. Etykiety opcji mogą być zlokalizowane dla użytkowników aplikacji w różnych lokalizacjach.

Kiedy użytkownik aplikacji wybierze opcję i zapisze tę zmianę, aplikacja przesyła dane do bazy danych, w której są przechowywane te dane jako reprezentacja niezależna od języka. Opcja w wyborze jest przesyłana i przechowywana jako liczba, a opcja w typie danych z dwoma opcjami jest przesyłana i przechowywana jako wartość logiczna.

Etykiety służą tylko do celów pokazu. Nie można przeprowadzać bezpośrednich porównań z etykietami, ponieważ są one specyficzne dla danego języka. Zamiast tego każdy wybór ma wyliczenie, które działa z bazową liczbą lub wartością logiczną. Na przykład tej formuły nie można użyć:

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

Ale tej formuły można użyć:

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

W przypadku opcji globalnych (udostępnianie tabel) nazwa wyliczenia zestawu opcji jest odpowiada nazwie wyboru globalnego. W przypadku opcji lokalnych (których zakresem jest tabela) nazwa może zawierać nazwę tabeli. Takie zachowanie pozwala uniknąć konfliktów w przypadku, gdy w wielu tabelach istnieje taka sama nazwa. Na przykład w tabeli Konta może być wybierany OrderStatus, a jej nazwa może się okazać OrderStatus (Accounts). Ta nazwa zawiera jedną lub kilka spacji i nawiasów, więc podczas odwoływania się do niej w formule należy ująć ją w pojedyncze znaki cudzysłowu.

Ponadto wartości dwóch opcji mogą również zachowywać się jak wartości logiczne. Na przykład właściwość dwuwartościowa o nazwie TaxStatus może zawierać etykiety Podlegające opodatkowaniu i Nie podlegające opodatkowaniu, które odpowiadają odpowiednio wartościom true i false. Na przykład tej formuły można użyć w celu demonstracji:

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

Można też użyć tej równoważnej formuły:

If( ThisItem.Taxable, ...