Traduzir exceções para registros repetidos Boa tarde pessoal, Alguém pode me dar uma dica de como tratar a mensagem para a exceção de quando identificar dados repetidos num cadastro? Por exemplo, eu tenho o campo "Matrícula" no meu formulário de cadastro. No banco de dados mysql eu já defini o campo como Unique. A regra está funcionando perfeitamente, o que eu quero fazer é personalizar a mensagem de erro e deixá-la como as mensa...
FS
Traduzir exceções para registros repetidos  
Fechado
Boa tarde pessoal,
Alguém pode me dar uma dica de como tratar a mensagem para a exceção de quando identificar dados repetidos num cadastro? Por exemplo, eu tenho o campo "Matrícula" no meu formulário de cadastro. No banco de dados mysql eu já defini o campo como Unique. A regra está funcionando perfeitamente, o que eu quero fazer é personalizar a mensagem de erro e deixá-la como as mensagens das demais validações do Adianti. (Estou utilizando o layout ERP II). Então, eu preciso saber em qual exceção eu preciso trabalhar e como adicionar a mensagem correta.

A mensagem atual está apresentando desta maneira:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2222' for key 'matricula'

Gostaria que aparecesse assim:

Registro Duplicado!
ou
Matrícula 'XXXX' já cadastrada!

Obrigado.

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (15)


LC

.
FS

Bom dia Leandro, tudo certo?

Não entendi sua mensagem. Você sabe como devo fazer para alterar a mensagem desta exceção?

Abraço.
FC

Não testei mas acho que é por ai...

catch (Exception $e) // in case of exception
{

if($e->getCode() ==1062){
new TMessage('error', 'Error ' . 'Registro já existe');
}else{
new TMessage('error', 'Error ' . $e->getMessage()); // shows the exception error message
}
TTransaction::rollback(); // undo all pending operations
}
FS

Felipe,
É na função onSave que devo fazer este tratamento?

Obrigado.
FC

existe essa contribuição na epoca não entendi muito bem pois acredito que somente precisamos tratar o erro igual fazia nos tempo de visual basic.

adianti.com.br/forum/pt/view_1103?tuniquevalidator

no onSave da sua classe la no final deve haver esse tratamento de erro é só alterar essa parte do código que postei depois me diga o resultado pois não testei hj é segunda rsrs
FS

Eu testei, mas apresentou a mesma mensagem, a padrão.

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2222' for key 'matricula'

FC

posta seu codigo onSave ae.
FS

Este é o que eu tinha feito, onde está tratando apenas as validações (campos obrigatórios).
 
  1. <?php
  2. function onSave()
  3. {
  4. try
  5. {
  6. // open a transaction with database 'una'
  7. TTransaction::open('una');
  8. // get the form data into an active record Alunos
  9. $object = $this->form->getData('Alunos');
  10. // form validation
  11. $this->form->validate();
  12. // stores the object
  13. $object->dt_nascimento = TDate::date2us($object->dt_nascimento);
  14. $object->store();
  15. // set the data back to the form
  16. //$this->form->setData($object);
  17. // close the transaction
  18. TTransaction::close();
  19. // shows the success message
  20. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  21. $this->form->clear();
  22. // reload the listing
  23. }
  24. catch (Exception $e) // in case of exception
  25. {
  26. // shows the exception error message
  27. new TMessage('error', '<b>Por favor verifique os campos abaixo:</b></br> ' . $e->getMessage());
  28. // undo all pending operations
  29. TTransaction::rollback();
  30. }
  31. }
  32. ?>
FC

 
  1. <?php
  2. function onSave()
  3. {
  4. try
  5. {
  6. // open a transaction with database 'una'
  7. TTransaction::open('una');
  8. // get the form data into an active record Alunos
  9. $object = $this->form->getData('Alunos');
  10. // form validation
  11. $this->form->validate();
  12. // stores the object
  13. $object->dt_nascimento = TDate::date2us($object->dt_nascimento);
  14. $object->store();
  15. // set the data back to the form
  16. //$this->form->setData($object);
  17. // close the transaction
  18. TTransaction::close();
  19. // shows the success message
  20. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  21. $this->form->clear();
  22. // reload the listing
  23. }
  24. catch (Exception $e) // in case of exception
  25. {
  26. if($e->getCode() ==1062){
  27. new TMessage('error', 'Error ' . 'Registro já existe');
  28. }else{
  29. new TMessage('error', 'Error ' .$e->getCode(). '-' . $e->getMessage()); // shows the exception error message
  30. }
  31. TTransaction::rollback(); // undo all pending operations
  32. }
  33. }
  34. ?>
FC

Corrige ai onde é if($e->getCode() ==1062) na verdade é if($e->getCode() ==23000) testei aqui funciona direitinho.
FS

Eu tinha testado assim Felipe, mas testei novamente para ter certeza. A mensagem continua a mesma.

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2222' for key 'matricula'

Eu já tentei de várias formas, mas sem sucesso. Vou te passar o código inteiro desta minha classe, talvez vc identifique algo que eu não tenha visto.

