Funções With

Aplica-se a: Aplicações de tela Fluxos de ambiente de trabalho Aplicações condicionadas por modelo Power Platform CLI

Calcula valores e realiza ações num único registo, incluindo registos inline de valores com nome.

Descrição

A função With avalia uma fórmula para um único registo. A fórmula pode calcular um valor e/ou realizar ações, como, por exemplo, modificar os dados ou trabalhar com uma ligação. Utilize a função ForAll para avaliar uma fórmula para todos os registos numa tabela de registos.

Os atuais campos do registo em processamento estão disponíveis na fórmula. Utilize o operador ThisRecord ou simplesmente campos de referência pelo nome, como com qualquer outro valor. O operador As também pode ser usado para nomear o registo que está a ser processado, o que pode ajudar a tornar a sua fórmula mais fácil de compreender e tornar os registos aninhados acessíveis. Para mais informações, consulte os exemplos abaixo e trabalhar com o âmbito de registo.

Utilize With para melhorar a legibilidade de fórmulas complexas dividindo-as em subfórmulas com nomes mais pequenos. Estes valores nomeados funcionam como variáveis locais simples confinadas ao âmbito do With. A mesma sintaxe de registo inline utilizada com a função UpdateContext pode ser utilizada com With. A utilização de With tem preferência sobre variáveis globais ou de contexto, uma vez que é independente, fácil de compreender e pode ser utilizada em qualquer contexto de fórmula declarativa.

Utilize With para aceder aos campos do registo devolvidos por funções como Patch ou Match. With mantém o valor destas funções o suficiente para ser utilizado em cálculos ou ações adicionais.

Se o argumento do Record como With for um erro, o erro será devolvido pela função e a Formula não será avaliada.

Sintaxe

With( Record, Formula )

  • Record – Obrigatório. O registo que precisa de ação. Para valores de nomes, utilize a sintaxe inline { name1: value1, name2: value2, ... }
  • Formula – Obrigatório. A fórmula a avaliar para Record. A fórmula pode referenciar qualquer um dos campos de Record diretamente como um âmbito de registo.

Exemplos

Valores de nome simples

With( { radius: 10,
        height: 15 },
    Pi() * (radius*radius) * height
)
// Result: 4712.38898038 (as shown in a label control)

Este exemplo utiliza um registo de valores nomeados para calcular o volume de um cilindro. With está a ser utilizado para capturar todos os valores de entrada em conjunto, facilitando a separação entre eles a partir do cálculo.

With aninhado

Calculadora de juros utilizando a função With.

With( { AnnualRate: RateSlider/8/100,        // slider moves in 1/8th increments and convert to decimal
        Amount: AmountSlider*10000,          // slider moves by 10,000 increment
        Years: YearsSlider,                  // slider moves in single year increments, no adjustment required
        AnnualPayments: 12 },                // number of payments per year
      With( { r: AnnualRate/AnnualPayments,  // interest rate
              P: Amount,                     // loan amount
              n: Years*AnnualPayments },     // number of payments
            r*P / (1 - (1+r)^-n)             // standard interest calculation
      )
)

Este exemplo aninha as funções With para criar um cálculo de duas camadas para pagamentos mensais de hipoteca. Desde que não exista conflito, todos os valores nomeados externos With ficam disponíveis no With interior.

Uma vez que os controlos de deslize só podem ser movidos em incrementos de 1, os deslizes são divididos ou multiplicados para criar efetivamente um incremento personalizado. No caso da taxa de juros, RateSlider tem a propriedade Max definida como 48, dividida por 8 para um incremento de ponto percentual de 1/8 e dividido por 100 para converter de uma percentagem em decimal, cobrindo o intervalo de 0,125 % a 6%. No caso do montante do empréstimo, AmountSlider tem a respetiva propriedade Max definida como 60 e multiplicada por 10.000, cobrindo o intervalo 10.000 a 600.000.

O WIth é recalculado automaticamente à medida que os controlos de deslize são movidos e o novo pagamento de empréstimo é apresentado. Não são utilizadas variáveis e não é necessário utilizar a propriedade OnChange dos controlos de deslize.

Eis aqui as instruções detalhadas para criar esta aplicação:

  1. Criar uma nova aplicação.
  2. Adicione um controlo Slider e dê-lhe o nome RateSlider. Defina a propriedade Max para 48.
  3. Adicione um controlo Label à esquerda do controlo slider. Defina a propriedade de Text como "Taxa de Juros:".
  4. Adicione um controlo Label à direita do controlo slider. Defina a sua propriedade Texto para a fórmula RateSlider/8 & " %".
  5. Adicione outro controlo Slider e dê-lhe o nome AmountSlider. Defina a propriedade Max para 60.
  6. Adicione um controlo Label deste controlo slider. Defina a propriedade de Text como "Loan Amount:".
  7. Adicione um controlo Label à direita deste controlo slider. Defina a respetiva propriedade Text como a fórmula AmountSlider/8 * 10000.
  8. Adicione outro controlo Slider e dê-lhe o nome YearsSlider. Defina a propriedade Max para 40.
  9. Adicione um controlo Label à esquerda deste controlo slider. Defina a propriedade de Text como "Número de Anos:".
  10. Adicione um controlo Label à direita deste controlo slider. Defina a respetiva propriedade Text como a fórmula YearsSlider.
  11. Adicione um controlo Label e defina a respetiva propriedade Text para a fórmula mostrada acima.
  12. Adicione um controlo Label à esquerda do último controlo label. Defina a propriedade Text como "Pagamento Mensal Periódico:".

Chave primária devolvida por Patch

With( Patch( Orders, Defaults( Orders ), { OrderStatus: "New" } ),
      ForAll( NewOrderDetails,
              Patch( OrderDetails, Defaults( OrderDetails ),
                     { Order: OrderID,          // from With's first argument, primary key of Patch result
                       Quantity: Quantity,      // from ForAll's NewOrderDetails table
                       ProductID: ProductID }   // from ForAll's NewOrderDetails table
              )
      )
)

Este exemplo adiciona um registo à tabela Encomenda no SQL Server. Em seguida, utiliza a chave primária devolvida para a encomenda, devolvida pela função Patch no campo OrderID, para criar registos relacionados na tabela OrderDetails.

Valores extraídos com uma expressão regular

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)

Este exemplo extrai as horas, os minutos e os segundos de um valor de duração ISO 8601 e, em seguida, utiliza estas subcorrespondências para criar um valor de data/hora.

Tenha em atenção que, embora as subcorrespondências contenham números, ainda estão numa cadeia de texto. Utilize a função Value para converter para um número antes de efetuar operações matemáticas.

Mapear um registo num componente

Ver Registo de mapa.