Jump to content
Seja Membro VIP - Remova Banners de Propagandas, Tenha Liberado Qualquer Download, Além de Acessos em Áreas Exclusivas!! ×

Fórmula visual - bloquear cadastro de aluno com cpf já existente (impedir ra duplicado) - RM 12.1.2410


Recommended Posts


  • Topic Count:  0
  • Topics Per Day:  0.00
  • Content Count:  5
  • Content Per Day:  0.07
  • Reputation:   5
  • Achievement Points:  35
  • Solved Content:  0
  • Days Won:  5
  • Status:  Offline
  • Device:  Windows

Posted

Boa tarde, pessoal.

Estou tentando criar uma validação via Fórmula Visual no RM Educacional 12.1.2410 (banco SQL Server) e travei. Preciso da ajuda de quem já fez algo parecido.


Objetivo: ao cadastrar um aluno pela tela de Alunos (EduAlunoAction / DataServer EduAlunoData), impedir/avisar quando o CPF informado já pertence a alguém que já é aluno (já tem RA). A instituição não permite mais de um RA por pessoa daqui pra frente. Já existem duplicados históricos na base que não podem ser excluídos, então a validação precisa valer só para novos cadastros.

Processo real: o operador clica em incluir (+), digita os dados na mão (o CPF fica na aba Documentos) e salva. Não usam a opção de localizar pessoa existente.

O que já montei na FV: Consulta SQL → Expressão → Se/Senão → Gerar Exceção.

O que já montei na FV: Consulta SQL → Expressão → Se/Senão → Gerar Exceção.

A consulta (numa sentença SQL):

SELECT COUNT(1) AS QTD
FROM SALUNO S
INNER JOIN PPESSOA P ON P.CODIGO = S.CODPESSOA
WHERE REPLACE(REPLACE(ISNULL(P.CPF,''),'.',''),'-','') = REPLACE(REPLACE(ISNULL(:CPF,''),'.',''),'-','')
  AND ISNULL(P.CPF,'') <> ''

Rodando essa consulta direto no banco (com um CPF real), ela funciona e retorna a contagem correta.

Os problemas que enfrentei (resumo dos testes):

  1. Gatilho "Antes de Salvar o Registro": os campos do registro (CPF, RA, CODPESSOA) chegam vazios/nulos na consulta. A documentação confirma que nesse gatilho o DataSet ainda não está preenchido.
  2. Gatilho "Após Salvar o Registro": aí os dados existem, mas o registro já foi gravado, e a consulta passa a contar o próprio aluno recém-criado (auto-registro), então bloqueia todos, inclusive pessoas novas que nunca foram alunos.
  3. Leitura do campo da tela: consegui referenciar o CPF digitado via Tables["SAluno"].Item["CPF"].AsString ligando o parâmetro da consulta a esse caminho — num teste chegou a ler o CPF (mensagem apareceu). Mas no "Salvar e Executar" dá erro GetRuntimeValue ... Path 'Tables["SAluno"].Item["CPF"]' avaliado como null (imagino que seja por não ter registro carregado nesse modo).
  4. Também esbarrei em erros na condição declarativa (Se/Senão) do tipo "referência de objeto não definida" e "propriedade ValorCalculado não existe" — resolvi usando this.rmsExpressionActivity1.Value.ToString() != "0".

Minhas dúvidas:

  • Qual é o gatilho correto para validar duplicidade de CPF antes de efetivar a gravação no cadastro de aluno, quando os dados são digitados na tela?
  • Como excluir o próprio registro que está sendo salvo da contagem, de forma confiável (o :RA/:CODPESSOA já disponíveis no momento certo)?
  • Existe forma recomendada de ler o campo digitado na tela (CPF) e usá-lo como parâmetro da consulta, que funcione de fato nesse cenário de inclusão manual?
  • Alguém já fez essa validação de "CPF único / RA único" por Fórmula Visual nas telas novas do Educacional (12.1.24x)? Se sim, qual a estrutura do fluxo que funcionou?

