Lançado Adianti Framework 8.1!
Clique aqui para saber mais
ID CHAVE PRIMÁRIA ALFANUMÉRICA (VARCHAR) Olá pessoal. Já fiz algumas postagens de dúvidas e até agora foram todas esclarecidas, e como estou iniciando no framework, mesmo vendo vídeo e lendo o livro estou tentando entender algumas coisas. Caso em determinado projeto eu tenha que ter um ID (chave primária) sendo alfanumérico (varchar). Como faço pelo framework? Vou dar um exemplo só para tentar deixar fácil a compreensão. ...
HB
ID CHAVE PRIMÁRIA ALFANUMÉRICA (VARCHAR)  
Olá pessoal.
Já fiz algumas postagens de dúvidas e até agora foram todas esclarecidas, e como estou iniciando no framework, mesmo vendo vídeo e lendo o livro estou tentando entender algumas coisas.

Caso em determinado projeto eu tenha que ter um ID (chave primária) sendo alfanumérico (varchar). Como faço pelo framework?
Vou dar um exemplo só para tentar deixar fácil a compreensão.

Imaginem que eu tenha um cadastro de estado somente com dois campos (UF, e NOME). Se eu fizer, por exemplo, uma importação de XMI pelo framework ele vai criar ID, UF, e NOME. Só que eu gostaria que o UF fosse o ID.

Por que disso?
Imagine que eu cadastrei SP – São Paulo. Se tiver um ID conforme gerado pelo framework, eu posso ter a sigla SP cadastrada várias vezes, mais nesse caso eu preciso garantir que SP seja cadastrado somente uma vez.

Sei que uma chave alfanumérica não é o recomendado, mais nesse caso não seria o certo?
Como posso resolver situações semelhantes à esta dentro do framework?

Obrigado
José Humberto Júnior

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


MG

Se analisarmos a estrutura de dados fornecida pelos Correios, você tem 2 tabelas (principais), sendo uma estado: conterá 28 registros no máximo e outra de cidades que conterá aproximadamente 5500 registros.
Tendo o ID na tabelas de estado e foreign key na tabela cidade, não haverá repetição da sigla UF.
Portanto eu sugiro criar 2 tabelas, pois se um dia você precisar realizar uma carga do conteúdo do arquivo dos Correios, não terá dificuldades.
A normalização tem como principal objetivo, evitar a duplicidade de informações.
HB

Olá Marcelo.
Agradeço pela sua postagem.

Marcelo, na verdade o cadastro de estado foi só um exemplo para tentar deixar mais evidente uma possível necessidade de uma chave primária alfanumérica. Mais como já mencionei, estou começando agora com a ferramenta e o que eu gostaria de saber é se toda chave primária que o FRAMEWORK gera ela SEMPRE vai ser INTEGER, ou se existe uma forma de gerar uma chave num tipo VARCHAR. Você sabe me dizer se é possível isso no FRAMEWORK?

Caso não seja possível, voltando o exemplo do cadastro de ESTADO (sem pensarmos na estrutura dos Correios), eu tendo realmente os campos ID, UF, e NOME, de que forma eu faria para que um sigla (UF = SP, por exemplo) não fosse cadastrado pelo meu usuário mais de uma vez (considerando que para cada registro salvo haverá um ID distinto)?

Grato,
José Humberto Júnior
WP

O Adianti apenas permite PK Numerica
WP

pode usar um chave UK (UNIQUE Key) no campo UF
HB

Olá Willian,
Confesso que nem pensei nesta chave porque tinha interesse em saber se o Adianti permitia ou não a PK alfa.

Já até fiz o teste e deu certo como você sugeriu, contudo, o diálogo do Adianti que retorna a mensagem de erro, mostra a caixa e o conteúdo desta forma:

Error SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'GO' for key 'EST01UF_UN'

Essa mensagem não é adequada para o usuário, assim, tem como fazer o tratamento dela e "forçar" o framework a dar uma mensagem do tipo "UF GO já cadastrada"

É possível?
Grato
WP

Não, esse erro vem do banco por tanto si quer um erro mais elocuente para o usuario final , pode analisar o erro e tratado (na unha mesmo), ou pode fazer antes de fazer o STORE, uma consulta perguntando se já tem esse valor no banco/coluna
HB

Olá pessoal.
Estou voltando neste assunto aqui deste post porque encontrei uma solução que está me atendendo depois de ter lidos outras postagens aqui do fórum. Não sei se é a melhor prática, mais me atendeu e por ora vou utilizar.

Depois de definir o campo UF como chave UK (UNIQUE Key), fiz um tratamento condicional dentro catch para o erro abaixo:
Error SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'GO' for key 'EST01UF_UN'

E ai o meu onSave() ficou da forma abaixo me retornando o error tratado. Como eu disse, vai me atender, mais ainda não sei se é a melhor prática. Como estou iniciando no framework agora, vou deixar assim e mais a frente com mais conhecimento e encontrando forma melhor eu mudo.

  1. <?php
  2. /**
  3.      * Save form data
  4.      * @param $param Request
  5.      */
  6.     public function onSave$param )
  7.     {
  8.         try
  9.         {
  10.             TTransaction::open('sistema'); // open a transaction
  11.             
  12.             /**
  13.             // Enable Debug logger for SQL operations inside the transaction
  14.             TTransaction::setLogger(new TLoggerSTD); // standard output
  15.             TTransaction::setLogger(new TLoggerTXT('log.txt')); // file
  16.             **/
  17.             
  18.             $this->form->validate(); // validate form data
  19.             
  20.             $object = new estado;  // create an empty object
  21.             $data $this->form->getData(); // get form data as array
  22.             $object->fromArray( (array) $data); // load the object with data
  23.             $object->store(); // save the object
  24.             
  25.             // get the generated id
  26.             $data->id $object->id;
  27.             
  28.             $this->form->setData($data); // fill form data
  29.             TTransaction::close(); // close the transaction
  30.             
  31.             new TMessage('info'TAdiantiCoreTranslator::translate('Record saved'));
  32.         }
  33.         catch (Exception $e// in case of exception
  34.         {
  35.             if($e->getCode() == 23000){ 
  36.                 new TMessage('error''<b>Menssagem: Estado já cadastrado</b>'); 
  37.                 $this->form->setData$this->form->getData() );
  38.            }else{ 
  39.                 new TMessage('error''Erro: ' .$e->getCode(). '-' $e->getMessage());
  40.                 $this->form->setData$this->form->getData() );
  41.            }
  42.             TTransaction::rollback();
  43.         }
  44.     }
  45. ?>