Ir para o conteúdo

 Voltar a Fórum do For...
Tela cheia

Dúvida VO/DAO com tabela estendida

3 de Setembro de 2012, 13:34 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 11 vezes

Pessoal,

Estou implementando o cadastro de clientes e funcionários e as tabelas estão modeladas da forma abaixo, mas estou com dúvida em como ficaria os objetos VO/DAO e como tratar a tabela estendida em um form do formdin pois para inserir um cliente é necessário inserir os dados específicos em clientes e pessoas, alguém pode me ajudar?

Obrigado.

1) Tabela pessoas: Essa tabela serve para armazenar os dados das pessoas cadastradas no sistema, tanto os clientes como funcionários.

2) Tabela clientes: Está tabela estende a tabela de pessoas para armazenar apenas as pessoas que são clientes.

3)Tabela funcionarios: Está tabela estende a tabela de pessoas para armazenar apenas as pessoas que são funcionários.

4) Tabela enderecos: Esta tabela se relaciona com as tabelas pessoas, pessoa_endereco. Nela é armazenado os endereços dos clientes, funcionários e dos fornecedores de peças que estão cadastrados no sistema.

5) Tabela pessoa_endereco: Está tabela tem a função apenas de ligar as tabelas pessoas e endereços.

Autor: Leandro Santos


33 comentários

  • 51b06d6eae66e2cfdfc361d418eea715?only path=false&size=50&d=404Luis Eugênio barbosa(usuário não autenticado)
    5 de Setembro de 2012, 0:38

     

    Leandro,

    não sei se está é a melhor solução, mas dá para fazer assim: como para gravar um cliente voce terá que manter duas tabelas, a de pessoa e a de cliente, eu criaria um dao e um vo chamado ClienteDAO e o VO chamado CienteVO com todos os campos da tabela pessoa e cliente como se fosse uma só, e em suas funções de insert e update eu faria o gerenciamento da inclusão ou update nas duas tabelas, se for uma inclusão, primeiro insere na tabela pessoa, recupera o ultimo id gerado, seta o id do VO e depois insere na tebela cliente os restante dos dados e para update a deveria ser feito nas duas tabelas.

    Outra forma seria criar os daos e vos das tabelas separados, PessoaDAO, PessoaVO e extender para cliente: ClienteDAO extends PessoaDAO e nos metodos primeiro chamariamos, por exemplo no insert, parent::insert(PessoaVO)  e depois fariamos o insert na tabela cliente, neste caso voce tambem terá que customizar um pouco para fazer funcionar, pois o cadastro do cliente depende do id gerado da pessoa.

    Abraço..

    • 4210951d8ebd1c937e4efe1938358d3f?only path=false&size=50&d=404Leandro Santos(usuário não autenticado)
      5 de Setembro de 2012, 13:39

       

      Luis,

      Se eu adotar a sua primeira sugestão, para recuperar o último id gerado eu teria que dar um select max(id) na tabela, se sim, caso vários usuários estejam inserindo clientes ao mesmo tempo não poderia dar problema? ou você sabe uma forma mais garantida de obter este id?

      Obrigado.

      • 51b06d6eae66e2cfdfc361d418eea715?only path=false&size=50&d=404Luis Eugênio barbosa(usuário não autenticado)
        5 de Setembro de 2012, 16:40

         

        Leandro,

        com certeza, utilizar o max(id) não é a maneira correta, dependendo do banco de dados que voce estiver utilizando, existem formas de recuperar o id gerado pela sua transação.

        No mysql utilize o metodo lastInsertId da classe DAO

        Exemplo:

                if( self::executeSql('insert into tb_veiculo(
                                         placa
                                        ,nome
                                        ,marca
                                        ,modelo
                                        ,ano
                                        ,cor
                                        ,valor
                                        ,aquisicao
                                        ,observacao
                                        ) values (?,?,?,?,?,?,?,?,?)', $values ))
                                        {
                                            return self::getInstance()->lastInsertId();
                                        };
        se for no postgres faça assim:

                if( $resultado = self::executeSql('insert into tb_veiculo(
                                         placa
                                        ,nome
                                        ,marca
                                        ,modelo
                                        ,ano
                                        ,cor
                                        ,valor
                                        ,aquisicao
                                        ,observacao
                                        ) values (?,?,?,?,?,?,?,?,?) returning id_veiculo', $values ))
                                        {
                                            return $resultado['ID_VEICULO'][0];
                                        };
                                       
             Abraço.

         

Essa comunidade não possui posts nesse blog