Agradeço muito qualquer orientação. Obrigado!

formula visual.png

  • Like 1

  • Topic Count:  6
  • Topics Per Day:  0.01
  • Content Count:  33
  • Content Per Day:  0.05
  • Reputation:   26
  • Achievement Points:  268
  • Solved Content:  0
  • Days Won:  11
  • Status:  Offline
  • Age:  25
  • Device:  Windows

Posted (edited)

Boa noite,

Vou te passar umas dicas que não validei, pode tentar?

1. Mude o contexto para RhuPessoa (a tabela de pessoas).

2. Use a atividade Executar sequência conforme o estado de registro combinado com o gatilho Antes de Salvar o Registro

3. Mova suas atividades para dentro de sequenciaInclusao

4. No parâmetro da atividade da Consulta SQL, passe o campo CPF da tabela PPESSOA.

5. Renomeie sua atividade Consulta SQL para algo como "ConsultaSQL"

6. Na condição da atividade SeSenão use a seguinte condição:

this.ConsultaSQL.Tables["RESULTADO"].HasData

7. Tente adicionar o gatilho na tabela de Alunos ou Pessoa

Isso é só um padrão de como eu costumo criar as fórmulas visuais desse tipo, mas o gatilho Antes de Salvar o Registro combinado com a atividade Executar sequência conforme o estado de registro já resolveria parte dos seus problemas.

Edited by Eder Augusto

  • Topic Count:  0
  • Topics Per Day:  0.00
  • Content Count:  5
  • Content Per Day:  0.07
  • Reputation:   5
  • Achievement Points:  35
  • Solved Content:  0
  • Days Won:  5
  • Status:  Offline
  • Device:  Windows

Posted

Olá Eder, muito obrigado pela orientação! Apliquei suas dicas e avancei bastante, mas empaquei num ponto e queria pedir mais uma luz.

O que fiz seguindo seu passo a passo:

  1. Mudei o contexto da fórmula para RhuPessoaData (era EduAlunoData).
  2. Adicionei a atividade "Executar sequência conforme o estado de registro" (RMSRecordStateSequence) e movi minha Consulta SQL + Se/Senão + Gerar Exceção para dentro da sequenciaInclusao.
  3. No parâmetro da Consulta SQL, liguei o CPF pela tabela de pessoa: Tables["PPessoa"].Item["CPF"].AsString.
  4. Renomeei a consulta para ConsultaSQL.
  5. A consulta retorna linha só quando há duplicado (sem COUNT).

O problema: na condição do Se/Senão, ao tentar usar o HasData, dá erro ao gravar um aluno:

"Referência de objeto não definida para uma instância de um objeto."

Testei várias formas na condição, e cada uma dá um retorno:

  • this.ConsultaSQL.Tables["TABLE"].HasData → referência de objeto ao gravar
  • this.ConsultaSQL.Tables[0].HasData → referência de objeto ao gravar
  • this.ConsultaSQL.Tables[0].Rows.Count > 0 → erro: propriedade "Count" não existe no tipo RMSWorkflowDataRowCollection
  • this.ConsultaSQL.Tables[0].Rows.HasData → erro: propriedade "HasData" não existe nesse tipo

Quando desabilito o Se/Senão, o aluno grava normal — então a consulta e a leitura do CPF parecem estar OK; o erro está na condição.

Minha suspeita (e é onde preciso da sua ajuda): meu contexto é RhuPessoaData, mas o gatilho está na tela de Aluno (EduAlunoData / EduAlunoAction), no evento "Antes de Salvar o Registro". Vi que na sua dica 7 você mencionou amarrar o gatilho "na tabela de Alunos ou Pessoa".

