Thales159 Posted August 7 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 Report Posted August 7 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): 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. 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. 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). 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! 1
Eder Augusto Posted August 9 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 Report Posted August 9 (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 August 9 by Eder Augusto
Thales159 Posted August 10 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 Author Report Posted August 10 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: Mudei o contexto da fórmula para RhuPessoaData (era EduAlunoData). 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. No parâmetro da Consulta SQL, liguei o CPF pela tabela de pessoa: Tables["PPessoa"].Item["CPF"].AsString. Renomeei a consulta para ConsultaSQL. 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: 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? 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) 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! 1
Eder Augusto Posted August 12 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 Report Posted August 12 (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 August 12 by Eder Augusto
Thales159 Posted August 13 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 Author Report Posted August 13 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 1
Eder Augusto Posted August 13 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 Report Posted August 13 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
Thales159 Posted August 14 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 Author Report Posted August 14 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): 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). Contexto RhuPessoaData + gatilho na tela de Aluno → bloqueia, mas dá erro: Path 'Tables["PPessoa"].Item["CPF"]' avaliado como null. 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: 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"? 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! 1
Thales159 Posted August 27 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 Author Report Posted August 27 @Eder Augusto Poderia por favor continua me orientando? Continuo tentando e não consigo resolver 1
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now