Tipos de dados
A informação flui por Power Fx em valores pequenos e discretos, muito parecidos 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. O Power Fx 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 o Power Fx suporta. Quando o Power Fx se liga a uma origem de dados externa, cada tipo de dados nessa origem é mapeado para um tipo de dados no Power Fx.
Tipo de dados | Descrição | Exemplos |
---|---|---|
Boolean | Um valor true ou false. Pode ser utilizado diretamente em If, Filter e outras funções sem uma comparação. | verdadeiro |
Opção | 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. Este tipo de dados é suportado pela função Type se uma instância de um campo de Escolha for usada pelo nome. | ThisItem.OrderStatus |
Cor | Uma especificação de cores, incluindo um canal alfa. |
Color.Red 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. O tipo de dados Moeda não é suportado pela função Type. |
123 4.56 |
Data | Uma data sem hora, no fuso horário do utilizador da aplicação. | Date( 2019, 5, 16 ) |
DateTime | Uma data com hora, no fuso horário do utilizador da aplicação. | DateTimeValue( "May 16, 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" ) |
Float | Um número com precisão padrão, operações de base 2 e alcance amplo. |
123 8,903e121 1.234e-200 |
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. O tipo de dados Imagem não é suportado pela função Type. |
MyImage adicionado como um recurso de aplicação "https://northwindtraders.com/logo.jpg" "appres://blobmanager/7b12ffa2..." |
Multimédia | Uma cadeia de texto URI para uma gravação de vídeo ou de áudio. O tipo de dados Multimédia não é suportado pela função Type. |
MyVideo adicionado como um recurso de aplicação "https://northwindtraders.com/intro.mp4" "appres://blobmanager/3ba411c..." |
Número | Um alias para Decimal (a maioria dos anfitriões do Power Fx) ou Float (Aplicações de tela). Se qualquer variedade de número puder ser usada para uma determinada situação, use Número para compatibilidade máxima. |
123 0.0123 1e4 |
Registo | 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. Este tipo de dados é suportado pela função Type se uma instância de um Registo for usada. |
{ Empresa: "Northwind Traders", Pessoal: 35, Sem Fins Lucrativos: false } |
Referência de 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. Este tipo de dados não é suportado pela função Type. | First(Accounts).Owner |
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. Este tipo de dados é suportado pela função Type se uma instância de uma Tabela for usada. |
Table( { Nome próprio: "Sidney", Apelido: "Higa" }, { Nome próprio: "Nancy", Apelido: "Anderson" } ) |
Texto | Uma cadeia de texto Unicode. | "Hello, World" |
Time | Uma hora sem data, no fuso horário do utilizador da aplicação. | Time( 11, 23, 45 ) |
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("{ ""Field"" : 1234 }").Field |
Nulo | Usado apenas por funções de comportamento definidas pelo utilizador, indica que uma função não tem um tipo de devolução. Este tipo de dados não é suportado pela função Type. Mesmo que uma função não tenha um tipo ou valor de devolução, pode sempre devolver um erro. | Hi(): Void = { Notify( "Olá!" ) } |
Sim/Não | 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. Este tipo de dados é suportado pela função Type se uma instância de um campo de Sim/Não for usada pelo nome. | ThisItem.Taxable |
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. Esta abordagem é, muitas vezes, mais fácil trabalhar com e de visualizar os resultados do que utilizar a função Concatenate 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 insere 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, o número correto de espaços é mantido 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"
Esta fórmula resulta em três linhas mostradas no controlo de etiqueta:
As novas linhas também são suportadas com a interpolação de cadeias:
$"Line {1}
Line {1+1}
Line {1+1+1}"
O que 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 à 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. Desta forma, a aplicação não obtém os dados reais até que seja 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 é 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 é executada nestes 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 os números na base 10, o que significa que 0.1
pode ser representado com precisão e evitará 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 predefinido para a maioria dos anfitriões do Power Fx, sendo utilizado se alguém simplesmente escreve 2*2
.
Flutuante é mais indicado para cálculos científicos. Pode representar números num intervalo 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. Flutuante também tem um desempenho superior, sendo preferível 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 a matemática da maneira que aprendeu na escola, usando a base de 10 dígitos, importante para evitar erros de arredondamento de diferenças muito pequenas que podem acumular-se ao usar a matemática de base 2 (como usado por 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.
Flutuante pode representar exatamente números 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 seja mapeado para um tipo de dados de Texto na aplicação de tela. Desta forma, pode manter, apresentar e introduzir estes valores, e compará-los para determinar se são iguais; no entanto, não é possível realizar cálculos numéricos sobre eles desta forma.
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. Dependendo das necessidades de precisão da sua aplicação, poderá pretender trabalhar com estes valores como Texto, como descrito anteriormente para números inteiros grandes.
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. Ter esta predefinição significa:
- Números literais em fórmulas. O número
1.234
é interpretado como um valor Decimal. Por exemplo, a fórmula1.234 * 2
interpreta o1.234
e2
como Decimal e devolve um resultado Decimal. - Função Value.
Value( "1.234" )
regressa um valor Decimal. Por exemplo, na fórmulaValue( "1.234" ) * 2
, a função Value interpreta o conteúdo da cadeia de texto"1.234"
como um Decimal.
Para trabalhar com valores Flutuantes, utilização a função Float. Expandir o nosso exemplo, Float( 1.234 )
converte o Decimal1.234
para Flutuante. A função Float também pode ser utilizada para substituir a função Value para converter uma cadeia que contém um número de vírgula flutuante, tal como Float( "1.234" )
, num valor Flutuante, o que é necessário se não for possível representar o número como Decimal.
Em resumo:
Utilização | Decimal | Float |
---|---|---|
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 Flutuantes e Decimais podem ser misturados livremente. Quando estão misturados, os valores Decimais são convertidos em valores Flutuantes devido ao intervalo maior. Como esta conversão 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 preserva o tipo, é relativamente fácil evitar mover para Float 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:
- Região do utilizador: estes valores são armazenados em UTC (Hora Universal Coordenada), mas o fuso horário do utilizador da aplicação afeta o modo como a aplicação mostra estes valores e a forma como o utilizador da aplicação especifica os mesmos. 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: a aplicação mostra estes valores da mesma forma e o utilizador da aplicação especifica-os da mesma forma, 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 |
---|---|---|---|
Região do utilizador | Domingo,19 demaio de2019 04:00 |
Sábado,18 demaio de2019 19:00 |
Domingo,19 demaio de2019 08:00 |
Independente do fuso horário | 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:
Tipo de data/hora | Valor armazenado na base de dados | Valor apresentado e introduzido 7 horas a oeste do UTC | A função Value devolve |
---|---|---|---|
Região 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) |
Independente do fuso horário | 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( Value( 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( Date( 1970,1,1 ), UnixTime, Seconds )
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 DateTime têm nomes diferentes, mas 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, ...