Array
(
)

Qual a melhor forma de copiar DBF para Interbase

Geisonc
   - 19 dez 2005

Usando:
#Código

While tb1.eof = false then
Begin
*Interbase:=DBF
End;


Ou tem outra forma, acho muito devagar desse jeito, tenho uns 200 000 registros para copiar, mas gostaria que meu programa que copiasse, sem usar softwares de terceiros.

Alguem sabe ?


Eixox
   - 19 dez 2005

Você pode executar esse procedimento usando uma das ferramentas disponíveis desde a versão 3 do Delphi, o famoso, inigualável: DATAPUMP

Ele cria a mesma estrutura que você quer do banco de origem para o banco de destino. Ele cria a tabela e você pode fazer todas as demais implementaçòes normalmente.

Não perca tempo fazendo isso!!!

Imagine ter que fazer isso num sistema com 60 tabelas?


Aerreira
   - 19 dez 2005

Eu já tenho uma visão um pouco diferente dessas de vocês.

Normalmente um sistema DOS (dbf) é defasado em relação a uma atualização para windows (firebird), e existem detalhes como chaves primarias e estrangeiras, tipos de dados, domínios, nomes de campos, nomes de tabelas, índices, tudo um pouco diferente em função de melhorias conceituais e estruturais entre os sistemas.

Com isso prefiro fazer um programa na linguagem do sistema que usa as tabelas DBF para gerar scritps SQL para fazer as conversões. Depois executo os scripts via Ibexpert e avalio os resultados. Havendo algum problema, altero o programa que gera o script e rodo novamente até obter o resultado esperado. Tabela por tabela... E olha que estou fazendo isso para sistemas com mais de 80 tabelas com muitas chaves estrangeiras, generators, dominios, índices, UDFs de terceiros... Por via das dúvidas tenho scripts separados para criação de todo o banco, outro para popular o banco com dados para teste, outros (um para cada tabela) para fazer a carga das tabelas originais...

Parece tudo muito manual, mas é como tenho obtido bons resultados.


Eixox
   - 20 dez 2005

Eu sei que o que seria ´correto´ e aliás, o mais recomendado é justamente fazer o que você falou.

O correto é:

Analisar diante dos requisitos do cliente e do sistema prevendo suas expansões.

Quando falamos de dois modelos de sistemas de bancos de dados, aqui falamos de DBF e GBD. Duas estruturas totalmente diferentes, com funções de armazenamento diferentes e procedimentos de armazenamento diferentes. Um com locks por concorrência e outro com opção de escolha. Quando falamos de DBF e GDB falamos de duas eras totalmente diferentes, porém o DBF ainda é muito marcante. Tenho clientes usando o DBF até hoje e não me atrevo a colocar os dedos nem perto do teclado, porque funcionam muito bem.

Porém quando falamos de bancos de dados atuais, desenvolvimento atual (usando todo o tipo de ferramenta uml disponível) não deixamos de falar em linhas e colunas, índices, integridade referencial, triggers, UDF, procedures e etc, não excluímos qualquer outro banco de dados porque também se baseiam nas mesmas teorias. Quando temos uma chave corrompida em GDB temos também chaves corrompidas em DBF;
Quando temos um problema de ponteiro no GDB também temos no DBF e quando temos fragmentação na tabela GDB também temos em DBF.

Mas, a pergunta de nosso amigo ficou evidente no desejo de transportar seus dados para um outra tabela, somente isso. Tanto que recomendei que ele fizesse todo o processo de recomposição estrutural usando SQL pos-transporte de dados.

Assim sendo, você está totalmente correto! Mas a pergunta estava somente centrada na forma de transportar os dados de uma tabela para outra.

Desculpe-me pela colocação, e espero que você não tenha ficado chateado com essa minha colocação.

[/i]


Aerreira
   - 20 dez 2005


Citação:
Desculpe-me pela colocação, e espero que você não tenha ficado chateado com essa minha colocação.

De maneira nenhuma, Eixox, você complementou com muita propriedade o que falei. Apenas achei conveniente passar ao colega Geisonc uma visão mais ampla do que seria mais recomendável, visto que ele poderia não estar tento essa visão, pensando apenas em converter os dados entre DBF e GDB. Não preciso falar mais nada... Você já abordou o tema de forma bastante clara.

Um abraço aos dois...