Obrigado.

 
  1. <?php
  2. /**
  3. * FormAlunos Registration
  4. * @author <Fabiano dos Santos>
  5. */
  6. class FormAlunos extends TPage
  7. {
  8. private $form;
  9. private $datagrid;
  10. private $pageNavigation;
  11. private $loaded;
  12. /**
  13. * Class constructor
  14. * Creates the page and the registration form
  15. */
  16. function __construct()
  17. {
  18. parent::__construct();
  19. // creates the form
  20. $this->form = new TForm('form_Alunos');
  21. try
  22. {
  23. // TUIBuilder object
  24. $ui = new TUIBuilder(500,500);
  25. $ui->setController($this);
  26. $ui->setForm($this->form);
  27. // reads the xml form
  28. $ui->parseFile('app/forms/Aluno.form.xml');
  29. // get the interface widgets
  30. $fields = $ui->getWidgets();
  31. // look for the TDataGrid object
  32. foreach ($fields as $name => $field)
  33. {
  34. if ($field instanceof TDataGrid)
  35. {
  36. $this->datagrid = $field;
  37. $this->pageNavigation = $this->datagrid->getPageNavigation();
  38. }
  39. }
  40. // add the TUIBuilder panel inside the TForm object
  41. $this->form->add($ui);
  42. // set form fields from interface fields
  43. $this->form->setFields($ui->getFields());
  44. //Validações
  45. $nome = $ui->getWidget('nome');
  46. $nome->addValidation('Nome', new TRequiredValidator);
  47. $matricula = $ui->getWidget('matricula');
  48. $matricula->addValidation('Matricula', new TRequiredValidator);
  49. $linguas = $ui->getWidget('linguas');
  50. $linguas->addValidation('Idioma', new TRequiredValidator);
  51. $dt_nascimento = $ui->getWidget('dt_nascimento');
  52. $dt_nascimento->addValidation('Data de Nascimento', new TRequiredValidator);
  53. $endereco_res = $ui->getWidget('endereco_res');
  54. $endereco_res->addValidation('Endereço Residencial', new TRequiredValidator);
  55. $celular = $ui->getWidget('celular');
  56. $celular->addValidation('Telefone Celular', new TRequiredValidator);
  57. $bairro = $ui->getWidget('bairro');
  58. $bairro->addValidation('Bairro', new TRequiredValidator);
  59. $cidade = $ui->getWidget('cidade');
  60. $cidade->addValidation('Cidade', new TRequiredValidator);
  61. $email = $ui->getWidget('email');
  62. $email->addValidation('Email', new TEmailValidator);
  63. $rg = $ui->getWidget('rg');
  64. $rg->addValidation('RG', new TNumericValidator);
  65. $cpf = $ui->getWidget('cpf');
  66. $cpf->addValidation('CPF', new TCPFValidator);
  67. $cep = $ui->getWidget('cep');
  68. $cep->addValidation('CEP', new TMaxLengthValidator, array(8));
  69. // wrap the page content using vertical box
  70. $vbox = new TVBox;
  71. $vbox->add(new TXMLBreadCrumb('menu.xml', __CLASS__));
  72. parent::add($vbox);
  73. }
  74. catch (Exception $e)
  75. {
  76. new TMessage('error', $e->getMessage());
  77. }
  78. // add the form to the page
  79. parent::add($this->form);
  80. }
  81. /**
  82. * method onSave()
  83. * Executed whenever the user clicks at the save button
  84. */
  85. function onSave()
  86. {
  87. try
  88. {
  89. // open a transaction with database 'una'
  90. TTransaction::open('una');
  91. // get the form data into an active record Alunos
  92. $object = $this->form->getData('Alunos');
  93. // form validation
  94. $this->form->validate();
  95. // stores the object
  96. $object->dt_nascimento = TDate::date2us($object->dt_nascimento);
  97. $object->store();
  98. // set the data back to the form
  99. //$this->form->setData($object);
  100. // close the transaction
  101. TTransaction::close();
  102. // shows the success message
  103. new TMessage('info', TAdiantiCoreTranslator::translate('Record saved'));
  104. $this->form->clear();
  105. // reload the listing
  106. }
  107. catch (Exception $e) // in case of exception
  108. {
  109. // shows the exception error message
  110. new TMessage('error', '<b>Por favor verifique os campos abaixo:</b></br> ' . $e->getMessage());
  111. // undo all pending operations
  112. TTransaction::rollback();
  113. }
  114. }
  115. function onEdit($param)
  116. {
  117. try
  118. {
  119. if (isset($param['key']))
  120. {
  121. $key=$param['key']; // get the parameter $key
  122. TTransaction::open('una'); // open a transaction with the database
  123. $object = new Alunos($key); // instantiates the Active Record
  124. $object->dt_nascimento = TDate::date2br($object->dt_nascimento);
  125. $object->store();
  126. $this->form->setData($object); // fill the form with the active record data
  127. TTransaction::close(); // close the transaction
  128. }
  129. else
  130. {
  131. $this->form->clear();
  132. }
  133. }
  134. catch (Exception $e) // in case of exception
  135. {
  136. new TMessage('error', '<b>Error</b> ' . $e->getMessage()); // shows the exception error message
  137. TTransaction::rollback(); // undo all pending operations
  138. }
  139. }
  140. }
  141. ?>
LC

Fabiano, eu coloquei a mensagem com o ponto, só para acompanhar o topico, para ver as dicas.
Abraço.
FS

Ok Leandro,
Ainda não tive sucesso, estou pesquisando.

Abraço.
PD

People,

Prefiro usar essa outra solução:
https://soprogramando.wordpress.com/2011/09/29/traduzir-as-mensagens-do-mysql-para-o-portugues/

Simplesmente para evitar muitos IFs específicos no código-fonte que provavelmente deixarão de funcionar se trocar de banco de dados...

Abs!
FS

Bom dia,
Pablo, ficou melhor desta forma que você nos orientou. Só estou com dificuldades em achar no meu servidor web, onde encontro o arquivo my.ini, no meu computador foi tranquilo. Mas valeu, vou garimpar pra encontrar.

Abraços.