Autor Tópico: [RESOLVIDO] - Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql  (Lida 357 vezes)

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Boa tarde pessoal.
Tenho no banco uma regra onde não se pode gravar 2 registros com o mesmo nome.
O usuário ao tentar fazer isso é gerado um erro.
Gostaria de saber se tem como personalizar essa mensagem.


"Erro ao alterar a base de dados:
Duplicate entry 'xx' for key 'nome_do_campo_UNIQUE'
View SQL"
« Última modificação: Junho 13, 2016, 02:24:57 pm por Ronyan Alves »
Celso R.
________________________________
SC - V 8

Thyago Brasil

  • Expert
  • *****
  • Mensagens: 884
  • Crê no Senhor Jesus e será salvo tu e tua família
    • www.brasdesign.com.br
    • Email
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #1 Online: Junho 06, 2016, 02:06:10 pm »
Celso, boa tarde!!

Será que isso te ajuda?

sc_error_insert: Esta macro configura a variável que contem a mensagem de erro do banco de dados que pode ocorrer durante a inclusão de um registro.

Nunca usei essa macro, mas pelo que me parece faz isso que vc está precisando.
Thyago Brasil
Desenvolvedor Web
Site: http://www.brasdesign.com.br

SC 5.02/SC 8.1

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #2 Online: Junho 06, 2016, 02:20:25 pm »

Boa tarde Thiago.
Tentei assim mas sem sucesso no evento onAfterInsert do Form múltiplos registros:
Código: [Selecionar]
if (!empty({sc_error_insert})) {
      //sc_rollback_trans();
      echo 'texto 1';
      sc_error_exit();
}
else {
     //sc_commit_trans();
    echo 'texto 2';
}
« Última modificação: Junho 06, 2016, 02:30:11 pm por Celso R. »
Celso R.
________________________________
SC - V 8

Jailton

  • Expert
  • *****
  • Mensagens: 2030
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #3 Online: Junho 06, 2016, 03:27:07 pm »
Cria o metódo PHP: checar_duplicidade
Código: [Selecionar]
if (sc_btn_new) {

/* Macro sc_lookup */

$cpf_pesquisa={CPF};

sc_lookup(ass,"
SELECT
   Plano,
   Codigo,
   Nome
FROM
   associados
WHERE
   CPF = '$cpf_pesquisa'
");

/* Erro no lookup */
if (FALSE === {ass}) {
sc_error_message("Ocorreu um erro no acesso ao banco de dados.<BR>");
}
elseif (empty({ass})) { /* EOF */
// Esta tudo Ok, pode continuar a Inclusão.
}
else {
   If ({CPF}>0) {
   sc_error_message('Associado CPF já Cadastrado no Plano: '.{ass[0][0]}.'-'.{ass[0][1]}.".<BR>");
   }
}

}

1) Ai chama ele no Evento Ajax OnBlur do campo que não pode ser repetido.
    checar_duplicidade();

2) Coloca no Onvalidate Também.
    checar_duplicidade();
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #4 Online: Junho 06, 2016, 03:38:13 pm »

Caro Jailton boa tarde.Esse método já utilizo.
Queria melhorar utilizando os recursos do próprio banco de dados.

Celso R.
________________________________
SC - V 8

Jailton

  • Expert
  • *****
  • Mensagens: 2030
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #5 Online: Junho 06, 2016, 04:13:20 pm »

Caro Jailton boa tarde.Esse método já utilizo.
Queria melhorar utilizando os recursos do próprio banco de dados.


Para personalizar a mensagem vá em Aplicação > Mensagens e escreva a mensagem no valor do campo: Violação de chave única


O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #6 Online: Junho 07, 2016, 12:08:18 am »
Já fiz isso anteriormente.
Não funciona quando se tem a regra no BD.
Celso R.
________________________________
SC - V 8

