Como validar formulários no Power Apps: passo a passo
Validar formulários no Power Apps evita que registos incompletos ou mal formatados cheguem à base de dados. Com o controlo Form, a propriedade Required dos DataCards e algumas fórmulas Power Fx, é possível bloquear o botão Guardar até os dados estarem corretos e mostrar mensagens de erro claras. O exemplo seguinte usa um formulário simples de contactos com Nome, Email e Idade.
Pré-requisitos
- Acesso ao Power Apps Studio (make.powerapps.com) com uma licença válida.
- Uma fonte de dados com os campos
Nome,EmaileIdade(Dataverse, SharePoint ou Excel). - Noções básicas de Power Fx: as fórmulas escrevem-se nas propriedades dos controlos.
- Uma Canvas App em branco, formato tablet ou telemóvel.
Passo 1: Adicionar o formulário e ligar a fonte de dados
Na Canvas App, escolhe Insert > Edit form. No painel da direita, define a fonte de dados e os campos a mostrar. Depois, configura as propriedades principais do formulário:
// Propriedade DataSource do Form1
Contactos
// Propriedade DefaultMode do Form1 (novo registo)
FormMode.New
Neste momento o formulário já grava, mas aceita qualquer coisa. É isso que vamos corrigir.
Passo 2: Marcar campos obrigatórios
Seleciona o DataCard do campo Nome e define a propriedade Required como true. O Power Apps passa a marcar o campo com um asterisco e a considerá-lo na validação interna. Repete para o Email.
// Propriedade Required do DataCard_Nome
true
Esta é a validação mais barata que existe: não escreves lógica nenhuma e já ganhas a propriedade Form1.Valid, que fica false enquanto houver um campo obrigatório vazio.
Passo 3: Validar o formato do email com IsMatch
Campo obrigatório não chega: "abc" é texto preenchido, mas não é um email. A função IsMatch compara o texto com um padrão. O Power Fx já traz o padrão Match.Email. Adiciona um Label dentro do DataCard do Email e escreve na propriedade Text:
If(
IsBlank( DataCardValue_Email.Text ),
"O email é obrigatório.",
Not( IsMatch( DataCardValue_Email.Text, Match.Email ) ),
"Formato de email inválido. Exemplo: nome@empresa.pt",
""
)
Um If com vários pares condição/resultado funciona como um switch: devolve a primeira mensagem cuja condição é verdadeira e uma string vazia se estiver tudo bem. Define a propriedade Color do Label como Color.Red.
Passo 4: Validar um intervalo numérico
Para a Idade queremos apenas números entre 18 e 120. Cria outro Label de erro com esta fórmula:
If(
IsBlank( DataCardValue_Idade.Text ),
"A idade é obrigatória.",
Not( IsNumeric( Value( DataCardValue_Idade.Text ) ) ),
"A idade tem de ser um número.",
Or(
Value( DataCardValue_Idade.Text ) < 18,
Value( DataCardValue_Idade.Text ) > 120
),
"A idade tem de estar entre 18 e 120.",
""
)
Repara em Value(): o texto de uma caixa é sempre string, e comparar string com número dá erro. Converter primeiro é o passo que a maioria das pessoas esquece.
Passo 5: Bloquear o botão Guardar
A melhor validação é a que não deixa o utilizador errar. Na propriedade DisplayMode do botão Guardar, combina a validação nativa do formulário com as regras personalizadas:
If(
And(
Form1.Valid,
IsMatch( DataCardValue_Email.Text, Match.Email ),
Value( DataCardValue_Idade.Text ) >= 18,
Value( DataCardValue_Idade.Text ) <= 120
),
DisplayMode.Edit,
DisplayMode.Disabled
)
Passo 6: Guardar e dar feedback
No OnSelect do botão chama SubmitForm. O feedback vive nas propriedades do próprio formulário, que sabem se a gravação correu bem:
// OnSelect do botão Guardar
SubmitForm( Form1 )
// OnSuccess do Form1
Notify( "Contacto guardado com sucesso.", NotificationType.Success );
ResetForm( Form1 )
// OnFailure do Form1
Notify( "Não foi possível guardar: " & Form1.Error, NotificationType.Error )
O OnFailure apanha o erro que vem da fonte de dados (permissões, campo duplicado, coluna obrigatória do lado do servidor). Sem ele, uma gravação falhada é silenciosa.
Verificar o resultado
Carrega em F5 para pré-visualizar a app e testa três cenários:
- Formulário vazio: o botão Guardar aparece cinzento e não reage.
- Email "abc" e idade 12: surgem as mensagens vermelhas e o botão continua bloqueado.
- Dados válidos: o botão fica ativo, a gravação acontece e aparece a notificação verde.
Confirma ainda o registo na fonte de dados. Se o botão nunca ativar, verifica se os nomes dos controlos na fórmula (DataCardValue_Email, por exemplo) correspondem aos nomes reais na árvore de controlos — é a causa de erro mais comum.
Conclusão
Com Required, IsMatch, Form1.Valid e um botão condicional tens uma validação completa sem uma única linha de código fora do Power Fx. O passo seguinte natural é mover as regras de negócio mais pesadas para o Dataverse (colunas obrigatórias e business rules), para que fiquem garantidas mesmo quando os dados entram por outro canal. Qual das tuas validações atuais sobreviveria se alguém escrevesse na tabela sem passar pela app?