Marretar Interbase com SQL Ansi

15 respostas
Dayvson_Clauber

Caros amigos , to com um pequeno probleminha num bd interbase.
Eh o seguinte, tenho um bd em interbase q tem a seguinte estrutura:

id creditos historico

Onde ha varios registros em duplicidades, por erro de operacao de algum “bom” usuario…Sabem como eh…
Bem, estou tentando imaginar uma query no sql ANSI, onde eu possa eliminar todos os registros em duplicidades,
mas vejam bem…nao eh eliminar todos os registros, e apenas o clone deles.
Pois tamos com a seguinte situacao (exemplo):

id creditos historico
001 200 Bonus Jul/03
001 200 Bonus Jul/03
002 100 Bonus Jun/03
002 100 Bonus Jun/03
002 200 Bonus Jul/03
002 200 Bonus Jul/03
003 300 Bonus Jun/03
003 300 Bonus Out/02
003 300 Bonus Out/02

Ou seja, ha variacao de meses divergentes pessoal… Isso que ta complicando mais a situacao, eu gostaria que
vcs pudessem me ajudar (Principalmente os feras de SQL daki do GUJ) onde eu viabilize uma maneira de retirar
os “clones”.

Espero que possam me ajudar, pois no lugar onde to, n tem recurso de nada galera… to aki em plena Luanda-Angola… pense numa ilha para nos que n vivemos sem net, livros e etc… aff…
To contando com a colaboracao e compreensao de vcs…
1 gde abraco e te +

Dayvson Clauber!

15 Respostas

Daniel_Quirino_Olive

Primeiro: crie uma tabela decente, em que tenha uma chave-primária. Assim você evita duplicidade de dados.
Em segundo, sobre o SQL para remover os dados tente isso (não testei):

delete from <tabela> where id not in (select distinct(id) from <tabela>)

onde <tabela> é, naturalmente, o nome da sua tabela.

Dayvson_Clauber

Hoje parece q eh meu dia de sorte… vejam so agora o q ta acontecendo comigo qdo tento atraves do SQL Explorer acessar o maldito banco

Unknown database.
internal gds software consistency check(cannot find tip page(165))
Alias : NEWCONS

Alguem q trabalhe ai com delphi/interbase pode me esclarecer o pq disso??
:oops:

edurezende

Dentro do diretorio do interbase na pasta /bin tem o gbfix, ele vai tentar reparar teu banco.
Uma dica, se vc estiver usando o intebase 6.x entre no site da ibphoenix.com e baixe o firebird, já corrigiram muitos problemas encontrados no interbase 6.x.

urubatan

acho que não é este o problema, parece que o banco foi feito em interbase 6/firebird e tu ta tentando abrir ele com o SQL Explorer/cliente da borland do interbase 5, ai o troço não funciona de geito nenhum :slight_smile:
tenta baixar o IBO Console que é certeza que funciona :slight_smile:

Dayvson_Clauber

Oh urubatan meu caro… vc pode me passar o link de onde eu posso baixar esse tal d IBO Console… e ele funciona da mesma forma que o SQL Explorer??
Outra coisa, eu to com tudo instalado da Versao 6 do delphi aki,… agora a makina onde esse bd foi feito eh q tudo eh versao 5 do delphi…isso tbm pode influenciar??

Dayvson_Clauber

Outra coisa, tem nem como eu pensar em download aqui… pois to numa empresa que usa conexao dial up… to aki em luanda, angola bicho… ai ja viu… imagina fazerf downloaddesas paadas…
Vamos ver como vai ser essa bronca…sem contar q a pressao ta demais em cima do setor nosso aki na informatica…

urubatan

o IBO Console pode baixar de
http://www.mengoni.it/downloads.html
são uns 3 mega mais ou menos

outra coisa, se não me engano o IB 6 não abre direto o banco do IB5 também, tem que fazer um backup no IB5 e restaurar no IB 6 (o arquivo de backup ele abre sem problema nenhum :slight_smile:

anjomal

Uma otima ferramenta com varias features, sourceforge.net/projects/gmarathon, deve resolver seus problemas !!!

falow !!!

rfpsatin

Deixa ver se entendi…

vc tem

campo1, campo2, campo3
1 2 122
1 2 122

e vc quer eliminar uma das 2 linhas de modo que fique apenas

campo1, campo2, campo3
1 2 122

???

bem, se for isso, a forma q o coloca fez o sql acho q não funciona

[list]
delete from <tabela> where id not in (select distinct(id) from <tabela>)[/list]

pois sempre ira haver e por isso não elimina.

Eu não sei resolver isto no Interbase.

se alguém souber, fale ae…

tive um problema deste num teste de inserção com 800 000 registros e mesmo tendo PK ele deixou repetir. Bem, no oracle há uma forma fácil de resolver isto.

o oracle permite vc criar uma tabela com base noutra.

assim, é só vc fazer

create table <novatabela> as
select * from <tabelaantiga>
having count(id)=0

por exemplo.

contudo o interbase não aceita este tipo de sintaxi.

Se alguém souber como criar uma tabela apartir de outra…
resolve fácil o problema.

Dayvson_Clauber

Ae pessoal ainda to com esse problema, Aproveitando toda essa confusao… eu gostaria de saber se alguem aqui pode me indicar uma ferramenta onde eu possa extrair algum .txt da vida de um .gdb
Estou precisando disso de forma urgentissima…

Dayvson_Clauber

Ae pessoal ainda to com esse problema, Aproveitando toda essa confusao… eu gostaria de saber se alguem aqui pode me indicar uma ferramenta onde eu possa extrair algum .txt da vida de um .gdb
Estou precisando disso de forma urgentissima…
E eu nao sabia que era tao ruim de migrar as coisas do delphi 5 pro 6…viji…

rfpsatin

da uma olhada em
www.clubedelphi.com.br
www.firebase.com.br

rfpsatin

Voltando ao delete, até onde sei o interbase não tem nenhuma clausula q vc possa usar. O oracle tem o rowid q permite isso agora o IB nao tem , q eu saiba.

agora, vc pode usar uma stored procedure p/ fazer isso.

faz nela um select, joga os dados em variaveis, abaixo vc mata os repetidos q vc armazenou acima e depois vc grava eles, 1 só x.

tudo numa storedprocedure só

W

como o rfpsatin falou
no seu gdb cria uma nova tabela

ai vc faz assim

insert into Tabela2 select Distinct(Campo1),campo2,campo3 from tabela1.

Espero que ajude.

Dayvson_Clauber

Pessoal agradeço bastante a colaboração de todos. Porem , realmente eh 1 pepino que ta rolando aqui na empresa, mas ja foi decidido que iremos montar 1 novo sistema, para poder cortar o vinculo umbilical com o dono do projeto…
E nossa ultima preocupacao estava sendo entao exportar esse gdb para 1 txt, sendo assim , utilizando a força do Anjo tbm q citou o marathon, o baixei e o mesmo ja me falou como proceder, onde entao vou criar 1 arquivo de script pra poder tentar importar de algum local e sendo assim, gerar 1 txt depois… ou entao, como ja fiz tbm… vou baixar 1 driver odbc do interbase, fazer com q o access o leia… e entao enxergue os dados e assim, importe todos os registros… Se alguem tiver uma ideia melhor, é so falar, estou aceitando sugestoes…
Quem quiser dar 1 olhadinha no BD , fala q eu vejo se dar pra mandar ele zipado…
Mas fico muito feliz que muitos tenham se esforçado para me ajudar…
GUJ rulez!!!

Criado 24 de outubro de 2003
Ultima resposta 25 de out. de 2003
Respostas 15
Participantes 7