Fórum Copiando os dados de uma tabela para outra de uma só vez #558546
23/06/2016
0
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
Curtir tópico
+ 0Posts
23/06/2016
Raimundo Pereira
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
27/06/2016
Emanuel Gonçalves
Gostei + 0
27/06/2016
Emanuel Gonçalves
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
27/06/2016
Raimundo Pereira
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
27/06/2016
Emanuel Gonçalves
Gostei + 0
27/06/2016
Raimundo Pereira
if DtMdl.FDCCorrenteVelhoCC_CODLANC.asinteger>0 then
begin
DtMdl.FDCCorrenteNovoCC_CODLANC..asinteger :=DtMdl.FDCCorrenteVelhoCC_CODLANC.asinteger;
end;
end;
Gostei + 0
28/06/2016
Emanuel Gonçalves
estou com um problema idêntico mas agora em fields string e not null
DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;
grato!
Gostei + 0
28/06/2016
Emanuel Gonçalves
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
28/06/2016
Emanuel Gonçalves
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
Clique aqui para fazer login e interagir na Comunidade :)