Jailton

  • Expert
  • *****
  • Mensagens: 2030
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #7 Online: Junho 07, 2016, 09:25:08 am »
Faz um teste, transforma esse formulário multi-registros em 1 registro:
Ai no OnAfaterInsert Coloca:
if (!isset({sc_error_insert}) {
    echo "Gravado!! Sucesso!!"."<BR>";
}else{
   echo "Erro: {sc_error_insert}"."<BR>";
}
break;

Ai se der certo volta ele para multi-registros e testa, se DER erro 'o sc ignorar' ai passa para o SUPORTE.
bugs@netmake.com.br
O Princípio da Vibração. "Nada está parado, tudo se move, tudo vibra". Caibalion.

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #8 Online: Junho 08, 2016, 09:32:08 pm »
Vou testar.
Celso R.
________________________________
SC - V 8

Ronyan Alves

  • Administrator
  • Avançado
  • *****
  • Mensagens: 353
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #9 Online: Junho 09, 2016, 09:11:43 am »
Faz um teste, transforma esse formulário multi-registros em 1 registro:
Ai no OnAfaterInsert Coloca:
if (!isset({sc_error_insert}) {
    echo "Gravado!! Sucesso!!"."<BR>";
}else{
   echo "Erro: {sc_error_insert}"."<BR>";
}
break;

Ai se der certo volta ele para multi-registros e testa, se DER erro 'o sc ignorar' ai passa para o SUPORTE.
bugs@netmake.com.br

A macro está sendo usada de maneira incorreta.

Veja a documentação: http://www.scriptcase.com.br/docs/pt_br/v81/macros-scriptcase/macros-scriptcase#sc_error_continue

Exemplo:
sc_error_continue("delete");
if (!empty({sc_erro_delete}))
{
$tmp = strrpos({sc_erro_delete}, "]");
if ($tmp !== false)
{
{sc_erro_delete} = substr({sc_erro_delete}, $tmp + 1);
}
sc_error_message({sc_erro_delete});
sc_erro_exit;
}

No teu caso, usar no evento OnBeforeInsert
"sc_error_continue("insert");
if (!empty({sc_erro_insert}))...."
--

Ronyan Alves
Equipe Scriptcase

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #10 Online: Junho 12, 2016, 09:46:44 pm »
Funcionou a dica do Ronyan.
Com a seguinte ressalva:
Utilizei nos seguintes eventos: onAfterInsert; onAfterUpdate;
Com isso as mensagens foram personalizadas.
Mas surgiu uma duvida.
Na tabela tenho 3 campos sendo 2 deles não podem se repetir configurado no próprio banco de dados.
O usuário preenche o campo1 e depois o campo2 mas somente o campo2 já possui cadastro na tabela, e o banco retorna o erro.
Como informar para o usuário que somente o campo2 está errado e precisa ser alterado?
Código: [Selecionar]
sc_error_continue("insert");
if (!empty({sc_erro_insert}))
{
   $tmp = strrpos({sc_erro_insert}, "]");
   if ($tmp !== false)
{
   {sc_erro_insert} = substr({sc_erro_insert}, $tmp + 1);
}
   sc_error_message('Já cadastrado no Banco de Dados');
   sc_erro_exit;
}
« Última modificação: Junho 13, 2016, 08:47:26 am por Celso R. »
Celso R.
________________________________
SC - V 8

Ronyan Alves

  • Administrator
  • Avançado
  • *****
  • Mensagens: 353
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #11 Online: Junho 13, 2016, 08:58:44 am »
Na mensagem de erro retornada pelo banco de dados, terá o nome da coluna que ocasionou a exceção.
No tratamento da substr , você pode extrair o nome deste campo, e com um if, fazer a validação de qual campo foi a exceção, e colocar na mensagem para ser exibida.
--

Ronyan Alves
Equipe Scriptcase

Celso R.

  • Expert
  • *****
  • Mensagens: 941
Re:Personalizar Mensagem de Erro - Chave Única - Setada no BD Mysql
« Responder #12 Online: Junho 13, 2016, 02:16:58 pm »
Ok Ronyan.
Obrigado.
Celso R.
________________________________
SC - V 8