Ir para o conteúdo

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

CRUD - Erro na inclusão e exclusão

27 de Junho de 2012, 13:33 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 26 vezes

Segui o exemplo de CRUD disponível no site para criar um cadastro de países.

Esta funcionando corretamente na alteração quando clico no ícone alterar de algum país na aba listagem, os dados aparecem na aba Cadastro, faço a alteração, clico em salvar e os dados são gravados corretamente na tabela.

Porém, quando clico em limpar, digito o código e nome do país e clico em salvar os dados não são gravados na tabela. Quando clico no botão excluir de algum país na aba listagem ele também não é excluido.

Segue o código abaixo:

// paises.php
<?php
$frm = new TForm('Paises');
//$frm->addHiddenField('id');
$pc = $frm->addPageControl('pc');
$pc->addPage('Cadastro',true,true,'abaCadastro');
$frm->addTextField('co_pais','Código:',5,true);
$frm->addTextField('no_pais','Nome:',30,true);
$frm->addButton('Salvar','salvar','btnSalvar',null,null,true,false);
$frm->addButton('Limpar','limpar','btnLimpar',null,null,false,false);
$pc->addPage('Listagem');
$frm->addHtmlField('html_gride','Aqui será carregado o gride');
$frm->processAction();
$g = new TGrid('gd','Listagem dos Países',Tb_paisDAO::selectAll('no_pais'),null,null,'co_pais');
$frm->set('html_gride',$g); // ou também, $frm->getField('gride')->add($g);
$frm->show();
?>

// salvar.php
<?php
$vo = new Tb_paisVO();
$frm->setVo($vo);
if( Tb_paisDAO::insert($vo) )
{
   $frm->setMessage('País salvo com SUCESSO!');
   include('limpar.php');
}
else
{
   $frm->addError(Tb_paisDAO::getError());
}
?>

// gd_excluir.php
<?php
Tb_paisDAO::delete($frm->get('co_pais'));
?>

Autor: Leandro Santos