Perguntas:

  1. Com o contexto em RhuPessoaData, o gatilho deveria estar na tela de Pessoa em vez de Aluno? Ou dá pra manter na tela de Aluno?
  2. Qual é o nome correto da tabela de resultado da Consulta SQL pra usar no HasData? (no seu exemplo era Tables["RESULTADO"], mas aqui parece não bater)
  3. Existe algum ajuste no alinhamento contexto × gatilho que eu esteja deixando passar?

Ambiente: RM 12.1.2410, SQL Server, módulo Educacional. O objetivo é impedir cadastrar aluno com CPF que já pertence a alguém que já é aluno (RA único por pessoa).

Muito obrigado pela paciência e pela ajuda!

gatilho.png

erro.png

formula.png

  • Like 1

  • Topic Count:  6
  • Topics Per Day:  0.01
  • Content Count:  33
  • Content Per Day:  0.05
  • Reputation:   26
  • Achievement Points:  268
  • Solved Content:  0
  • Days Won:  11
  • Status:  Offline
  • Age:  25
  • Device:  Windows

Posted (edited)

Boa noite,

Em 10/08/2026 at 15:35, Thales159 disse:

Com o contexto em RhuPessoaData, o gatilho deveria estar na tela de Pessoa em vez de Aluno? Ou dá pra manter na tela de Aluno?

A tela de cadastro de alunos utiliza várias tabelas em conjunto (SALUNO, PPESSOA, etc.), considerando isso, te aconselho a adicionar o gatilho na tela de Pessoa, mantendo Antes de Salvar o Registro. Se isso não funcionar, volte para o contexto e gatilho para a tela de Aluno. Obs.: No parâmetro da consulta SQL, você deve informar o CPF que, provavelmente, está em uma cascata de tabelas e campos (Tabela SALUNO > Tabela PESSOA > Campo CPF).

Em 10/08/2026 at 15:35, Thales159 disse:

Qual é o nome correto da tabela de resultado da Consulta SQL pra usar no HasData? (no seu exemplo era Tables["RESULTADO"], mas aqui parece não bater)

A atividade Consulta SQL retorna dados, e esses dados ficam na tabela "RESULTADO". Quando utilizamos a atividade Se/Senão com a condição declarativa informada, estamos retornando um valor booleano. Seria tipo uma pergunta: "minha consulta retornou algo?". Se sim, é porque tem duplicados, então vai gerar a exceção (bloqueio) de cadastro na hora da inclusão de um novo registro. Resumindo, você deve usar literamente a condição declarativa abaixo na atividade Se/Senão:

this.ConsultaSQL.Tables["RESULTADO"].HasData


Se ainda estiver com erros/dúvidas, capture ou grave um vídeo das propriedades das suas atividades (Consulta SQL, Condição Declarativa, Exceção) e/ou, se possivel, exporte a fórmula visual e a consulta SQL.

Edited by Eder Augusto

  • Topic Count:  0
  • Topics Per Day:  0.00
  • Content Count:  5
  • Content Per Day:  0.07
  • Reputation:   5
  • Achievement Points:  35
  • Solved Content:  0
  • Days Won:  5
  • Status:  Offline
  • Device:  Windows

Posted
Em 12/08/2026 at 01:58, Eder Augusto disse:

Se ainda estiver com erros/dúvidas, capture ou grave um vídeo das propriedades das suas atividades (Consulta SQL, Condição Declarativa, Exceção) e/ou, se possivel, exporte a fórmula visual e a consulta SQL.

Boa noite, tudo bem?

Segui as novas orientações e não funcionou. Estou nesse problema há uns meses já tentando, e confesso que estou perdido.

Vou te enviar a consulta e a formula como o solicitado.

Segue consulta:
SELECT S.RA AS RESULTADO
FROM PPESSOA P
INNER JOIN SALUNO S ON P.CODIGO = S.CODPESSOA
WHERE REPLACE(REPLACE(ISNULL(P.CPF,''),'.',''),'-','') = REPLACE(REPLACE(ISNULL(:CPF,''),'.',''),'-','')
  AND ISNULL(P.CPF,'') <> ''

