Formulário está salvando após falha na validação

Em uma aplicação do tipo formulário, tenho um campo texto “paciente_cartao_sus” que se refere ao código CNS (cartão nacional de saúde) do paciente.

No evento ajax paciente_cartao_sus_onBlur() faço a validação do código. Quando o código é inválido, uso a macro sc_error_message(“Cartão do SUS (CNS) inválido!”);. Até aqui tudo bem, quando o usuário sai do campo paciente_cartao_sus a validação é feita e, caso seja inválido, o campo fica vermelho e a mensagem de erro aparece abaixo do input text.

Acontece que se o usuário ignorar a mensagem e clicar em salvar, os dados são salvos como se estivesse tudo bem…

Sei que se eu duplicar a verificação, colocando-a no evento onValidate() irá travar a gravação. Mas acho isso muito deselegante.

Há alguma outra forma de o SC “lembrar” que ocorreu um erro de validação (inclusive, como eu disse antes, até a cor do input muda para vermelho…)?

Em resumo, quero resolver o problema mas:

  • não quero duplicar o código da verificação;
  • não quero deixar de validar o CNS no ato da digitação (onBlur).

Essa validação vc está fazendo via código correto? Depois que usar a macro sc_error_message, coloque a sc_error_exit(); que ele não salva enquanto estiver incorreto.

Obrigado pela resposta, Thyago.

Inseri o código e o comportamento permaneceu o mesmo.

Este é o código que faz a validação, no evento ajax paciente_cartao_sus_onBlur(), já com a alteração sugerida:

[code] if(strlen({paciente_cartao_sus}) != 15) {

	sc_error_message("Cartão do SUS deve possuir 15 dígitos.");
	sc_error_exit();
}
elseif(!fn_validar_cns({paciente_cartao_sus})) {

	sc_error_message("Cartão do SUS (CNS) inválido!");
	sc_error_exit();
}[/code]

A validação em si está correta. Se eu coloco este código fonte acima no evento onValidate() a gravação só ocorre se o valor inserido for válido.
Entretanto, o usuário só fica sabendo que está o valor está errado depois de ter entrado com todas as informações do formulário e clicar em salvar.

É muito importante que a validação ocorra assim que o usuário informar os dados do Cartão do SUS, pois há outras rotinas que dependem desta informação.

porque não usar a onchange em vez da onblur?

Olá Haroldo. Obrigado por responder.

Movi o código de onBlur para onChange mas, como eu imaginava, o problemas permaneceu o mesmo.

No SC não há alguma macro para saber se há erros?

Eu estava pensando em algo no onValidate() estilo:
if(sc_there_are_errors) {
//cancela a gravação…
}

Sabe se há algo parecido?

Jonatas,

Eu faço assim (no meu caso valido o CPF):

$cSql = “SELECT cpf FROM pessoas where cpf = '”.{cpf}."’";
sc_lookup(rs, $cSql);

if (isset({rs[0][0]})) // Row found
{
sc_ajax_message(“CPF já existe no Cadastro de Membros, verifique!”, “ATENÇÃO”,“button=Y&redir=grid_pessoas.php&show_close=N”);
}

No meu caso ele volta para a grid, fazendo com que o usuário faça o processo novamente. Ou poderia fazer o redir para a própria aplicação.

Para ficar ainda mais “engraçado”, quando eu duplico o código (no ajax onBlur e no onValidate) e clico em salvar, o SC mostra a mensagem duas vezes, uma que foi gerada no evento onBlur e a outra, que foi gerada no onValidate:

Isso reforça minha ideia de que há alguma variável ou array que receba as mensagens de erro geradas pela macro sc_error_message()

Penso que se no onValidate eu verificar se essa variável ou array (que eu suponho que exista) tudo se resolva…

Olá Kleyber! Muito obrigado por responder.

A validação em si está sendo feita corretamente. A questão é que ao clicar em salvar, o SC está ignorando a validação realizada no evento ajax onBlur() e acaba por salvar o registro.

Repita o mesmo código na onValidate e teste.

Ops… cheguei atrasado.
Você pode desabilitar o botão salvar quando der erro ou sõ usar a validação na onvalidate.

Mas a principio sc_error_message deveria evitar o salvamento.

Ola

Ja tive varios problemas com essa macro sc_error_exit();

Experimente usar return;

Quais problemas? Eu particularmente, nunca tive problema com sc_error_message e sc_error_exit();

Ola

https://forum.scriptcase.com.br/index.php/topic,8434.0/topicseen.html

https://forum.scriptcase.com.br/index.php/topic,12013.msg81463.html#msg81463

Olá,

Sugestão:

  • Crie um método PHP em: Programação, Métodos PHP
  • Chame o método PHP no evento onValidate e no evento ajax onChange

Boa tarde,

Para esse caso tente desmarcar o campo como obrigatório e depois no evento onValidate verifique se ele é vazio e/ou tem o codigo indicado conforme a regra que o campo precisa.

if ( empty({campo_sus}) || {campo_sus} == errado) {

{campo_sus} = ‘’;
sc_error_message(sua msg);

}

Não creio que precise de mais macros alem disto.

Veja o que dá.

Sds.

Jônatas,

Acho que você não entendeu o que postei. Esse código faz a VALIDAÇÃO e também já faz o RETORNO para a aplicação que o chamou, não permitindo ao usuário clicar no botão SALVAR.