Copiando os dados de uma tabela para outra de uma só vez

Delphi

23/06/2016

Bom dia, a ideia é copiar os dados contidos em uma tabela A para uma tabela B de uma só vez. O que ocorre é que que os dados estão sendo copiados ou tentando ser copiados um a um isso, sem falar que ele só copia o primeiro índice.

o while realiza a primeira iteração e copia na tabela B o primeiro índice mas a partir da segunda iteração do while o sistema lança uma exceção do firedac de erro na chave primaria

segue o código

try
lblStatus.Caption := 'Iniciando processo de sincronia... Aguarde....' ;
Application.ProcessMessages;

pbStatus.Position:=pbStatus.Position+1;

Sleep(0);
lblStatus.Caption := 'Sincronizando tabela Grupos...';
Application.ProcessMessages;

DtMdl.FDGruposVelho.Active := False; //BD ANTIGO QUE ENVIARÁ OS DADOS PARA O NOVO
DtMdl.FDGruposVelho.Active := True;
DtMdl.FDGruposVelho.First;
DtMdl.FDGruposNovo.Active := False;
DtMdl.FDGruposNovo.Active := True;
while not DtMdl.FDGruposVelho.Eof do
begin
DtMdl.FDGruposNovo.Insert;
DtMdl.FDGruposNovoGR_NUMERO.Value := DtMdl.FDGruposVelhoCODIGO.Value;
DtMdl.FDGruposNovoGR_GRUPO.Value := DtMdl.FDGruposVelhoNOME_GRUPO.Value;
DtMdl.FDGruposNovo.Post;
end;
except
on E : Exception do
begin
application.MessageBox(pchar('Problemas durante a migração dos dados' +#13+#13+ 'Descrição do erro: '+#13+#13+E.Message+#13+#13+'Tentativa de sincronização cancelada'), 'AVISO', mb_OK + MB_ICONERROR);
if DtMdl.FDGruposNovo.State = dsInsert then
DtMdl.FDGruposNovo.Cancel;
//abort;
end;
end;
DtMdl.FDGruposVelho.Next;

Sleep(0);
lblStatus.Caption := 'Sincronização tabela Grupos concluída.';
Application.ProcessMessages;
Emanuel Gonçalves

Emanuel Gonçalves

Curtidas 0

Respostas

Raimundo Pereira

Raimundo Pereira

23/06/2016

lblStatus.Caption := 'Iniciando processo de sincronia... Aguarde....' ;
Application.ProcessMessages;


DtMdl.FDGruposVelho.Active := False; //BD ANTIGO QUE ENVIARÁ OS DADOS PARA O NOVO
DtMdl.FDGruposVelho.Active := True;
DtMdl.FDGruposVelho.First;
DtMdl.FDGruposNovo.Active := False;
DtMdl.FDGruposNovo.Active := True;

DtMdl.FDGruposVelho.FetchAll;
pbStatus.max:=DtMdl.FDGruposVelho.recordcount;

pbStatus.Position:=0;


if not DtMdl.FDGruposVelho.Eof then
repeat
begin
DtMdl.FDGruposNovo.Insert;
DtMdl.FDGruposNovoGR_NUMERO.Value := DtMdl.FDGruposVelhoCODIGO.Value;
DtMdl.FDGruposNovoGR_GRUPO.Value := DtMdl.FDGruposVelhoNOME_GRUPO.Value;
DtMdl.FDGruposNovo.Post;

Sleep(20);
lblStatus.Caption := 'Sincronizando tabela Grupos...';
Application.ProcessMessages;

pbStatus.Position:=pbStatus.Position+1;
DtMdl.FDGruposVelho.Next;

until DtMdl.FDGruposVelho.Eof ;

Sleep(20);
lblStatus.Caption := 'Sincronização tabela Grupos concluída.';
Application.ProcessMessages;
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

23/06/2016

Obrigado P2
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

23/06/2016

Preciso de mais uma ajuda

tenho duas tabelas com os mesmos campos e preciso importar os dados de uma para outra, o detalhe ta no campo CC_CODLANC do tipo integer, nessa campo os valores são null na tabela antiga e ao importar para o campo CC_CODLANC do tipo integer da nova tabela.

tentei com esse código

if DtMdl.FDCCorrenteVelhoCC_CODLANC.IsNull then
DtMdl.FDCCorrenteNovoCC_CODLANC.Value := null
else
DtMdl.FDCCorrenteNovoCC_CODLANC.Value := DtMdl.FDCCorrenteVelhoCC_CODLANC.Value;

e a mensagem de erro é essa

could not convert variant of type (null) into type (integer)
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

23/06/2016

Você pode alterar o tipo de campo em sua tabela nova para integer também, não me recordo de null ser o tipo de campo é possível que o tipo atual na nova tabela esteja como varchar, com isso na importação ele esteja apresentando
could not convert variant of type (null) into type (integer)

Se a sua tabela antiga o campo CC_CODLANC é integer e na nova tabela o mesmo campo esteja como varchar basta converter o integer para string na importação ou igualar os campos

Para igualar os tipos de campos
Nova tabela é integer
Tabela velha é Integer

Para importar realizando a conversão
DtMdl.FDCCorrenteNovoCC_CODLANC.asstring := inttostr(DtMdl.FDCCorrenteVelhoCC_CODLANC.asinteger);

Espero que ajude.
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

23/06/2016

P2 o detalhe é que os dois campos tanto o antigo quanto o novo são integer
GOSTEI 0
Raimundo Pereira

Raimundo Pereira

23/06/2016

Tente

if DtMdl.FDCCorrenteVelhoCC_CODLANC.asinteger>0 then
begin
DtMdl.FDCCorrenteNovoCC_CODLANC..asinteger :=DtMdl.FDCCorrenteVelhoCC_CODLANC.asinteger;
end;
end;
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

23/06/2016

Deu certo P2, obrigado

estou com um problema idêntico mas agora em fields string e not null

DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;


grato!
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

23/06/2016

Re
Deu certo P2, obrigado

estou com um problema idêntico mas agora em fields string e not null

DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;


grato!


resolvido, de alguma forma a propriedade StrsEmpty2Null do dataset estava como True, coloquei false e resolveu
GOSTEI 0
Emanuel Gonçalves

Emanuel Gonçalves

23/06/2016

Re
Deu certo P2, obrigado

estou com um problema idêntico mas agora em fields string e not null

DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;


grato!


resolvido, de alguma forma a propriedade StrsEmpty2Null do dataset estava como True, coloquei false e resolveu



é, a propriedade StrsEmpty2Null precisa ficar true, isso permite evitar erros de chave primaria e ou chave unica com as informações vindas da tabela antiga, o detalhe é que isso barra o campo CL_ENDER da tabela ClientesNovo que é not null.

nessa situação, campo CL_ENDER não permite receber null
DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;
GOSTEI 0
POSTAR