Segue o link do drive com a fórmula
https://drive.google.com/file/d/1Vg7Rq0h7xzkmqtZMBTcMMOWFKuwNildH/view?usp=sharing

Segue formula:

Preparaçãoe planeamento de impostos
  • Like 1

  • Topic Count:  6
  • Topics Per Day:  0.01
  • Content Count:  33
  • Content Per Day:  0.05
  • Reputation:   26
  • Achievement Points:  268
  • Solved Content:  0
  • Days Won:  11
  • Status:  Offline
  • Age:  25
  • Device:  Windows

Posted

Boa tarde,

O que estava acontecendo é que sua consulta SQL já retornava vazia e, por isso passava pela condição declarativa Se/Senão. Fiz um pequeno ajuste, valide novamente.

Bloqueio de Cadastro de Aluno.rar


  • Topic Count:  0
  • Topics Per Day:  0.00
  • Content Count:  5
  • Content Per Day:  0.07
  • Reputation:   5
  • Achievement Points:  35
  • Solved Content:  0
  • Days Won:  5
  • Status:  Offline
  • Device:  Windows

Posted

Eder, boa noite. Primeiro, muito obrigado pela paciência e por toda a ajuda até aqui  já aprendi bastante no processo.

Apliquei o SQL novo (SELECT 1 ... WHERE P.CPF = :CPF) e testei várias combinações, mas continuo travado no "Referência de objeto não definida para uma instância de um objeto". Deixa eu te passar o mapa completo do que descobri:

Como funciona o cadastro aqui:

  • O operador digita o CPF na mão na tela de Aluno.
  • A pessoa já existe antes pode já ter sido criada ou cria uma pessoa nova depois. E só vincula a pessoa existente a um novo RA.

Testes que fiz (resumo do impasse):

  1. Contexto RhuPessoaData + gatilho na tela de Pessoa → A query do jeito que você mandou, não dá erro, mas não bloqueia. Acredito que seja porque o gatilho de Pessoa não dispara ao cadastrar o aluno (a pessoa já existe, não está sendo criada/alterada).
  2. Contexto RhuPessoaData + gatilho na tela de Alunobloqueia, mas dá erro: Path 'Tables["PPessoa"].Item["CPF"]' avaliado como null.
  3. Contexto de Aluno (EduAlunoData) + gatilho Aluno + CPF ligado em Tables["SALUNO"].Item["CPF"].AsString → dá "Referência de objeto não definida" ao gravar. (Nesse contexto o CPF aparece na árvore em SALUNO > Item > CPF > AsString.)

Isolamento que fiz:

  • Troquei o :CPF por um valor fixo no SQL e o erro continuou então parece não ser o parâmetro CPF.

Minhas dúvidas:

  1. Com o cadastro sendo feito pela tela de Aluno (CPF digitado na mão, pessoa já existente), qual é a combinação correta de contexto + gatilho + caminho do parâmetro CPF pra que a consulta funcione sem o "referência de objeto"?
  2. A condição this.ConsultaSQL.Tables["RESULTADO"].HasData depende de a tabela de resultado se chamar exatamente "RESULTADO"? Tem como eu confirmar/definir esse nome?

Ambiente: RM 12.1.2410, SQL Server, módulo Educacional.
 

Muito obrigado mais uma vez!

  • Like 1
  • 2 weeks later...

  • Topic Count:  0
  • Topics Per Day:  0.00
  • Content Count:  5
  • Content Per Day:  0.07
  • Reputation:   5
  • Achievement Points:  35
  • Solved Content:  0
  • Days Won:  5
  • Status:  Offline
  • Device:  Windows

Posted

@Eder Augusto

Poderia por favor continua me orientando?
Continuo tentando e não consigo resolver

  • Like 1

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.