Ajuda com um laço WHILE no delphi
Bom dia, estou trabalhando na importação de um banco antigo para um banco novo e no momento o trabalho se concentra na tabela de clientes. No banco antigo alguns registros não apresentam o CPF ou CNPJ quando estou migrando para o banco novo esse Field de CPF_CNPJ é not null, a ideia é que ao encontrar um registro antigo sem valor no campo o while pule para o próximo registro.
segue o código de importação da tabela de Clientes
try
Application.ProcessMessages;
Sleep(0);
lblStatus01.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;
status := Ler_chave_reg('tabelas','clientes', '', verifica_ini);
if status = 'OK' then
Next
else
begin
contador := 999999;
while not DtMdl.FDClientesVelho.Eof do
begin
DtMdl.FDClientesNovo.Insert;
if DtMdl.FDClientesVelho.FieldByName('CODIGO').IsNull then
begin
inc(contador);
DtMdl.FDClientesNovoCL_NUMERO.Value:= contador;
end
else
DtMdl.FDClientesNovoCL_NUMERO.Value := (strtoint(DtMdl.FDClientesVelhoCODIGO.Value));
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value; <<<<NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGO
if inttostr(Length(DtMdl.FDClientesVelhoCNPJ_CPF.Value)) = '14'then
begin
DtMdl.FDJuridica.Active:= False;
DtMdl.FDJuridica.ParamByName('cnpj').Value:= DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDJuridica.Active:= True;
if (DtMdl.FDJuridicaINSC_ESTADUAL.Value) = '.' then
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.'
else
if (DtMdl.FDJuridicaINSC_ESTADUAL.Value) = '' then
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.'
else
begin
DtMdl.FDClientesNovoCL_INSCRICAO.Value := DtMdl.FDJuridicaINSC_ESTADUAL.Value;
DtMdl.FDClientesNovoCL_INSC_MUNIC.Value:= DtMdl.FDJuridicaINSC_MUNICIPAL.Value;
end;
end
else
if inttostr(Length(DtMdl.FDClientesVelhoCNPJ_CPF.Value))= '11'then
begin
DtMdl.FDFisica.Active:= False;
DtMdl.FDFisica.ParamByName('cpf').Value:= DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDFisica.Active:= True;
DtMdl.FDClientesNovoCL_INSCRICAO.Value := 'ISENTO';
DtMdl.FDClientesNovoCL_INSC_MUNIC.Value:= 'ISENTO';
end;
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:= '000000000'
else
if DtMdl.FDClientesVelho.FieldByName('CEP').IsNull then
DtMdl.FDClientesNovoCL_CEP.Value:= '000000000'
else
if DtMdl.FDClientesVelhoCEP.Value = ' 0' then
DtMdl.FDClientesNovoCL_CEP.Value:= '000000000'
else
DtMdl.FDClientesNovoCL_CEP.Value := DtMdl.FDClientesVelhoCEP.Value;
DtMdl.FDClientesNovoCL_CODCIDADE.Value := DtMdl.FDClientesVelhoCODCIDADE.Value;
if (DtMdl.FDClientesVelhoSTATUS.Value) = '' then
DtMdl.FDClientesNovoCL_STATUS.Value:= 'S'
else
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.FB_DataBaseNew.CommitRetaining;
Grava_Chave_Reg('tabelas','clientes', 'OK', verifica_ini);
DtMdl.FDClientesVelho.Next;
end;
end;
DtMdl.FB_DataBaseNew.CommitRetaining;
Sleep(0);
lblStatus01.Caption := 'Sincronização tabela de CLIENTES concluída.';
Inc(cont);
StringGrid1.Cells[0,16]:= inttostr(cont)+'. Clientes Ok!';
Application.ProcessMessages;
pbStatus01.Position := pbStatus01.Position + 1;
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.asinteger)+#13+#13+'Tentativa de sincronização cancelada'), 'AVISO', mb_OK + MB_ICONERROR);
if DtMdl.FDClientesNovo.State = dsInsert then
DtMdl.FDClientesNovo.Cancel;
end;
end;
segue o código de importação da tabela de Clientes
try
Application.ProcessMessages;
Sleep(0);
lblStatus01.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;
status := Ler_chave_reg('tabelas','clientes', '', verifica_ini);
if status = 'OK' then
Next
else
begin
contador := 999999;
while not DtMdl.FDClientesVelho.Eof do
begin
DtMdl.FDClientesNovo.Insert;
if DtMdl.FDClientesVelho.FieldByName('CODIGO').IsNull then
begin
inc(contador);
DtMdl.FDClientesNovoCL_NUMERO.Value:= contador;
end
else
DtMdl.FDClientesNovoCL_NUMERO.Value := (strtoint(DtMdl.FDClientesVelhoCODIGO.Value));
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value; <<<<NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGO
if inttostr(Length(DtMdl.FDClientesVelhoCNPJ_CPF.Value)) = '14'then
begin
DtMdl.FDJuridica.Active:= False;
DtMdl.FDJuridica.ParamByName('cnpj').Value:= DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDJuridica.Active:= True;
if (DtMdl.FDJuridicaINSC_ESTADUAL.Value) = '.' then
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.'
else
if (DtMdl.FDJuridicaINSC_ESTADUAL.Value) = '' then
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.'
else
begin
DtMdl.FDClientesNovoCL_INSCRICAO.Value := DtMdl.FDJuridicaINSC_ESTADUAL.Value;
DtMdl.FDClientesNovoCL_INSC_MUNIC.Value:= DtMdl.FDJuridicaINSC_MUNICIPAL.Value;
end;
end
else
if inttostr(Length(DtMdl.FDClientesVelhoCNPJ_CPF.Value))= '11'then
begin
DtMdl.FDFisica.Active:= False;
DtMdl.FDFisica.ParamByName('cpf').Value:= DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDFisica.Active:= True;
DtMdl.FDClientesNovoCL_INSCRICAO.Value := 'ISENTO';
DtMdl.FDClientesNovoCL_INSC_MUNIC.Value:= 'ISENTO';
end;
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:= '000000000'
else
if DtMdl.FDClientesVelho.FieldByName('CEP').IsNull then
DtMdl.FDClientesNovoCL_CEP.Value:= '000000000'
else
if DtMdl.FDClientesVelhoCEP.Value = ' 0' then
DtMdl.FDClientesNovoCL_CEP.Value:= '000000000'
else
DtMdl.FDClientesNovoCL_CEP.Value := DtMdl.FDClientesVelhoCEP.Value;
DtMdl.FDClientesNovoCL_CODCIDADE.Value := DtMdl.FDClientesVelhoCODCIDADE.Value;
if (DtMdl.FDClientesVelhoSTATUS.Value) = '' then
DtMdl.FDClientesNovoCL_STATUS.Value:= 'S'
else
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.FB_DataBaseNew.CommitRetaining;
Grava_Chave_Reg('tabelas','clientes', 'OK', verifica_ini);
DtMdl.FDClientesVelho.Next;
end;
end;
DtMdl.FB_DataBaseNew.CommitRetaining;
Sleep(0);
lblStatus01.Caption := 'Sincronização tabela de CLIENTES concluída.';
Inc(cont);
StringGrid1.Cells[0,16]:= inttostr(cont)+'. Clientes Ok!';
Application.ProcessMessages;
pbStatus01.Position := pbStatus01.Position + 1;
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.asinteger)+#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
Melhor post
Marco Antônio
21/07/2016
faltou pular o ponteiro da query
Agora se você tem uma condição a qual um determinado registro pode ou não ser importado acredito que esta condição deverá ser
validada primeiro para só depois colocar a sua query em modo de inserção, não há o porque de dentro de um loop você fazer vários procedimentos
se no meio da rotina essa inserção será interrompida. É só uma dica de práticas de programação.
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
begin
DtMdl.FDClientesNovo.cancel; // aqui precisa cancelar o modo de inserção
DtMdl.FDClientesVelho.next; // pulando o registro
Continue; // voltando ao inicio do While
end;
Agora se você tem uma condição a qual um determinado registro pode ou não ser importado acredito que esta condição deverá ser
validada primeiro para só depois colocar a sua query em modo de inserção, não há o porque de dentro de um loop você fazer vários procedimentos
se no meio da rotina essa inserção será interrompida. É só uma dica de práticas de programação.
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
begin
DtMdl.FDClientesVelho.next;
Continue;
end;
// se não pulo o registro é porque podemos continuar, logo poderá colocar em modo de inserção
DtMdl.FDClientesNovo.insert;
GOSTEI 1
Mais Respostas
Natanael Ferreira
18/07/2016
Use o comando [b]Continue[/b] para forçar o laço a ir para o próximo registro:
Exemplo:
Exemplo:
if DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull then
Continue;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value; // NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGOGOSTEI 0
Emanuel Gonçalves
18/07/2016
Use o comando [b]Continue[/b] para forçar o laço a ir para o próximo registro:
Exemplo:
Exemplo:
if DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull then
Continue;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value; // NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGOObrigado, vou testar e te passo um feedback
GOSTEI 0
Emanuel Gonçalves
18/07/2016
Use o comando [b]Continue[/b] para forçar o laço a ir para o próximo registro:
Exemplo:
Exemplo:
if DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull then
Continue;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value; // NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGOObrigado, vou testar e te passo um feedback
Bom dia, não deu certo
O banco tem 75000 registros e apenas um não tem CPF , não posso remover pois o mesmo faz referencia a outras tabelas. O seu código é o 68589, a ideia é ao varrer a tabela salvando no banco novo se deparar com esse registro o laço pule e continue do código 68590
GOSTEI 0
Natanael Ferreira
18/07/2016
Bom dia,
Você chegou a debugar o código para saber qual o comportamento do programa ao chegar no [b]IF[/b]?
Se ele está passando pelo comando [b]Continue[/b] ou não?
Talvez o campo informado não esteja nulo e sim vazio.
Tente dessa maneira:
Você chegou a debugar o código para saber qual o comportamento do programa ao chegar no [b]IF[/b]?
Se ele está passando pelo comando [b]Continue[/b] ou não?
Talvez o campo informado não esteja nulo e sim vazio.
Tente dessa maneira:
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
Continue;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value;
// NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGOGOSTEI 0
Emanuel Gonçalves
18/07/2016
Bom dia,
Você chegou a debugar o código para saber qual o comportamento do programa ao chegar no [b]IF[/b]?
Se ele está passando pelo comando [b]Continue[/b] ou não?
Talvez o campo informado não esteja nulo e sim vazio.
Tente dessa maneira:
Você chegou a debugar o código para saber qual o comportamento do programa ao chegar no [b]IF[/b]?
Se ele está passando pelo comando [b]Continue[/b] ou não?
Talvez o campo informado não esteja nulo e sim vazio.
Tente dessa maneira:
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
Continue;
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value;
// NESSE PONTO O FIELD NOVO RECEBE O VALOR DO FIELD ANTIGOvou testar
GOSTEI 0
Emanuel Gonçalves
18/07/2016
faltou pular o ponteiro da query
Agora se você tem uma condição a qual um determinado registro pode ou não ser importado acredito que esta condição deverá ser
validada primeiro para só depois colocar a sua query em modo de inserção, não há o porque de dentro de um loop você fazer vários procedimentos
se no meio da rotina essa inserção será interrompida. É só uma dica de práticas de programação.
if (DtMdl.FDClientesVelho.FieldByName(''CNPJ_CPF'').IsNull) or
(DtMdl.FDClientesVelho.FieldByName(''CNPJ_CPF'').AsString = EmptyStr) then
begin
DtMdl.FDClientesNovo.cancel; // aqui precisa cancelar o modo de inserção
DtMdl.FDClientesVelho.next; // pulando o registro
Continue; // voltando ao inicio do While
end;
Agora se você tem uma condição a qual um determinado registro pode ou não ser importado acredito que esta condição deverá ser
validada primeiro para só depois colocar a sua query em modo de inserção, não há o porque de dentro de um loop você fazer vários procedimentos
se no meio da rotina essa inserção será interrompida. É só uma dica de práticas de programação.
if (DtMdl.FDClientesVelho.FieldByName(''CNPJ_CPF'').IsNull) or
(DtMdl.FDClientesVelho.FieldByName(''CNPJ_CPF'').AsString = EmptyStr) then
begin
DtMdl.FDClientesVelho.next;
Continue;
end;
// se não pulo o registro é porque podemos continuar, logo poderá colocar em modo de inserção
DtMdl.FDClientesNovo.insert;
if (DtMdl.FDClientesVelho.FieldByName(''CNPJ_CPF'').IsNull) or
(DtMdl.FDClientesVelho.FieldByName(''CNPJ_CPF'').AsString = EmptyStr) then
begin
DtMdl.FDClientesVelho.next;
Continue;
end
else// se não pulo o registro é porque podemos continuar, logo poderá colocar em modo de inserção
DtMdl.FDClientesNovo.insert;
Marco acredito que a segunda opção seria a mas recomendada, após entrar no while, verificar se existe algum registro sem informação no field de CNPJ_CPF para depois prosseguir.
Só uma duvida, não seria necessário colocar um ELSE para se a condição no IF for falsa ele entrar em inserção e executar todo o resto ?
GOSTEI 0
Eduardo Silva.
18/07/2016
Não seria mais fácil você fazer uma consulta SQL excluído o campo nulo e depois exportar, tipo:
Eduardo Belo
Select * From ClientesVelho Where CNPJ_CPF Is Not Null
Eduardo Belo
GOSTEI 0
Emanuel Gonçalves
18/07/2016
vou testar as opções
mantenho todos informados
mantenho todos informados
GOSTEI 0
Emanuel Gonçalves
18/07/2016
faltou pular o ponteiro da query
Agora se você tem uma condição a qual um determinado registro pode ou não ser importado acredito que esta condição deverá ser
validada primeiro para só depois colocar a sua query em modo de inserção, não há o porque de dentro de um loop você fazer vários procedimentos
se no meio da rotina essa inserção será interrompida. É só uma dica de práticas de programação.
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
begin
DtMdl.FDClientesNovo.cancel; // aqui precisa cancelar o modo de inserção
DtMdl.FDClientesVelho.next; // pulando o registro
Continue; // voltando ao inicio do While
end;
Agora se você tem uma condição a qual um determinado registro pode ou não ser importado acredito que esta condição deverá ser
validada primeiro para só depois colocar a sua query em modo de inserção, não há o porque de dentro de um loop você fazer vários procedimentos
se no meio da rotina essa inserção será interrompida. É só uma dica de práticas de programação.
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
begin
DtMdl.FDClientesVelho.next;
Continue;
end;
// se não pulo o registro é porque podemos continuar, logo poderá colocar em modo de inserção
DtMdl.FDClientesNovo.insert;
Resolvido!! Segue o código para importação da tabela de clientes. Obrigado a todos!!
try
Application.ProcessMessages;
Sleep(0);
lblStatus01.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;
status := Ler_chave_reg('tabelas','clientes', '', verifica_ini);
if status = 'OK' then
Next
else
begin
contador := 999999;
while not DtMdl.FDClientesVelho.Eof do
begin
if (DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').IsNull) or
(DtMdl.FDClientesVelho.FieldByName('CNPJ_CPF').AsString = EmptyStr) then
begin
DtMdl.FDClientesVelho.next;
Continue;
end
else // se não pulo o registro é porque podemos continuar, logo poderá colocar em modo de inserção
DtMdl.FDClientesNovo.insert;
if DtMdl.FDClientesVelho.FieldByName('CODIGO').IsNull then
begin
inc(contador);
DtMdl.FDClientesNovoCL_NUMERO.Value:= contador;
end
else
DtMdl.FDClientesNovoCL_NUMERO.Value := (strtoint(DtMdl.FDClientesVelhoCODIGO.Value));
DtMdl.FDClientesNovoCL_CNPJ_CPF.Value := DtMdl.FDClientesVelhoCNPJ_CPF.Value;
if inttostr(Length(DtMdl.FDClientesVelhoCNPJ_CPF.Value)) = '14'then
begin
DtMdl.FDJuridica.Active:= False;
DtMdl.FDJuridica.ParamByName('cnpj').Value:= DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDJuridica.Active:= True;
if (DtMdl.FDJuridicaINSC_ESTADUAL.Value) = '.' then
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.'
else
if (DtMdl.FDJuridicaINSC_ESTADUAL.Value) = '' then
DtMdl.FDClientesNovoCL_INSCRICAO.Value := '.'
else
begin
DtMdl.FDClientesNovoCL_INSCRICAO.Value := DtMdl.FDJuridicaINSC_ESTADUAL.Value;
DtMdl.FDClientesNovoCL_INSC_MUNIC.Value:= DtMdl.FDJuridicaINSC_MUNICIPAL.Value;
end;
end
else
if inttostr(Length(DtMdl.FDClientesVelhoCNPJ_CPF.Value))= '11'then
begin
DtMdl.FDFisica.Active:= False;
DtMdl.FDFisica.ParamByName('cpf').Value:= DtMdl.FDClientesVelhoCNPJ_CPF.Value;
DtMdl.FDFisica.Active:= True;
DtMdl.FDClientesNovoCL_INSCRICAO.Value := 'ISENTO';
DtMdl.FDClientesNovoCL_INSC_MUNIC.Value:= 'ISENTO';
end;
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:= '000000000'
else
if DtMdl.FDClientesVelho.FieldByName('CEP').IsNull then
DtMdl.FDClientesNovoCL_CEP.Value:= '000000000'
else
if DtMdl.FDClientesVelhoCEP.Value = ' 0' then
DtMdl.FDClientesNovoCL_CEP.Value:= '000000000'
else
DtMdl.FDClientesNovoCL_CEP.Value := DtMdl.FDClientesVelhoCEP.Value;
DtMdl.FDClientesNovoCL_CODCIDADE.Value := DtMdl.FDClientesVelhoCODCIDADE.Value;
if (DtMdl.FDClientesVelhoSTATUS.Value) = '' then
DtMdl.FDClientesNovoCL_STATUS.Value:= 'S'
else
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.FB_DataBaseNew.CommitRetaining;
Grava_Chave_Reg('tabelas','clientes', 'OK', verifica_ini);
DtMdl.FDClientesVelho.Next;
Application.ProcessMessages;
end;
end;
DtMdl.FB_DataBaseNew.CommitRetaining;
Sleep(0);
lblStatus01.Caption := 'Sincronização tabela de CLIENTES concluída.';
Inc(cont);
StringGrid1.Cells[0,16]:= inttostr(cont)+'. Clientes Ok!';
Application.ProcessMessages;
pbStatus01.Position := pbStatus01.Position + 1;
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.asinteger)+#13+#13+'Tentativa de sincronização cancelada'), 'AVISO', mb_OK + MB_ICONERROR);
if DtMdl.FDClientesNovo.State = dsInsert then
DtMdl.FDClientesNovo.Cancel;
end;
end;
GOSTEI 0
Marco Antônio
18/07/2016
Opa, Emanuel boa tarde.
Só respondendo a sua citação anterior....
Não há a necessidade do 'ELSE' uma vez que qdo a condição não for verdadeira automaticamente a sua linha de comando descerá para o 'INSERT', já qdo a sua
condição for verdadeira, o laço voltará ao inicio e não executará o 'INSERT', é para isso que esta utilizando o 'CONTINUE', para que o seu programa saia
da linha de comando que esta e volte para o início do laço.
Abc.
Só respondendo a sua citação anterior....
Não há a necessidade do 'ELSE' uma vez que qdo a condição não for verdadeira automaticamente a sua linha de comando descerá para o 'INSERT', já qdo a sua
condição for verdadeira, o laço voltará ao inicio e não executará o 'INSERT', é para isso que esta utilizando o 'CONTINUE', para que o seu programa saia
da linha de comando que esta e volte para o início do laço.
Abc.
GOSTEI 0