ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Comparar campos da tabela firebird? *** Resolvido ***

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Nov 22, 2009 3:04 am    Assunto: Comparar campos da tabela firebird? *** Resolvido *** Responder com Citação

Como faço para comparar se tem campos novo na tabela?

Por exemplo, tenho uma tabela criada assim (esta no aplicativo):
Código:
close;
        sql.clear;
        sql.add (' create table teste('                );
        sql.add ('    idassoc      integer default 0, ');
        sql.add ('    matricula    integer default 0, ');
        sql.add ('    nome  varchar(50))              ');
        execsql;


E se eu incluir um novo campo nesta tabela
Código:
close;
        sql.clear;
        sql.add (' create table teste('                );
        sql.add ('    idassoc      integer default 0, ');
        sql.add ('    matricula    integer default 0, ');
        sql.add ('    nome  varchar(50)               ');
        sql.add ('    endereco  varchar(50))         ');
        execsql;


Quero comparar a nova tabela com a tabela que esta em uso, se tiver diferente incluir este novo campo na tabela, mais sem dar um DROP na tabela para criar uma novacom o novo campo, pois desta forma apagará todos os dados da tabela.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree


Editado pela última vez por adriano_servitec em Qua Nov 25, 2009 1:39 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Nov 22, 2009 10:33 am    Assunto: Responder com Citação

Então, a idéia é comparar a tabela já criada com os campos novos que por ventura venha a ter.

Sintaxe de incusão novos campos na table
Código:
close;
      sql.clear;
      sql.add (' alter table associados                              ');
      sql.add (' add endereco   varchar(50) character set WIN1252 ');
      sql.add ('                              collate WIN_PTBR       ');
      execsql;


Mais queria algo meio automático, se é que tem como fazer, ou seja, comparar a tabela anterior com os campos novos que eu colocar isso tudo em tempo de projeto e alguma procedure gerar o script dos campos novos conforme a sintaxe acima, isso sem eu precisar ficar esta checagem manualmente.

Algo como comparar os campos de dentro da tabela
Código:
 close;
     sql.clear;
     sql.add (' select rdb$field_name from rdb$relation_fields ');
     sql.add (' where rdb$relation_name = ''ASSOCIADOS''       ');
     sql.add (' order by  rdb$field_position                   ');
     open;
Com os novos campos, e aplicar a alteração, caso necessite.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Dom Nov 22, 2009 5:17 pm    Assunto: Responder com Citação

Pessoal, o que eu quero é algo + ou - assim:

Código:
if seExiste = 0 then
      begin
        // Tabela Associados
        close;
        sql.clear;
        sql.add (' create table associados('                         );
        sql.add ('    idassoc           integer default 0,          ');
        sql.add ('    matricula         integer default 0,          ');
        sql.add ('    nome        varchar(50) character set WIN1252 ');
        sql.add ('                            collate WIN_PTBR,     ');
        sql.add ('    endereco    varchar(50) character set WIN1252 ');
        sql.add ('                            collate WIN_PTBR,     ');
        sql.add ('    bairro      varchar(50) character set WIN1252 ');
        sql.add ('                            collate WIN_PTBR,     ');
        sql.add ('    complemento varchar(50) character set WIN1252 ');
        sql.add ('                            collate WIN_PTBR,     ');
        sql.add ('    numero      varchar(10),                      ');
        sql.add ('    cpf         varchar(14),                      ');
        sql.add ('    rg          varchar(20),                     )');
        execsql;     
      end else
      if seExiste > 0 then
      begin
        // Altera os campos criados
        // TABELA ASSOCIADOS  //Incluir aqui somente campos novos
        sql.clear;
        sql.add (' alter table associados                   ');
        sql.add (' add TE    varchar(14)                   ');
        execsql;
     end;

Mais algo mais automatico. Só que tudo em tempo de projeto. Nada de uso de ferramentes que não seja nativas do Delphi.

Posso até criar uma rotina para alterar a base de dados, mais de qualquer forma eu sempre terie que esta atualizando esta rotina toda vez que haver mudanças na versão do projeto, além do que neste caso preciso que o cliente rode esta rotina ao baixar a nova versão.

Vamos lá pessoal, preciso de idéias...Very Happy

Obs: A forma acima fiz apenas para exemplo, pois num projeto não é viavel utilizar desta forma, pois não ha controle ai da mudança de versão.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Nov 23, 2009 9:52 pm    Assunto: Responder com Citação

up
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
afarias
Aprendiz
Aprendiz


Registrado: Domingo, 25 de Outubro de 2009
Mensagens: 197
Localização: Recife, PE

MensagemEnviada: Seg Nov 23, 2009 10:02 pm    Assunto: Responder com Citação

vc pode verificar as tabelas de sistema para isso:

RDB$RELATIONS
RDB$RELATION_FIELDS

etc.

Ex, para saber todos os campos de uma tabela:

select rdb$field_name
from RDB$RELATION_FIELDS
where rdb$relation_name='NOME_DA_TABELA';


T+
_________________
Acompanhe: SUPORTE, A SÉRIE:
http://andre.openintelligence.com.br/

Orkut: http://www.orkut.com.br/Main#Community?rl=cpn&cmm=96459906
Twitter: http://twitter.com/Andre_Suporte
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Nov 23, 2009 10:52 pm    Assunto: Responder com Citação

afarias escreveu:
vc pode verificar as tabelas de sistema para isso:

RDB$RELATIONS
RDB$RELATION_FIELDS

etc.

Ex, para saber todos os campos de uma tabela:

select rdb$field_name
from RDB$RELATION_FIELDS
where rdb$relation_name='NOME_DA_TABELA';


T+
Olá Anderson Farias, blz....

Pois é, verificando aqui acho ser impossivel de fazer algo assim, ou seja por exemplo se eu criar um novo campo na unit como é que vou comparar este novo campo na tabela sendo que ainda não commitei?

Realmente acho que o que eu quero não tem jeito...
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Nov 24, 2009 12:17 am    Assunto: Responder com Citação

Estou pensando em algo + ou - assim

Código:
with pQuery do
    begin
      close;
      sql.clear;
      sql.add (' select versaoDB from versoes where versaoDB = ''1.3'' ');
      open;
      if isempty then //se não tem na tabela então cria
      begin
        try
          close;
          sql.clear;
          sql.add (' insert into versoes (versaoDB) values (''1.3'')');
          execsql;

          // altera campo da tabela
          close;
          sql.clear;
          sql.add (' alter table associados                          ');
          sql.add (' add profissão varchar(50) character set WIN1252 ');
          sql.add ('                              collate WIN_PTBR   ');
          execsql;
          pcon.Commit; // referente ao ZConnetcion
        except
          on E: Exception do
          begin
            pt_messagedlg ('Ocorreu um erro ao executar este processo. ' +#13#13 +'Erro gerado: '+#13+
                   E.Message + #13#13 + 'Todo o processo foi abortado!', mtError, [mbOk],0);

            pcon.Rollback;  //referente ao ZConnetcion
            Abort;
          end;
        end;
      end;
    end;
Ou seja comparar a versão com a versão do banco, e se tiver diferente aplica um ALTER TABLE.

Mais deu erro, acho que foi de sintaxe no ALTER TABLE... Rolling Eyes
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Nov 25, 2009 1:38 pm    Assunto: Responder com Citação

Resolvido... Tudo vai ser controlado pela tabela versoes.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB