 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Nov 22, 2009 3:04 am Assunto: Comparar campos da tabela firebird? *** Resolvido *** |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Nov 22, 2009 10:33 am Assunto: |
|
|
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Dom Nov 22, 2009 5:17 pm Assunto: |
|
|
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...
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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
afarias Aprendiz


Registrado: Domingo, 25 de Outubro de 2009 Mensagens: 197 Localização: Recife, PE
|
|
| Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Seg Nov 23, 2009 10:52 pm Assunto: |
|
|
| 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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Nov 24, 2009 12:17 am Assunto: |
|
|
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...  _________________ 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 |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|