1010 comentários

  • 51b06d6eae66e2cfdfc361d418eea715?only path=false&size=50&d=404Luis Eugênio barbosa(usuário não autenticado)
    27 de Junho de 2012, 18:26

     

    Landro,

    pelo que pude perceber, sua tabela de Pais possui como chave primaria a coluna co_pais e que não deve ser um campo autoincremento, pois você está informando ele no formulário manualmente.

    Neste caso voce tem que ajustar o metodo insert do arquivo Tb_paisDAO que deve estar faltando o campo co_pais no comando insert into tb_pais ( ....) values (....). Adicione tambem no array de parametros antes do comando insert.

    Abraço.

     

     

     

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

       

      Luis,

      Muito obrigado pelo sempre pronto atendimento.

      Você está certo, a chave da tabela é co_pais e ela estava faltando no método insert, mas fiz a alteração do método e o erro persiste. A alteração funciona corretamente mas não consigo incluir nem excluir.

      Veja o código abaixo:

           public function insert( Tb_paisVO $objVo )
          {
              if( $objVo->getCo_pais() )
              {
                  return self::update($objVo);
              }
              $values = array(  $objVo->getCo_pais()
                          ,$objVo->getNo_pais()
                          );
              return self::executeSql('insert into tb_pais(
                                   co_pais
                                  ,no_pais
                                  ) values (?,?)', $values );
          }
          //--------------------------------------------------------------------------------
          public function delete( $id )
          {
              $values = array($id);
              return self::executeSql('delete from tb_pais where co_pais = ?',$values);
          }

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

         

        Luis,

        Fiz um novo teste e a exclusão está funcionando, só não consigo incluir mesmo.

        Tem idéia do que pode ser?

        • 5ff2213e17aa70dce114d0b399086fd3?only path=false&size=50&d=404Giovane Spengler(usuário não autenticado)
          28 de Junho de 2012, 14:47

           

          Leandro,

           Para evitar esse tipo de situação eu utilizo  a ferramenta Gerado de VO/DAO do proprio FormDin, ele gera esses 2 arquivos de acordo com a estrutura que você informar, reduz um punhado dos "cabelos brancos".....

          O endereço é "../base/includes/gerador_vo_dao.php", eu coloquei ele no menu do meu projeto e sempre que tenha alteração na minha tabela, só jogo nele e ele gera com base nas colunas...

          • 4210951d8ebd1c937e4efe1938358d3f?only path=false&size=50&d=404Leandro Santos(usuário não autenticado)
            28 de Junho de 2012, 14:54

             

            Eu também utilizei esta ferramenta, só que a coluna chave da minha tabela não é autoincrement, então inseri um campo na tela para que o usuário informe seu valor e tive que ajustar o método insert para gravar o valor nesta coluna, quase tudo funciona, menos a inclusão. Em um post anterior eu colei o código do método insert, aparentemente está correto.

            • 5ff2213e17aa70dce114d0b399086fd3?only path=false&size=50&d=404Giovane Spengler(usuário não autenticado)
              28 de Junho de 2012, 15:02

               

              Nesse tipo de caso eu constumo usar um "campo de controle" somente para controle mesmo.

              No seu exemplo eu faria assim: "codigo, co_pais, no_pais"

              Nesse o campo "codigo" usaria como o campo chave, primary key e caso fosse necessario usaria um "unique" no campo co_pais,

              • 4210951d8ebd1c937e4efe1938358d3f?only path=false&size=50&d=404Leandro Santos(usuário não autenticado)
                28 de Junho de 2012, 15:41

                 

                Sim, mas ele tinha que gravar o campo co_pais que o usuário digitou, estou achando muito estranho só funcionar se o campo chave da tabela for autoincrement.

                • 5ff2213e17aa70dce114d0b399086fd3?only path=false&size=50&d=404Giovane Spengler(usuário não autenticado)
                  28 de Junho de 2012, 17:48

                   

                  Leandro,

                   Fiz uns testes e verifiquei o seguinte:

                       public function insert( Tb_paisVO $objVo )
                      {
                          if( $objVo->getCo_pais() )
                          {
                              return self::update($objVo);
                          }
                          $values = array(  $objVo->getCo_pais()
                                      ,$objVo->getNo_pais()
                                      );
                          return self::executeSql('insert into tb_pais(
                                               co_pais
                                              ,no_pais
                                              ) values (?,?)', $values );
                      }

                   Esse é o seu codigo.

                   A situação ocorre por causa da validação que é feita para saber se é um "insert" ou "update",

                          if( $objVo->getCo_pais() )
                          {
                              return self::update($objVo);
                          }

                  Ele verifica se existe o dado no campo "co_pais" e se tiver ele vai para o update e ignora o lance do insert.

                  Ai cabe a você escolher o que é interessante, alterar o codigo para que tudo que vier usar o "insert" ou manter o formato e alterar o metodo.

                  • 4210951d8ebd1c937e4efe1938358d3f?only path=false&size=50&d=404Leandro Santos(usuário não autenticado)
                    28 de Junho de 2012, 21:01

                     

                    Você está certo Giovane,
                    Como informo o novo código na tela o método tenta fazer o update e com isso não faz nada. Tenho que fazer uma validação neste ponto para saber se trata-se de uma inclusão ou alteração.
                    Obrigado.

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

                       

                      Resolvi a gravação na inclusão da seguinte forma:

                          public function insert( Tb_paisVO $objVo )
                          {
                              //if( $objVo->getCo_pais() )
                              $values = self::select($objVo->getCo_pais());
                              if( $values )
                              {
                                  return self::update($objVo);
                              }
                              $values = array(  $objVo->getCo_pais()
                                              , $objVo->getNo_pais()
                                              );
                              return self::executeSql('insert into tb_pais(
                                                       co_pais
                                                      ,no_pais
                                                      ) values (?,?)', $values );
                          }

                       Mas isto gerou um outro probleminha, por exemplo, caso o usuário ao tentar incluir um novo país informe um código já existente na tabela e uma descrição qualquer ao clicar em salvar o país que está cadastrado na tabela será alterado pelo que o usuário informou.

                      Alguém tem uma sugestão para melhorar isto?

Essa comunidade não possui posts nesse blog