Geisonc
   - 20 dez 2005

Show de explicação dos dois !!

A explicaçâo do aerreira será de grande valia futuramente quando tiver um cliente com trocentas tabelas DBF, que precise de um sistema mais atual, porem, quero somente, e somente neste caso, transportar os dados da tabela dbf para o gdb, sendo que nas tabelas dbf que eu tenho, há chaves primarias indices..etc.. que estão na verdade atrapalhando minha migração mas... tudo bem...

eu estou usando o Interbase DataPump, Clever Components. A copia dos dados é muito rápida, porem, é um software de terceiros, como eu vou precisar atualizar essas tabelas umas 2 vezes por dia, minha curiosidade era saber se tem uma forma rápida porem propria do meu programa, de copiar os dados !


// Para entender melhor. O sistema que a minha empresa usa é em DOS e nao é eu quem fiz, entao nao quero nem tocar nas tabelas originais. Como sao bastante dados, fiz um banco em GDB, onde copio todos os dados da DBF para poder fazer o programa de cobrança que eu estou montando. o programa está praticamente pronto, só falta definir a maneira de copiar os dados, seja por terceiros seja pelo proprio programa !

Vou tentar pelo DataPump ! Funcionar alguns dias , ver se tudo funciona ok !!


Obrigado !


Aerreira
   - 20 dez 2005


Citação:
(...) como eu vou precisar atualizar essas tabelas umas 2 vezes por dia, minha curiosidade era saber se tem uma forma rápida porem propria do meu programa, de copiar os dados ! (...)


Então, pelo que entendi, o DBF continua sendo alimentado pelo sistema DOS diariamente, não é uma substituição de sistema, mas uma carga diária de dados provenientes dessa tabela DBF. Então o melhor mesmo é criar rotinas dentro da sua aplicação, visando dar mais automação, pois com um programa tipo CleverComponents o processo não seria muito direto para o usuário.

O ideal mesmo é gerar uma rotina que faça essa carga dentro do seu programa, mais ou menos como citou no seu primeiro post neste tópico. Acho o melhor caminho.


Geisonc
   - 20 dez 2005

Isso, o banco DBF continuará com o DOS, porem fiz um sistema a parte que copia as tabelas e copia os dados para GDB, o que eu nao gostei muito é da demora que é copiado os dados ! porem, fica mais simples para o usuario final.. !



:wink:


Eixox
   - 21 dez 2005

Acredito que a melhor situação em termos de conforto seria você executar o seguinte procedimento:

- 1 - Crie a tabela com a estrutura através do DataPump e reescreva todos os índices e etc, até deixá-la dentro das características desejadas.

- 2 - Crie um procedimento no seu sistema que execute a importação automática. Use até mesmo o recurso de Tarefas Agendadas do Windows - se for o seu sistema é claro.

- 3 - Crie um procedimento onde, ao invés de recriar toda a tabela, ele faça uma verificação da existência dos dados na tabela. Se o registro não estiver na tabela destino então insere senão toca pra frente.

Tipo isso:

Enquanto não for fim da Tabela faça
inicio
Se Tabela_Destino_GDB.FindKey([Tab_Ori_Campo.value]) = falso
then
begin
insere o dados na tabela;
Inc(Z);
end else Incrementa(X);
fim_do_enquanto

o Incrementa(X) serve para você calcular diariamente quantos registros foram mantidos na tabela e In(Z) serve para saber quantos registros foram efetivamente inseridos.

Isso provocará um desgaste menor no sistema e com certeza até mesmo para as próprias tabelas DBF e GDB. Ao mesmo tempo, você provavelmente ganhará em performance a longo prazo, já que a tendência natural de algumas tabelas é inchar durante alguns períodos do ano e em outros nem ocorrerem incrementos significativos.

Abraço -


Pro-luck
   - 01 out 2006

Caro colega,

Quero saber se vc pode dar-me algumas dicas sobre conversão. Tenho tabelas DBF que preciso converter para Paradox (sei que muitos criticam o Paradox) para dar continuidade ao sistema que estou desenvolvendo.

Procurei pelo Datapump, porém, não o encontrei. Como faço para encontrá-lo dentro do Delphi 7?

Não sei se estou perguntando alguma asneira, mas, dê-me um desconto, estou começando agora. (rs rs rs).

Certo de vossa atenção, antecipadamente agradeço.