Bug ou erro meu?

Pessoal, tenho uma aplicação onde ao inserir um registro já existente no banco de dados é necessário aparecer uma mensagem de erro. Quando este registro não existe, ele tem de mostrar uma mensagem que o registro foi inserido com sucesso. O que acontece é que ao mesmo tempo que aparece a mensagem de erro também aparece a mensagem de incluida com sucesso.

Realizei alguns testes colocando echo nos eventos:
Quando inseri um registro já existente no banco de dados apareceu os seguintes eventos: OnValidate - OnValidateSuccess - OnBeforeInsert - OnAfterInsert

Ao inserir um novo registro, veio os seguintes eventos: OnValidate - OnValidateSuccess - OnBeforeInsert - OnAfterInsert

Ao atualizar um registro, apareceu os seguintes eventos: OnValidate - OnValidateSuccess - OnBeforeUpdate - OnAfterUpdate

Abraço,

Thyago

Ate aí esta tudo certo. Posta seu código.

Segue o Código Cleyton:

if (sc_btn_insert)
{
sc_commit_trans();

$msg = “TABELA inserida com sucesso!”;
sc_redir(msg_generica.php, var_usunom = [var_usunom]; var_msg = $msg;);
}

if (sc_btn_update)
{
sc_commit_trans();

$msg = “TABELA atualizado com sucesso!”;
sc_redir(msg_generica.php, var_usunom = [var_usunom]; var_msg = $msg;);
}

Cleyton, veja como estou pensando que seria!

Na aplicação, temos o evento onValidateSuccess, onde na definição da mesma, está escrito “Ocorre quando não existe erro de validação”. Este erro, não seria por exemplo eu estar inserindo um registro já existente no banco de dados? Quando isso acontece ele mostra uma mensagem de erro avisando o motivo pelo qual não inseriu. Quando é verificado que o registro já existe ele não deveria mostrar o código contido neste evento certo? Caso contrário, ele mostraria a outra tela com a mensagem, conforme o código já postado anteriormente.

Obrigado

Thyago

Tente fazer seu tratamento sem o IF nos eventos depois de inserir e depois de atualizar.

Isso já foi feito, porém o erro acontece da mesma forma. Já tentei colocar no onValidateSuccess, no onValidate, no onAfterInsert e onAfterUpdate, no onBeforeInsert e onBeforeUpdate mas em nenhuma destas opções esta dando certo.

Eu utilizo assim:

No evento onValidate

// VERIFICA SE O E-MAIL JA E CADASTRADO
sc_lookup(db_cliente, “select email
from adm_clientes
where email = ‘{email}’”);

if(false === {db_cliente}){
sc_error_message(“Erro no acesso a tabela CLIENTES!” . {db_cliente});
return;
}elseif(!empty({db_cliente})){
sc_error_message(“E-Mail já cadastrado
Só é permitido um cadastro por E-Mail!”);
return;
}

No evento onAfterinsert

// CLIENTE CADASTRADO COM SUCESSO
sc_ajax_message (“O Cliente foi cadastrado com sucesso!”, “Processamento”, “timeout=10&button=Y&redir=usu_demonstrativo_geral.php”);
}

George, obrigado!

Desta forma deu certo mas será que não existe uma outra forma sem precisar fazer um select? O que acontece é que vou fazer isso em várias aplicações no meu projeto. Será que com isso não atrapalha em relação a rapidez do sistema?

Thyago Brasil

Quanto a degradar as aplicações acho que não vai acontecer, o pior é o trabalho manual.

Você pode utilizar a Chave única, o ruim é que não podemos configurar a mensagem e nem sempre fica légivel para o usuário final.

Não sei como é o comportamento da Chave única dentro da aplicação gerada, mas acho que também deve ser através de um select.

George, vou ver como vou fazer aqui então e qualquer coisa posto aqui novamente!!

Muito obrigado pela força

Thyago

Se vc for verificar registro duplicado, não vai ter como fugir de uma validação por select, pois o banco só vai retornar erro se for chave primária duplicada.

Ou seja, a não ser que o e-mail seja uma chave primária, você vai ter que ler a tabela para ver se não há registros que contenha o e-mail cadastrado.

Uma forma de vc agilizar uma pesquisa no banco é fazer um índice do campo que vai usar na where da query. Por exemplo, se vc vai pesquisar e-mail numa tabela, indexe esse campo no banco.

No caso da sua validação no ínicio do tópico, o que acontece é que após inserir um registro o SC não sabe qual botão foi clicado. Então ele executa o script sem considerar o if. É uma suposição.

ThyagoHenrique85,

Tudo bem?
Simulei o que você falou, em cada evento coloquei um echo"NomeEvento". (Validate, ValidateSucess, ValidateFailure, AfteInsert, AfterUpdate).

Fazendo as seguintes ações:

  • Atualizando registro que já existe: onValidate, onValidateSuccess e onAfterUpdate.
  • Atualizando registro que já existe, porém com um campo obrigatório vazio: onValidate, onValidateFailure
  • Inserindo um registro sem preencher os campos: onValidate, onValidateFailure

Até aqui não achei erro/bug algum.

Verifiquei que quando tento inserir um registo com a mesma chave primária ele passa nos seguintes eventos: onValidate, onValidateSuccess, onAfterInsert
Ai que ocorre o erro/bug pra você…

Segue imagem abaixo pra vc ver:

Agora acredito que seja bug do SC…

Júlia.

Boa tarde,

Vendo o que já foi postado e analisando entendo como bug por que o evento after insert é pra vim após todas os eventos de validação do registro. O ideal é esse teste ser validado pelo pessoal do SC para avaliar esse caso com carinho e se possível corrigir nas próximas atualizações nos notificando no tópico a correção.

Ats,

Ewerton e Julia, obrigado pelas respostas. Acredito também que seja bug pois não faz muito sentido quando eu inserir um registro já existente, por exemplo, ele entrar nos eventos OnValidate - OnValidateSuccess - OnBeforeInsert - OnAfterInsert. Neste caso deveria ter entrado no evento OnValidateFailure talvez?

Abraço

Thyago Brasil

Thyago,

Isso mesmo.

Só deve entrar no evento AfterInsert, APÓS INSERIR!

Como não conseguiu inserir, ele não poderia entrar no evento.

Agora precisamos que a SC, verifique pra gente!!

Júlia

No onbeforeinsert ele ja validaria o erro de constraint. Eu nao sei como é que internamente o SC faz isso mais acredito que ele pegue direto a mensagem do banco vindo da constraint e ja retorne com essa validação para o usuário. Agora nao sei em que momento eles fazem isso era pra ser no onbeforeinsert mais é interno deles isso eles teriam que dar uma analisada nessa situação ai para ver qual é mehor alternativa para evitar esse erro.

Ats,

O bug esta apenas em executar o evento onvalidatesucess, os demais eventos estão corretos. Pois foi feito um insert, apesar de mal sucedido. Tem uma variavel interna que eh setada quando ocorre um erro, a macro sc error exit verifica essa variavel e executa um return abortando o metodo.Se for fazer algum tipo de atualização em tabela por que não usar uma trigger?

Olá,

Estou verificando o que vocês descreveram e vou realizar alguns testes, tentarei trazer mais notícias o quanto antes!

Att.
Danilo Queiroga

Obrigado Danilo, estamos no aguardo de novidades!

Att,

Thyago