Tipos de dados
Nota
Microsoft Power Fx é o novo nome para a linguagem de fórmula de aplicações de tela. Estes artigos associados são um trabalho em curso à medida que extraímos o idioma das aplicações de tela, o integramos com outros produtos do Microsoft Power Platform e o disponibilizamos como open source. Comece com a Visão geral de Microsoft Power Fx para uma introdução ao idioma.
As informações fluem através de uma aplicação em valores pequenos e discretos, muito parecido com as células de uma folha de cálculo. Por exemplo, os dados num campo de Data de Nascimento e um campo de Aniversário fluiriam ambos de acordo com um valor de Data que inclui o ano, o mês e o dia. A aplicação sabe como formatar estes valores, restringir a entrada para o que é apropriado para cada um e partilhar os valores com uma base de dados. As dats de nascimento diferem dos aniversários para as pessoas, mas o sistema manipula-os exatamente da mesma forma. Neste caso, Data é um exemplo de um tipo de dados.
Este artigo fornece detalhes para os tipos de dados que as aplicações de tela suportam. Quando uma aplicação se liga a uma origem de dados externa, cada tipo de dados nessa origem é mapeado para um tipo de dados para aplicações de tela.
Tipo de dados | Descrição | Exemplos |
---|---|---|
booleano | Um valor true ou false. Pode ser utilizado diretamente em If, Filter e outras funções sem uma comparação. | verdadeiro |
Cor | Uma especificação de cores, incluindo um canal alfa. | Cor.Vermelho ColorValue( "#102030" ) RGBA( 255, 128, 0, 0,5 ) |
Moeda | Um valor de moeda que é armazenado num número de vírgula flutuante. Os valores de moeda são iguais aos valores numéricos com opções de formatação de moeda. | 123 4.56 |
Data | Uma data sem hora, no fuso horário do utilizador da aplicação. | Data( 2019, 5, 16 ) |
Data/Hora | Uma data com hora, no fuso horário do utilizador da aplicação. | DateTimeValue( "16 de maio, 2019 1:23:09 PM" ) |
Decimal | Um número com elevada precisão, operações de base 10 e alcance limitado. | 123 Decimal( "1,2345" ) |
GUID | Um Identificador Exclusivo Global. | GUID() GUID( "123e4567-e89b-12d3-a456-426655440000" ) |
Hiperligação | Uma cadeia de texto que contém uma hiperligação. | "https://powerapps.microsoft.com" |
Imagem | Uma cadeia de texto de Identificador de Recurso Universal (URI) para uma imagem em .jpeg, .png, .svg, .gif ou noutro formato de imagem Web comum. | MyImage adicionado como um recurso de aplicativo "https://northwindtraders.com/logo.jpg" "appres://blobmanager/7b12ffa2..." |
MÍDIA | Uma cadeia de texto URI para uma gravação de vídeo ou de áudio. | MyVideo adicionado como um recurso de aplicativo "https://northwindtraders.com/intro.mp4" "appres://blobmanager/3ba411c..." |
Número ou flutuador | Um número com precisão padrão, operações de base 2 e alcance amplo. | 123 8.903E121 1.234e200 |
Escolha | Uma escolha de um conjunto de opções, suportado por um número. Este tipo de dados combina uma etiqueta de texto localizável com um valor numérico. A etiqueta aparece na aplicação e o valor numérico é armazenado e utilizado para comparações. | ThisItem.OrderStatus |
Recorde | Um registo de valores de dados. Este tipo de dados composto contém instâncias de outros tipos de dados listados neste tópico. Mais informações: Trabalhar com tabelas. | { Empresa: "Northwind Traders", Pessoal: 35, Sem Fins Lucrativos: false } |
Referência do registo | Uma referência a um registo numa tabela. Normalmente, essas referências são utilizadas com pesquisas polimórficas. Mais informações: Trabalhar com referências. | Primeiro(Contas). Proprietário |
Tabela | Uma tabela de registos. Todos os registos têm de ter os mesmos nomes para os campos com os mesmos tipos de dados e os campos omitidos são tratados como em branco. Este tipo de dados composto contém instâncias de outros tipos de dados listados neste tópico. Mais informações: Trabalhar com tabelas. | Tabela( { Nome: "Sidney", Apelido: "Higa" }, { Nome próprio: "Nancy", Apelido: "Anderson" } ) |
Texto | Uma cadeia de texto Unicode. | "Olá, Mundo" |
Hora | Uma hora sem data, no fuso horário do utilizador da aplicação. | Tempo( 11, 23, 45 ) |
Duas opções | Uma escolha de um conjunto de duas opções, suportada por um valor booleano. Este tipo de dados combina uma etiqueta de texto localizável com um valor booleano. A etiqueta aparece na aplicação e o valor booleano é armazenado e utilizado para comparações. | ThisItem.Taxable |
objeto sem tipo | Um objeto de um tipo não declarado. O objeto subjacente pode ser qualquer tipo existente e pode ser convertido em tipos compatíveis utilizando funções como Boolean(), Value(), Table(), etc. Para mais informações, consulte Objeto sem tipo e Trabalhar com JSON. | ParseJSON("{ ""Campo": 1234 }"). Domínio |
Muitos destes tipos de dados são semelhantes e têm a mesma representação subjacente, tal como um campo Hiperligação que é tratado como Texto. Os tipos de dados adicionais fornecem uma experiência melhor predefinida em formulários e noutros controlos.
Blank
Todos os tipos de dados podem ter um valor em branco (por outras palavras, sem valor). O termo "nulo" é frequentemente utilizado em bases de dados para este conceito.
Utilize a função Blank com a função Set ou Patch para definir uma variável ou um campo como em branco. Por exemplo, Definir (x, Em branco() ) remove qualquer valor da variável global x.
Teste por um valor em branco utilizando a função IsBlank. Substituir possíveis valores em branco por valores não em branco utilizando a função Coalesce.
Uma vez que todos os tipos de dados suportam em branco, os tipos de dados Booleano e Opção dois têm efetivamente três valores possíveis.
Texto, Hiperligação, Imagem e Multimédia
Todos os quatro tipos de dados são baseados numa cadeia de texto Unicode.
Texto incorporado
As cadeias de texto incorporadas numa fórmula são colocadas entre aspas. Utilize duas aspas duplas em conjunto para representar uma única aspa dupla na cadeia de texto. Por exemplo, utilizar a seguinte fórmula na popriedade OnSelect de um controlo de Button:
Notify( "Jane said ""Hello, World!""" )
resulta numa faixa quando o botão é pressionado, onde as primeiras e as últimas aspas duplas são omitidas (uma vez que delimitam a cadeia de texto), bem como as aspas duplas repetidas à volta de Hello, World! são substituídas por uma aspa dupla única:
As aspas são utilizadas em nomes de identificador que contêm caracteres especiais e que não têm nenhum significado especial dentro de uma cadeia de texto.
Interpolação de cadeias
Utilize a interpolação de cadeias para incorporar fórmulas numa cadeia de texto. É muitas vezes mais fácil trabalhar e ver os resultados do que utilizar a função Concatenar ou o operador &.
Atribua um prefixo à cadeia de texto com um sinal de dólar $ e coloque a fórmula a ser incorporada entre chavetas {}. Para incluir uma chaveta na cadeia de texto, utilize chavetas repetidas: {{ ou }}. A interpolação de cadeias pode ser utilizada em qualquer ponto onde possa ser utilizada uma cadeia de texto padrão.
Por exemplo, considere esta fórmula com as variáveis globais Maçãs definida como 3 e Bananas definida como 4:
$"We have {Apples} apples, {Bananas} bananas, yielding {Apples+Bananas} fruit total."
Esta fórmula obtém a cadeia de texto Temos 3 maçãs, 4 bananas, resultando num total de 7 peças de fruta. As variáveis Maçãs e Bananas são inseridas no texto que substitui as chavetas, juntamente com o resultado da fórmula matemática Maçãs+Bananas. Os espaços e outros carateres à volta das chavetas são preservados tal como estão.
As fórmulas incorporadas podem incluir quaisquer funções ou operadores. Tudo o que é necessário é que o resultado da fórmula possa ser do mesmo tipo que uma cadeia de texto. Por exemplo, esta fórmula irá inserir NickName, se for fornecido, senão irá inserir FirstName numa saudação:
$"Welcome {Coalesce( NickName, FirstName )}, it's great to meet you!" )
Se NickName estiver definido como "Joe", esta fórmula produz a cadeia de texto Bem-vindo Joe, é um prazer conhecê-lo!. No entanto, se Alcunha estiver em branco e Nome próprio for "Joseph", esta fórmula produz Caro Joseph, muito prazer em conhecê-lo! em vez disso.
A interpolação de carateres pode incluir cadeias de texto padrão na fórmula incorporada. Por exemplo, se NickName ou FirstName não forem fornecidos, conseguiríamos, ainda assim, produzir "Amigo" como substituição:
$"Welcome {Coalesce( NickName, FirstName, "Friend" )}!"
As interpolações de cadeias podem até ser aninhadas. Considere este exemplo onde os nomes próprio, do meio e último são combinados numa saudação. Mesmo que um ou dois destes valores estejam em branco, haverá um número correto de espaços entre as partes do nome. Se não for fornecida nenhuma das partes, a interpolação da cadeia interna irá fechar-se numa cadeia vazia e será substituída pela função Coalesce por "Amigo".
$"Welcome {Coalesce( Trim( $"{First} {Middle} {Last}"}), "Friend" )}!"
Primeiro | Do meio | Último | Resultado |
---|---|---|---|
John | Qunicy | Doe | Welcome John Quincy Doe! |
John | em branco | Doe | Welcome John Doe! |
em branco | em branco | Doe | Welcome Doe! |
em branco | em branco | em branco | Welcome Friend! |
Linhas novas
As cadeias de texto incorporadas podem conter linhas novas. Por exemplo, considere definir a propriedade Text de um controlo Label para o seguinte:
"Line 1
Line 2
Line 3"
A fórmula acima resulta em três linhas mostradas no controlo label:
As novas linhas também são suportadas com a interpolação de cadeias, conforme mostrado abaixo:
$"Line {1}
Line {1+1}
Line {1+1+1}"
A fórmula acima resulta na mesma saída:
Recursos de imagem e multimédia
Através do menu Ficheiro, pode adicionar imagens, vídeos e ficheiros de áudio como recursos de aplicação. O nome do ficheiro importado passa a ser o nome do recurso na aplicação. Neste gráfico, o logótipo da Northwind Traders, denominado nwindlogo, foi adicionado a uma aplicação:
Para utilizar este recurso numa aplicação, especifique-o na propriedade Image de um controlo de Image:
URIs para imagens e outras tipos de multimédia
Pode aprofundar-se um pouco mais no último exemplo definindo a propriedade Text de um controlo de Label como nwindlogo. A etiqueta mostra uma cadeia de texto:
As aplicações de tela referenciam cada imagem ou outro ficheiro de multimédia, quer seja na nuvem ou adicionados como um recurso de aplicação, por uma cadeia de texto URI.
Por exemplo, a propriedade Image de um controlo aceita não apenas recursos de aplicação, mas também ligações para imagens na Web, tal como "https://northwindtraders.com/logo.jpg"". A propriedade também aceita imagens inline que utilizam o esquema URI de dados, tal como neste exemplo:
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFAQMAAACtnVQoAAAABlBMVEUAAAB0J3UMNU6VAAAAAXRSTlMAQObYZgAAABRJREFUCNdjUGJgCGVg6GgAkkA2AA8/AffqCEBsAAAAAElFTkSuQmCC"
Esse URI apresenta uma versão escalada de dois diamantes roxos:
Pode mostrar a imagem mais recente capturada num controlo de Camera se definir a propriedade Image de um controlo image para a propriedade Photo do controlo da câmara. A aplicação contém a imagem na memória e a propriedade Photo do controlo camera devolve uma referência de URI para a imagem. Por exemplo, poderá tirar uma foto e a propriedade Photo da câmara poderá devolver "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1".
Utiliza um URI para referenciar uma imagem ou outro ficheiro de multimédia armazenado numa base de dados. Dessa forma, a aplicação não obtém os dados reais até ser realmente necessário. Por exemplo, um anexo numa tabela Microsoft Dataverse pode devolver "appres://datasources/Contacts/table/..." Como no exemplo da câmara, pode exibir esta imagem definindo a propriedade Image de um controlo image para esta referência, que recupera os dados binários.
Quando guarda um tipo de dados de multimédia, tal como uma imagem, numa base de dados, a aplicação envia a imagem real ou os dados de multimédia, e não a referência URI.
Limites de tamanho
Como cadeias de texto e URIs, estes tipos de dados não têm limite predefinido quanto ao respetivo comprimento.
Os dados binários que estes tipos de dados referenciam também não têm limite de predefinição ao tamanho. Por exemplo, uma imagem capturada através do controlo camera que é agora referenciado como "appres://..." pode ter uma resolução tão grande e alta quanto a câmara do dispositivo o permite. A resolução, a velocidade de fotogramas e outros atributos dos ficheiros de multimédia não estão limitados pelo tipo de dados, mas os controlos específicos para reprodução e captura de multimédia podem ter as suas próprias limitações.
No entanto, todos os tamanhos de dados estão sujeitos à quantidade de memória disponível na aplicação. Os browsers em execução num computador de secretária suportam, normalmente, mais de 100 megabytes de dados. No entanto, a quantidade de memória disponível num dispositivo, tal como um telemóvel, poderá ser muito inferior, normalmente entre 30 a 70 megabytes. Para determinar se a sua aplicação será executada nesses limites, teste cenários comuns em todos os dispositivos em que esta deverá ser executada.
Como melhor prática, mantenha os dados na memória durante o tempo necessário. Carregue imagens numa base de dados assim que puder; transfira imagens apenas quando o utilizador da aplicação as solicitar.
Números
Nota
Atualmente, o Power Apps só suporta Flutuante e é o tipo de todos os números. O suporte decimal será adicionado em breve.
O Power Fx suporta dois tipos de número: Decimal e Flutuante (com os sinónimos Número e Moeda).
Decimal é melhor para a maioria dos cálculos de negócios. Pode representar com precisão números na base 10, o que significa que 0.1
pode ser representado com precisão e não será propenso a erros de arredondamento durante os cálculos. Tem um alcance grande o suficiente para qualquer necessidade de negócios, até 1028 com até 28 dígitos de precisão. Decimal é o tipo de dados numérico padrão para a maioria dos Power Fx hosts, usado se alguém simplesmente grava 2*2
.
Float é melhor para cálculos científicos. Pode representar números num intervalo muito maior, até 10308. A precisão é limitada a 15 casas decimais e a matemática assenta na base 2, por isso não pode representar alguns valores decimais comuns com precisão. Float também tem maior desempenho e é favorecido se esse for um fator e a precisão não for crítica.
Números decimais
O tipo de dados Decimal utiliza com frequência o tipo de dados decimal .NET. Alguns anfitriões, como as colunas de fórmula do Dataverse que são executadas no SQL Server, utilizam o tipo de dados decimal do SQL Server.
Decimal faz matemática da maneira que você aprendeu na escola, usando base 10 dígitos. Isto é muito importante para evitar erros de arredondamento de diferenças muito pequenas que podem se acumular ao utilizar a matemática de base 2 (como a que é utilizada pelo Flutuante).
O intervalo varia entre positivo 79,228,162,514,264,337,593,543,950,335 e negativo 79,228,162,514,264,337,593,543,950,335. O separador decimal pode ser colocado em qualquer lugar desses números, fornecendo até 28 dígitos de precisão, e ainda ser representado com precisão. Por exemplo, 79,228,162,514,264.337593543950335 pode ser representado com exatidão, assim como 7.9228162514264337593543950335.
Números de vírgula flutuante
O tipo de dados Flutuante, também conhecido como Número ou Moeda, utiliza a norma de vírgula flutuante de precisão dupla IEEE 754. Esta norma fornece um intervalo muito grande de números em que trabalhar, de –1,79769 x 10308 a 1,79769 x 10308. O valor mínimo que pode ser representado é 5 x 10–324.
Float pode representar exatamente números inteiros (ou inteiros) entre –9,007,199,254,740,991 (–(253 – 1)) e 9,007,199,254,740,991 (253 – 1), inclusive. Este intervalo é superior ao dos tipos de dados de número inteiro de 32 bits (ou 4 bytes) que as bases de dados utilizam normalmente. No entanto, as aplicações de tela não podem representar tipos de dados inteiros de 64 bits (ou 8 bytes). Poderá pretender armazenar o número num campo de texto ou utilizar uma coluna calculada para fazer uma cópia do número num campo de texto, para que o mesmo seja mapeado para um tipo de dados de Texto na aplicação de tela. Desta forma, pode manter, apresentar e introduzir estes valores, bem como compará-los para determinar se são iguais; no entanto, não é possível efetuar cálculos numéricos nos mesmos neste formulário.
A aritmética de vírgula flutuante é aproximada, pelo que pode, por vezes, fornecer resultados inesperados com muitos exemplos documentados. Poderá esperar que a fórmula 55 / 100 * 100 devolva exatamente 55 e (55 / 100 * 100) - 55 devolva exatamente zero. No entanto, a última fórmula devolve 7,1054 x 10–15, o que é muito pequeno, mas não zero. Essa pequena diferença normalmente não causa problema, sendo que a aplicação a arredonda ao mostrar o resultado. No entanto, as pequenas diferenças podem ser compostas em cálculos subsequentes e parecem dar a resposta errada.
Os sistemas de base de dados frequentemente armazenam moedas e efetuam cálculos utilizando matemática decimal, que oferece um intervalo menor, mas maior controlo sobre a precisão. Por predefinição, as aplicações de tela mapeiam as moedas dentro e fora de valores de vírgula flutuante; consequentemente, o resultado poderá ser diferente dos cálculos efetuados num tipo de dados de casas decimais nativas. Se este tipo de discrepância causar problemas, poderá pretender trabalhar com estes valores como Texto, tal como ocorre com números inteiros grandes descritos anteriormente nesta secção.
Predefinições e conversões
Nota
Atualmente, o Power Apps só suporta Flutuante e é o tipo de todos os números. O suporte decimal será adicionado em breve.
A maioria dos anfitriões do Power Fx utiliza Decimal por predefinição. Isto afeta:
- Números literais em fórmulas. O número
1.234
será interpretado como um valor Decimal . Por exemplo, a fórmula1.234 * 2
interpretará o1.234
e2
como Decimal e devolverá um resultado Decimal . - Função Value.
Value( "1.234" )
retornará um valor decimal . Por exemplo, na fórmulaValue( "1.234" ) * 2
a função Value interpretará o conteúdo da cadeia de texto"1.234"
como um valor Decimal.
Para trabalhar com valores Flutuantes, utilização a função Float. Expandindo o exemplo acima, Float( 1.234 )
converterá o valor Decimal1.234
em Flutuante. Float também pode ser usado como um substituto para Value para converter uma cadeia de caracteres contendo um número de ponto flutuante, como Float( "1.234" )
um valor Float , que é necessário se o número não puder ser representado como um decimal.
Em resumo:
Utilização | Decimal | Flutuador |
---|---|---|
Números literais em fórmulas | 1.234 |
Float( 1.234 ) Float( "1.234" ) |
Conversão de uma cadeia de texto | Value( "1.234" ) Decimal( "1.234" ) |
Float( "1.234" ) |
Conversão entre tipos numéricos | Decimal( float ) |
Float( decimal ) |
Conversão numa cadeia de texto | Text( decimal ) |
Text( float ) |
Misturar tipos numéricos
Os valores Float e Decimal podem ser livremente misturados. Quando estão misturados, os valores Decimais são convertidos em valores Flutuantes devido ao intervalo maior. Uma vez que isto pode resultar numa perda de precisão, é importante não misturar os dois desnecessariamente. Como Decimal é o tipo de dados literal predefinido e a maioria das funções numéricas conservará o tipo, é relativamente fácil evitar a passagem para Flutuante sem o pretender.
Por exemplo, considere o seguinte cálculo utilizando pac power-fx repl
após a instalação da CLI do Power Platform. Como ambos os números são Decimais, o cálculo é feito em Decimais e o resultado mantém a precisão total:
>> 1.0000000000000000000000000001 * 2
2.0000000000000000000000000002
Se, em vez disso, o segundo operando fosse alterado para Flutuante, todo o cálculo seria efetuado no tipo Flutuante e a pequena parte fracionária seria perdida:
>> 1.0000000000000000000000000001 * Float(2)
2
Data, Hora e DateTime
Fusos horários
Os valores de data/hora encaixam-se nestas categorias:
- Local do utente: esses valores são armazenados em UTC (Tempo Universal Coordenado), mas o fuso horário do utente do aplicativo afeta como o aplicativo mostra esses valores e como o utente do aplicativo os especifica. Como exemplo, o mesmo momento é apresentado de forma diferente a um utilizador no Canadá do que para um utilizador no Japão.
- Independente de fuso horário: o aplicativo mostra esses valores da mesma maneira e o utente do aplicativo os especifica da mesma maneira, independentemente do fuso horário. O mesmo momento é apresentado da mesma forma a um utilizador no Canadá como para um utilizador no Japão. Os autores de aplicações que não esperam que as suas aplicações sejam executadas em fusos horários diferentes utilizam estes valores porque são mais simples.
Esta tabela mostra alguns exemplos:
Tipo de data/hora | Valor armazenado na base de dados | Valor apresentado e introduzido 7 horas a oeste do UTC | Valor apresentado e introduzido 4 horas a este do UTC |
---|---|---|---|
Local do utilizador | Domingo,19 demaio de2019 04:00 |
Sábado,18 demaio de2019 19:00 |
Domingo,19 demaio de2019 08:00 |
Fuso horário independente | Domingo,19 demaio de2019 04:00 |
Domingo,19 demaio de2019 04:00 |
Domingo,19 demaio de2019 04:00 |
Para a data/horas da Região do utilizador, as aplicações de tela utilizam o fuso horário do browser ou dispositivo, mas as aplicações condicionadas por modelo utilizam a definição do utilizador no Dataverse. Estas definições normalmente coincidem, mas os resultados serão diferentes se estas definições forem diferentes.
Utilize as funções DateAdd e TimeZoneInformation para converter a hora local em UTC e reverter. Consulte os exemplos no fim da documentação para estas funções.
Equivalentes numéricos
As aplicações de tela mantêm e calculam todos os valores de data/hora, quer sejam de Região do utilizador ou Independente de fuso horário em UTC. A aplicação converte os valores com base no fuso horário do utilizador da aplicação quando os mostra e quando o utilizador da aplicação os especifica.
Quando uma aplicação de tela lê um valor Independente de fuso horário a partir de uma origem de dados ou escreve tal valor numa origem de dados, a aplicação ajusta automaticamente o valor para compensar o fuso horário do utilizador da aplicação. A aplicação, em seguida, trata o valor como um valor UTC, consistente com todos os outros valores de data/hora na aplicação. Devido a esta compensação, o valor Independente de fuso horário original é apresentado quando a aplicação ajusta o valor UTC para o fuso horário do utilizador da aplicação.
Pode observar este comportamento mais detalhadamente utilizando a função Value para aceder ao valor numérico subjacente para um valor de data/hora. Esta função devolve o valor de data/hora como o número de milissegundos desde 1 de janeiro de 1970, 00:00:00.000 UTC.
Dado que cada valor de data/hora é mantido em UTC, o fórmula Value( Date( 1970, 1, 1 ) ) não retornará zero na maioria das regiões do mundo porque a função Date devolve uma data em UTC. Por exemplo, a fórmula retorna 28 800 000 num fuso horário que está deslocado de UTC por oito horas. Esse número reflete o número de milissegundos em oito horas.
Regressando ao nosso exemplo acima:
Tipo de data/hora | Valor armazenado na base de dados | Valor apresentado e introduzido 7 horas a oeste do UTC | A função Valor retorna |
---|---|---|---|
Local do utilizador | Domingo,19 demaio de2019 04:00 |
Sábado,18 demaio de2019 19:00 |
1,558,238,400,000 (Domingo,19 demaio de2019 4:00 AM UTC) |
Fuso horário independente | Domingo,19 demaio de2019 04:00 |
Domingo,19 demaio de2019 04:00 |
1,558,263,600,000 (Domingo,19 demaio de2019 11:00 AM UTC) |
Converter horas Unix
As horas Unix refletem o número de segundos desde 1 de janeiro de 1970, 00:00:00 UTC. Visto que as aplicações de tela utilizam milissegundos em vez de segundos, pode converter entre os dois multiplicando ou dividindo por 1000.
Por exemplo, o hora Unix mostra 9 de setembro de 2001 às 01:46:40 UTC como 1.000.000.000. Para mostrar esse valor de data/hora numa aplicação de tela, multiplique esse número por 1000 para convertê-lo em milissegundos e, em seguida, utilize-o numa função Text. A fórmula Text( 1000000000 * 1000, DateTimeFormat.UTC ) devolve a cadeia de caracteres 2001-09-09T01:46:40.000Z.
No entanto, essa função devolve sábado, 8 de setembro de 2001, 18:46:40 se utilizar o formato DateTimeFormat.LongDateTime24 num fuso horário que tenha uma diferença de -7 horas do UTC (7 horas a oeste do UTC). Este resultado mostra o valor DateTime corretamente com base no fuso horário local.
Para converter para uma hora Unix, divida o resultado a partir de Valor por 1000:
RoundDown( Valor( UnixTime ) / 1000, 0 )
Se necessitar da hora Unix num valor Data para cálculos adicionais ou apresentar no Power Apps, utilize esta fórmula:
DateAdd( Data( 1970,1,1 ), UnixTime, Segundos )
SQL Server
O SQL Server tem DateTime, Datetime2 e outros tipos de dados de data/hora que não incluem um deslocamento de fuso horário e que não indicam o fuso horário em que se encontra. As aplicações de tela assumem que estes valores são armazenados em UTC e tratam-nos como Região do utilizador. Se os valores se destinarem a ser independentes de fuso horário, corrija as traduções UTC utilizando a função TimeZoneOffset.
As aplicações de tela utilizam as informações de fuso horário incluídas nos campos Datetimeoffset ao converterem um valor na representação UTC interna da aplicação. As aplicações utilizam sempre UTC como fuso horário (deslocamento de fuso horário zero) quando gravam dados.
As aplicações de tela lêem e escrevem valores dos tipos de dados Hora no SQL Server como cadeias de texto no formato de duração ISO 8601. Por exemplo, tem de analisar este formato de cadeia de caracteres e utilizar a função Time para converter a cadeia de texto "PT2H1M39S" num valor Hora:
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)
Misturar informações de data e hora
Data , Hora e DataHora têm nomes diferentes, mas todos contêm as mesmas informações sobre datas e horas.
Um valor de Data pode incluir informações de hora com ele, que é normalmente meia-noite. Um valor de Hora pode transportar informações de data, normalmente, 1 de janeiro de 1970. O Dataverse também armazena informações de hora com um campo Apenas Data, mas mostra apenas as informações de data por predefinição. Da mesma forma, as aplicações de tela distinguem entre estes tipos de dados para determinar os formatos e controlos predefinidos.
Adicionar e subtrair valores de data e hora diretamente não é recomendado porque o fuso horário e outras conversões poderiam causar resultados confusos. Utilize a função Value para converter os valores de data/hora em milissegundos primeiro e tenha em conta o fuso horário do utilizador da aplicação ou utilize as funções DateAdd e DateDiff para adicionar ou subtrair um destes valores.
Escolhas e Sim/Não
Escolhas e tipos de dados de duas opções fornecem duas ou mais opções para um utilizador de aplicações selecionar. Por exemplo, uma escolha do Estado da Ordem pode oferecer as escolhas Novas, Enviadas, Faturadas e Fechadas. O tipo de dados de duas opções só oferece duas opções.
Ambos os tipos de dados mostram as etiquetas num contexto de cadeia de texto. Por exemplo, um controlo de etiqueta mostra uma das opções de estado de encomenda se a propriedade Text do controlo estiver definida para uma fórmula que faz referência a essa escolha. As etiquetas de opções podem estar localizadas para utilizadores de aplicações em localizações diferentes.
Quando um utilizador da aplicação seleciona uma opção e guarda essa alteração, a aplicação transmite os dados para a base de dados, a qual armazena esses dados numa representação independe do idioma. Uma opção de uma escolha é transmitida e armazenada como número, sendo que uma opção num tipo de dados de duas opções é transmitida e armazenada como um valor booleano.
As etiquetas são apenas para fins de apresentação. Não é possível efetuar comparações diretas com as etiquetas porque são específicas de um idioma. Em vez disso, cada escolha tem uma enumeração que funciona com o número subjacente ou o valor booleano. Por exemplo, não pode utilizar esta fórmula:
If( ThisItem.OrderStatus = "Active", ...
Mas pode utilizar esta fórmula:
If( ThisItem.OrderStatus = OrderStatus.Active, ...
Para as escolhas globais (que as tabelas partilham), o nome da enumeração do conjunto de opções corresponde ao nome da escolha global. Para as escolhas locais (que são traçadas para uma tabela), o nome pode conter o nome da tabela. Este comportamento evita conflitos se várias tabelas tiverem escolhas que tenham o mesmo nome. Por exemplo, a tabela Contas pode ter uma escolha OrderStatus e o seu nome pode ser OrderStatus (Contas). Esse nome contém um ou mais espaços e parênteses, pelo que tem de o colocar entre aspas simples se referenciar o mesmo numa fórmula.
Além disso, os valores de duas opções também se podem comportar como valores booleanos. Por exemplo, um valor de duas opções denominado TaxStatus poderá ter as etiquetas Tributável e Não Tributáveis, que correspondem a true e false respetivamente. Para demonstrar, não pode utilizar esta fórmula:
If( ThisItem.Taxable = TaxStatus.Taxable, ...
Também pode utilizar esta fórmula equivalente:
If( ThisItem.Taxable, ...