Conheça as melhorias da versão 8.0, 8.1, 8.2!
Clique aqui para saber mais
TCriteria como validação de dados Boa noite, galera. Tenho um método de retorno booleano para evitar que um Cliente preencha uma informação com um valor já existente em outro registro (uma constraint do tipo unique). Fiz uma primeira versão usando SQL diretamente, mas sei que isso não é recomendável. Então, lendo o fórum a e documentação do Adianti, estou tentando por TCriteria. Mas não tem jeito de funciona...
AM
TCriteria como validação de dados  
Boa noite, galera.

Tenho um método de retorno booleano para evitar que um Cliente preencha uma informação com um valor já existente em outro registro (uma constraint do tipo unique). Fiz uma primeira versão usando SQL diretamente, mas sei que isso não é recomendável. Então, lendo o fórum a e documentação do Adianti, estou tentando por TCriteria. Mas não tem jeito de funcionar: não ocorre nenhum erro, apenas o retorno TRUE - como se já existisse um valor igual na base de dados. Segue o método:

 
  1. <?php
  2. public function ChaveDeAcessoDuplicada($ChaveDeAcesso, $IdCliente = 0)
  3. {
  4. TTransaction::open('sc3');
  5. /* Classe TCriteria. Em teste.*/
  6. $ChaveDuplicada = new TCriteria();
  7. $ChaveDuplicada->add(new TFilter('CHAVE_DE_ACESSO', '=', $ChaveDeAcesso));
  8. /* Caso seja edição de um registro, previne a alteração do
  9. campo Chave de Acesso para um valor existente em outro Cliente. */
  10. if($IdCliente > 0)
  11. {
  12. $ChaveDuplicada->add(new TFilter('ID_CLIENTE', '<>', $IdCliente), TExpression::AND_OPERATOR);
  13. }
  14. $ChaveDuplicada->dump();
  15. if($ChaveDuplicada->isEmpty())
  16. {
  17. return FALSE;
  18. }
  19. else
  20. return TRUE;
  21. TTransaction::close();
  22. }
  23. ?>


Agradeço qualquer ajuda.

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 (2)


NR

Você está criando o criteria, mas não está "executando" a consulta. O TCriteria deve ser usado com a TRepository, por exemplo:
adianti.com.br/framework_files/tutor/index.php?class=CollectionLoadV
AM

Perfeito, Nataniel! Muito obrigado!

Posto aqui as duas soluções, por TCriteria e SQL, para o caso de alguém passar pelo mesmo problema:

 
  1. <?php
  2. public function ChaveDeAcessoDuplicada($ChaveDeAcesso, $IdCliente = 0)
  3. {
  4. TTransaction::open('sc3');
  5. /* Validação de Campo duplicado por TCriteria. */
  6. $ChaveDuplicada = new TCriteria();
  7. $ChaveDuplicada->add(new TFilter('CHAVE_DE_ACESSO', '=', $ChaveDeAcesso));
  8. /* Caso seja edição de um registro, previne a alteração do
  9. campo Chave de Acesso para um valor existente em outro Cliente. */
  10. if($IdCliente > 0)
  11. {
  12. $ChaveDuplicada->add(new TFilter('ID_CLIENTE', '<>', $IdCliente), TExpression::AND_OPERATOR);
  13. }
  14. $repository = new TRepository('Cliente');
  15. $Clientes = $repository->load($ChaveDuplicada);
  16. $Counter = 0;
  17. foreach($Clientes as $ClienteContador)
  18. {
  19. $Counter = $Counter + 1;
  20. }
  21. return $Counter > 0;
  22. /* Validação de Campo duplicado por SQL. */
  23. /*
  24. $vsSQL = "SELECT COUNT(1) AS CHAVE_EXISTENTE FROM sc3.cliente WHERE sc3.cliente.CHAVE_DE_ACESSO = '$ChaveDeAcesso'";
  25. if($IdCliente > 0)
  26. {
  27. $vsSQL = $vsSQL . " AND sc3.cliente.ID_CLIENTE <> '$IdCliente'";
  28. }
  29. //var_dump("String do SQL: '$vsSQL'");
  30. $conn = TTransaction::get();
  31. $result = $conn->query($vsSQL);
  32. if ($result)
  33. {
  34. foreach($result as $ContKey)
  35. {
  36. return $ContKey['CHAVE_EXISTENTE'] >= 1;
  37. }
  38. }
  39. else
  40. {
  41. return FALSE;
  42. }
  43. */
  44. TTransaction::close();
  45. }
  46. ?>