Ajuda para importar dados de uma tabela para outra no delphi
Boa tarde,
eu estou fazendo a importação do banco antigo para o novo e me deparei com um problema.
na tabela Nova de CLIENTES eu tenho um field CL_NUMERO do tipo Integer not null
na tabela Antiga de CLIENTES eu tenho um field CODIGO do tipo String e não é not null >> >>> nessa tabela eu tenho registro com códigos e registro com valor NULL nesse field , é ai o problema. Eu não posso importar um registro para a tabela nova de CLIENTES com um valo null já que o field respectivo na tabela nova "CL_NUMERO" é not null.
a ideia é que nesses registros com valor NULL no field CODIGO da tabela antiga eu set o generator para 1000000 e sempre que encontrar um null ele incremente 1000001, 100002... e assim por diante.
quando for encontrado um codigo no field CODIGO da tabela antiga eu apenas o transforme para int e salve no respectivo campo na tabela nova CL_NUMERO
segue as linhas de códigos
try
lblStatus.Caption := 'Iniciando processo de sincronia... Aguarde....' ;
Application.ProcessMessages;
pbStatus.Position:=pbStatus.Position+1;
Sleep(0);
lblStatus.Caption := 'Sincronizando tabela CLIENTES...';
Application.ProcessMessages;
DtMdl.FDClientesVelho.Active := False;
DtMdl.FDClientesVelho.Active := True;
DtMdl.FDClientesVelho.First;
DtMdl.FDClientesNovo.Active := False;
DtMdl.FDClientesNovo.Active := True;
while not DtMdl.FDClientesVelho.Eof do
begin
DtMdl.FDClientesNovo.Insert;
>>>>DtMdl.FDCodCidadeNovoCI_NUMERO.Value := DtMdl.FDClientesVelhoCODIGO.Value; <<<<<<<<<<<<< aqui está o problema <<<<<<<<<<<<<<<<<<<<<<<<<<
DtMdl.FDClientesNovoCL_NOME.Value := DtMdl.FDClientesVelhoNOME.Value;
DtMdl.FDClientesNovoCL_FANTASIA.Value := DtMdl.FDClientesVelhoNOME_FANTASIA.Value;
if (DtMdl.FDClientesVelhoENDERECO.Value = '') then
DtMdl.FDClientesNovoCL_ENDER.Value := '.'
else
DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;
if (DtMdl.FDClientesVelhoEND_NUMERO.Value = '') then
DtMdl.FDClientesNovoCL_END_NUMERO.Value := '.'
else
DtMdl.FDClientesNovoCL_END_NUMERO.Value := DtMdl.FDClientesVelhoEND_NUMERO.Value;
if (DtMdl.FDClientesVelhoCOMPLEMENTO.Value = '') then
DtMdl.FDClientesNovoCL_COMPLEMENTO.Value:= '.'
else
DtMdl.FDClientesNovoCL_COMPLEMENTO.Value := DtMdl.FDClientesVelhoCOMPLEMENTO.Value;
if (DtMdl.FDClientesVelhoBAIRRO.Value = '') then
DtMdl.FDClientesNovoCL_BAIRRO.Value:= '.'
else
DtMdl.FDClientesNovoCL_BAIRRO.Value := DtMdl.FDClientesVelhoBAIRRO.Value;
if (DtMdl.FDClientesVelhoCEP.Value = '') then
DtMdl.FDClientesNovoCL_CEP.Value:= '.'
else
DtMdl.FDClientesNovoCL_CEP.Value := DtMdl.FDClientesVelhoCEP.Value;
if (DtMdl.FDClientesVelhoCODCIDADE.Value = '') then
DtMdl.FDClientesNovoCL_CODCIDADE.Value:= '.'
else
DtMdl.FDClientesNovoCL_CODCIDADE.Value := DtMdl.FDClientesVelhoCODCIDADE.Value;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.';
DtMdl.FDClientesNovoCL_STATUS.Value := DtMdl.FDClientesVelhoSTATUS.Value;
DtMdl.FDClientesNovoCL_LIMITE_CREDITO.Value := DtMdl.FDClientesVelhoLIMITE_CREDITO.Value;
DtMdl.FDClientesNovoCL_LIMITE_NOTA.Value := DtMdl.FDClientesVelhoLIMITE_NOTA.Value;
DtMdl.FDClientesNovoCL_TIPO.Value := DtMdl.FDClientesVelhoTIPO.Value;
DtMdl.FDClientesNovoCL_AGREGA_NOTAS.Value := DtMdl.FDClientesVelhoAGREGA_NOTAS.Value;
DtMdl.FDClientesNovoCL_PRAZO_MEDIO.Value := DtMdl.FDClientesVelhoPRAZO_MEDIO.Value;
DtMdl.FDClientesNovoCL_DIA_VENC.Value := DtMdl.FDClientesVelhoDIA_VENC.Value;
DtMdl.FDClientesNovoCL_UNID_COBRANCA.Value := DtMdl.FDClientesVelhoUNID_COBRANCA.Value;
DtMdl.FDClientesNovoCL_DESC_PADRAO.Value := DtMdl.FDClientesVelhoDESC_PADRAO.Value;
DtMdl.FDClientesNovoCL_FONE.Value := DtMdl.FDClientesVelhoFONE_1.Value;
DtMdl.FDClientesNovoCL_CELULAR.Value := DtMdl.FDClientesVelhoFONE_2.Value;
DtMdl.FDClientesNovoCL_CELULAR2.Value := DtMdl.FDClientesVelhoCELULAR.Value;
DtMdl.FDClientesNovoCL_FAX.Value := DtMdl.FDClientesVelhoFAX.Value;
DtMdl.FDClientesNovoCL_EMAIL.Value := DtMdl.FDClientesVelhoEMAIL.Value;
DtMdl.FDClientesNovoCL_EMAIL_NFE.Value := DtMdl.FDClientesVelhoEMAIL_NFE.Value;
DtMdl.FDClientesNovoCL_ULT_ATUALIZA.Value := DtMdl.FDClientesVelhoULT_ATUALIZACAO.Value;
DtMdl.FDClientesNovoCL_DATA_CAD.AsDateTime := Now;
DtMdl.FDClientesNovoDESATIVADO.Value := DtMdl.FDClientesVelhoDESATIVADO.Value;
DtMdl.FDClientesNovo.Post;
DtMdl.FDClientesNovo.Next;
end;
DtMdl.FB_DataBaseNew.CommitRetaining;
Sleep(0);
lblStatus.Caption := 'Sincronização tabela de CLIENTES concluída.';
Application.ProcessMessages;
except
on E : Exception do
begin
DtMdl.FB_DataBaseNew.RollbackRetaining;
application.MessageBox(pchar('Problemas durante a migração dos dados' +#13+#13+
'Descrição do erro: '+#13+#13+E.Message+IntToStr(DtMdl.FDClientesNovoCL_NUMERO.Value)+#13+#13+'Tentativa de sincronização cancelada'), 'AVISO', mb_OK + MB_ICONERROR);
if DtMdl.FDClientesNovo.State = dsInsert then
DtMdl.FDClientesNovo.Cancel;
end;
end;
eu estou fazendo a importação do banco antigo para o novo e me deparei com um problema.
na tabela Nova de CLIENTES eu tenho um field CL_NUMERO do tipo Integer not null
na tabela Antiga de CLIENTES eu tenho um field CODIGO do tipo String e não é not null >> >>> nessa tabela eu tenho registro com códigos e registro com valor NULL nesse field , é ai o problema. Eu não posso importar um registro para a tabela nova de CLIENTES com um valo null já que o field respectivo na tabela nova "CL_NUMERO" é not null.
a ideia é que nesses registros com valor NULL no field CODIGO da tabela antiga eu set o generator para 1000000 e sempre que encontrar um null ele incremente 1000001, 100002... e assim por diante.
quando for encontrado um codigo no field CODIGO da tabela antiga eu apenas o transforme para int e salve no respectivo campo na tabela nova CL_NUMERO
segue as linhas de códigos
try
lblStatus.Caption := 'Iniciando processo de sincronia... Aguarde....' ;
Application.ProcessMessages;
pbStatus.Position:=pbStatus.Position+1;
Sleep(0);
lblStatus.Caption := 'Sincronizando tabela CLIENTES...';
Application.ProcessMessages;
DtMdl.FDClientesVelho.Active := False;
DtMdl.FDClientesVelho.Active := True;
DtMdl.FDClientesVelho.First;
DtMdl.FDClientesNovo.Active := False;
DtMdl.FDClientesNovo.Active := True;
while not DtMdl.FDClientesVelho.Eof do
begin
DtMdl.FDClientesNovo.Insert;
>>>>DtMdl.FDCodCidadeNovoCI_NUMERO.Value := DtMdl.FDClientesVelhoCODIGO.Value; <<<<<<<<<<<<< aqui está o problema <<<<<<<<<<<<<<<<<<<<<<<<<<
DtMdl.FDClientesNovoCL_NOME.Value := DtMdl.FDClientesVelhoNOME.Value;
DtMdl.FDClientesNovoCL_FANTASIA.Value := DtMdl.FDClientesVelhoNOME_FANTASIA.Value;
if (DtMdl.FDClientesVelhoENDERECO.Value = '') then
DtMdl.FDClientesNovoCL_ENDER.Value := '.'
else
DtMdl.FDClientesNovoCL_ENDER.Value := DtMdl.FDClientesVelhoENDERECO.Value;
if (DtMdl.FDClientesVelhoEND_NUMERO.Value = '') then
DtMdl.FDClientesNovoCL_END_NUMERO.Value := '.'
else
DtMdl.FDClientesNovoCL_END_NUMERO.Value := DtMdl.FDClientesVelhoEND_NUMERO.Value;
if (DtMdl.FDClientesVelhoCOMPLEMENTO.Value = '') then
DtMdl.FDClientesNovoCL_COMPLEMENTO.Value:= '.'
else
DtMdl.FDClientesNovoCL_COMPLEMENTO.Value := DtMdl.FDClientesVelhoCOMPLEMENTO.Value;
if (DtMdl.FDClientesVelhoBAIRRO.Value = '') then
DtMdl.FDClientesNovoCL_BAIRRO.Value:= '.'
else
DtMdl.FDClientesNovoCL_BAIRRO.Value := DtMdl.FDClientesVelhoBAIRRO.Value;
if (DtMdl.FDClientesVelhoCEP.Value = '') then
DtMdl.FDClientesNovoCL_CEP.Value:= '.'
else
DtMdl.FDClientesNovoCL_CEP.Value := DtMdl.FDClientesVelhoCEP.Value;
if (DtMdl.FDClientesVelhoCODCIDADE.Value = '') then
DtMdl.FDClientesNovoCL_CODCIDADE.Value:= '.'
else
DtMdl.FDClientesNovoCL_CODCIDADE.Value := DtMdl.FDClientesVelhoCODCIDADE.Value;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.';
DtMdl.FDClientesNovoCL_STATUS.Value := DtMdl.FDClientesVelhoSTATUS.Value;
DtMdl.FDClientesNovoCL_LIMITE_CREDITO.Value := DtMdl.FDClientesVelhoLIMITE_CREDITO.Value;
DtMdl.FDClientesNovoCL_LIMITE_NOTA.Value := DtMdl.FDClientesVelhoLIMITE_NOTA.Value;
DtMdl.FDClientesNovoCL_TIPO.Value := DtMdl.FDClientesVelhoTIPO.Value;
DtMdl.FDClientesNovoCL_AGREGA_NOTAS.Value := DtMdl.FDClientesVelhoAGREGA_NOTAS.Value;
DtMdl.FDClientesNovoCL_PRAZO_MEDIO.Value := DtMdl.FDClientesVelhoPRAZO_MEDIO.Value;
DtMdl.FDClientesNovoCL_DIA_VENC.Value := DtMdl.FDClientesVelhoDIA_VENC.Value;
DtMdl.FDClientesNovoCL_UNID_COBRANCA.Value := DtMdl.FDClientesVelhoUNID_COBRANCA.Value;
DtMdl.FDClientesNovoCL_DESC_PADRAO.Value := DtMdl.FDClientesVelhoDESC_PADRAO.Value;
DtMdl.FDClientesNovoCL_FONE.Value := DtMdl.FDClientesVelhoFONE_1.Value;
DtMdl.FDClientesNovoCL_CELULAR.Value := DtMdl.FDClientesVelhoFONE_2.Value;
DtMdl.FDClientesNovoCL_CELULAR2.Value := DtMdl.FDClientesVelhoCELULAR.Value;
DtMdl.FDClientesNovoCL_FAX.Value := DtMdl.FDClientesVelhoFAX.Value;
DtMdl.FDClientesNovoCL_EMAIL.Value := DtMdl.FDClientesVelhoEMAIL.Value;
DtMdl.FDClientesNovoCL_EMAIL_NFE.Value := DtMdl.FDClientesVelhoEMAIL_NFE.Value;
DtMdl.FDClientesNovoCL_ULT_ATUALIZA.Value := DtMdl.FDClientesVelhoULT_ATUALIZACAO.Value;
DtMdl.FDClientesNovoCL_DATA_CAD.AsDateTime := Now;
DtMdl.FDClientesNovoDESATIVADO.Value := DtMdl.FDClientesVelhoDESATIVADO.Value;
DtMdl.FDClientesNovo.Post;
DtMdl.FDClientesNovo.Next;
end;
DtMdl.FB_DataBaseNew.CommitRetaining;
Sleep(0);
lblStatus.Caption := 'Sincronização tabela de CLIENTES concluída.';
Application.ProcessMessages;
except
on E : Exception do
begin
DtMdl.FB_DataBaseNew.RollbackRetaining;
application.MessageBox(pchar('Problemas durante a migração dos dados' +#13+#13+
'Descrição do erro: '+#13+#13+E.Message+IntToStr(DtMdl.FDClientesNovoCL_NUMERO.Value)+#13+#13+'Tentativa de sincronização cancelada'), 'AVISO', mb_OK + MB_ICONERROR);
if DtMdl.FDClientesNovo.State = dsInsert then
DtMdl.FDClientesNovo.Cancel;
end;
end;
Emanuel Gonçalves
Curtidas 0
Respostas
Raimundo Pereira
28/06/2016
Crie uma tabela REGISTRO_MANUAL COM O CAMPO ULTIMO_REGISTRO=INTEGER , no DM=RM
.valor inicial =1000000
Essa tabela terá apenas um registro, aonde sempre que precisar você irá abrir essa tabela e somar ULTIMO_REGISTRO.asinteger:=ULTIMO_REGISTRO.asinteger+1;
Salva a tebela e assim por diante.
Então ficaria assim
DtMdl.RM.CLOSE;
IF NOT (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring)>0 THEN // Se não for maior que 0
begin
DtMdl.RM.CLOSE;
DtMdl.RM.sql.clear;
DtMdl.RM.sql.text:='select * from REGISTRO_MANUAL';
DtMdl.RM.open;
DtMdl.FDCodCidadeNovoCI_NUMERO.Value:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1; //Vai na tabela pega o valor do ultimo registro soma +1
DtMdl.RM.edit;
DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1
DtMdl.RM.post;
DtMdl.RM.CLOSE;
end
else
begin
DtMdl.FDCodCidadeNovoCI_NUMERO.asinteger := (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring);// Se o valor for maior que 0 ele irá levá esse código para a tabela nova
end;
end;
Espero que ajude!
Abr
.valor inicial =1000000
Essa tabela terá apenas um registro, aonde sempre que precisar você irá abrir essa tabela e somar ULTIMO_REGISTRO.asinteger:=ULTIMO_REGISTRO.asinteger+1;
Salva a tebela e assim por diante.
Então ficaria assim
DtMdl.RM.CLOSE;
IF NOT (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring)>0 THEN // Se não for maior que 0
begin
DtMdl.RM.CLOSE;
DtMdl.RM.sql.clear;
DtMdl.RM.sql.text:='select * from REGISTRO_MANUAL';
DtMdl.RM.open;
DtMdl.FDCodCidadeNovoCI_NUMERO.Value:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1; //Vai na tabela pega o valor do ultimo registro soma +1
DtMdl.RM.edit;
DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1
DtMdl.RM.post;
DtMdl.RM.CLOSE;
end
else
begin
DtMdl.FDCodCidadeNovoCI_NUMERO.asinteger := (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring);// Se o valor for maior que 0 ele irá levá esse código para a tabela nova
end;
end;
Espero que ajude!
Abr
GOSTEI 0
Emanuel Gonçalves
28/06/2016
Crie uma tabela REGISTRO_MANUAL COM O CAMPO ULTIMO_REGISTRO=INTEGER , no DM=RM
.valor inicial =1000000
Essa tabela terá apenas um registro, aonde sempre que precisar você irá abrir essa tabela e somar ULTIMO_REGISTRO.asinteger:=ULTIMO_REGISTRO.asinteger+1;
Salva a tebela e assim por diante.
Então ficaria assim
DtMdl.RM.CLOSE;
IF NOT (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring)>0 THEN // Se não for maior que 0
begin
DtMdl.RM.CLOSE;
DtMdl.RM.sql.clear;
DtMdl.RM.sql.text:='select * from REGISTRO_MANUAL';
DtMdl.RM.open;
DtMdl.FDCodCidadeNovoCI_NUMERO.Value:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1; //Vai na tabela pega o valor do ultimo registro soma +1
DtMdl.RM.edit;
DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1
DtMdl.RM.post;
DtMdl.RM.CLOSE;
end
else
begin
DtMdl.FDCodCidadeNovoCI_NUMERO.asinteger := (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring);// Se o valor for maior que 0 ele irá levá esse código para a tabela nova
end;
end;
Espero que ajude!
Abr
.valor inicial =1000000
Essa tabela terá apenas um registro, aonde sempre que precisar você irá abrir essa tabela e somar ULTIMO_REGISTRO.asinteger:=ULTIMO_REGISTRO.asinteger+1;
Salva a tebela e assim por diante.
Então ficaria assim
DtMdl.RM.CLOSE;
IF NOT (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring)>0 THEN // Se não for maior que 0
begin
DtMdl.RM.CLOSE;
DtMdl.RM.sql.clear;
DtMdl.RM.sql.text:='select * from REGISTRO_MANUAL';
DtMdl.RM.open;
DtMdl.FDCodCidadeNovoCI_NUMERO.Value:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1; //Vai na tabela pega o valor do ultimo registro soma +1
DtMdl.RM.edit;
DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger:=DtMdl.RM.fielbyname('ULTIMO_REGISTRO').asinteger+1
DtMdl.RM.post;
DtMdl.RM.CLOSE;
end
else
begin
DtMdl.FDCodCidadeNovoCI_NUMERO.asinteger := (strtoint(DtMdl.FDClientesVelhoCODIGO.asstring);// Se o valor for maior que 0 ele irá levá esse código para a tabela nova
end;
end;
Espero que ajude!
Abr
obrigado, vou tentar
GOSTEI 0
Emanuel Gonçalves
28/06/2016
P2, eu criei a tabela REGISTRO_MANUAL com o field ULTIMO_REGISTRO tipo INTEGER
não consegui entender dois pontos das sua ajuda
DM=RM.valor inicial =1000000
ULTIMO_REGISTRO.asinteger:=ULTIMO_REGISTRO.asinteger+1;
onde colocar no código
não consegui entender dois pontos das sua ajuda
DM=RM.valor inicial =1000000
ULTIMO_REGISTRO.asinteger:=ULTIMO_REGISTRO.asinteger+1;
onde colocar no código
GOSTEI 0