Parar While quando achar o registro e prosseguir para o proximo!
Pessoal estou fazendo um while e dentro dele eu verifico se o Codigo é igual ao CodBairro, isso por dentro de outro while, o que eu quero é que quando
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
for igual ao outro parar o while do QryBai e ai partir para o proximo registro do QryEnd e ai voltar dentro do while do QryBai se ele achar o registro igual ele deve sair do while do QryBai e pular pra proxima linha do while do QryEnd e volta novamente no QryBai, sempre quando ele volta no QryBai ele começa do primeiro registro....estou precisando de ajuda nisso.....
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
for igual ao outro parar o while do QryBai e ai partir para o proximo registro do QryEnd e ai voltar dentro do while do QryBai se ele achar o registro igual ele deve sair do while do QryBai e pular pra proxima linha do while do QryEnd e volta novamente no QryBai, sempre quando ele volta no QryBai ele começa do primeiro registro....estou precisando de ajuda nisso.....
while not QryEnd.Eof do
begin
QryBai.First;
while not QryBai.Eof do
begin
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
end;
QryBai.Next;
end;
QryEnd.Next;
end;
Robson Morais
Curtidas 0
Respostas
Robson Morais
22/06/2010
while not QryEnd.Eof do
begin
QryBai.First;
while not QryBai.Eof do
begin
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
end;
QryBai.Next;
end;
QryEnd.Next;
end;
GOSTEI 0
Robson Morais
22/06/2010
while not QryEnd.Eof do
begin
QryBai.First;
while not QryBai.Eof do
begin
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
end;
QryBai.Next;
end;
QryEnd.Next;
end;
begin
QryBai.First;
while not QryBai.Eof do
begin
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
end;
QryBai.Next;
end;
QryEnd.Next;
end;
GOSTEI 0
Miguel Oliveira
22/06/2010
Olá RobinhoCne
Veja se os códigos abaixo iram resolver seu problema.
Alterei seu código de duas maneiras você pode utilizar qual achar melhor
while not QryEnd.Eof do
begin QryBai.First; while (not QryBai.Eof) and
(QryBai.FieldByName('Codigo').AsInteger <> QryEnd.FieldByName('CodBairro').AsInteger)
do
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
QryBai.Next;
end;
QryEnd.Next;
end;
ou
while not QryEnd.Eof do
begin QryBai.First; while not QryBai.Eof do
begin if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
Break ;
end
else
QryBai.Next;
end;
QryEnd.Next;
end;
begin QryBai.First; while (not QryBai.Eof) and
(QryBai.FieldByName('Codigo').AsInteger <> QryEnd.FieldByName('CodBairro').AsInteger)
do
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
QryBai.Next;
end;
QryEnd.Next;
end;
ou
while not QryEnd.Eof do
begin QryBai.First; while not QryBai.Eof do
begin if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
Break ;
end
else
QryBai.Next;
end;
QryEnd.Next;
end;
GOSTEI 0
Wilson Junior
22/06/2010
Utilize o comando Break.
Espero ter colaborado.
while not QryEnd.Eof do
begin
QryBai.First;
while not QryBai.Eof do
begin
if QryBai.FieldByName('Codigo').AsInteger = QryEnd.FieldByName('CodBairro').AsInteger then
begin
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
Break; { Irá parar o segundo laço de repetição }
end;
QryBai.Next;
end;
QryEnd.Next;
end;
Espero ter colaborado.
GOSTEI 0
Emerson Nascimento
22/06/2010
colega, porque um while para varrer a tabela de bairros?
não seria melhor ter um índice pelo campo Codigo e efetuar a busca diretamente?
não seria melhor ter um índice pelo campo Codigo e efetuar a busca diretamente?
GOSTEI 0
Robson Morais
22/06/2010
Então Emerson eu não sei fazer assim não, por isso que estou fazendo pelo while, mas mesmo assim ainda estou tendo demoras....para fazer o while......
porque é assim.....
achei o codigo na linha 1500 ai o proximo 1600...ai ele fica varrendo toda a linha ....
queria melhorar isso...
tipo sei que quando cheguei na linha 1600....nao vou ter mais codigo parecidos com ele...para fazer a uniao.....ai nao precisaria iniciar da linha 1 para chegar até na 1601.....entendeu ??
porque é assim.....
achei o codigo na linha 1500 ai o proximo 1600...ai ele fica varrendo toda a linha ....
queria melhorar isso...
tipo sei que quando cheguei na linha 1600....nao vou ter mais codigo parecidos com ele...para fazer a uniao.....ai nao precisaria iniciar da linha 1 para chegar até na 1601.....entendeu ??
GOSTEI 0
Emerson Nascimento
22/06/2010
você pode fazer de várias formas; duas delas:
assim:
while not QryEnd.Eof do
begin
QryBai.First;
QryBai.Close;
QryBai.SQL.Text := 'SELECT * FROM BAIRROS WHERE CODIGO = ' + IntToStr(QryEnd.FieldByName('CodBairro').AsInteger);
QryBai.Open;
if not QryBai.IsEmpty then // encontrou o registro
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
QryEnd.Next;
end;
ou somente assim, eliminando qualquer varredura (while) nas tabelas:
QryUniaoCep.Close;
QryUniaoCep.SQL.Text :=
'insert into UNIAO (CEP, LOGRADOURO, NUMERO, BAIRRO, COMPLEMENTO, CODCIDADE) '+
'select log.CEP, log.LOGRADOURO, log.NUMERO, bai.BAIRRO, '+
'log.COMPLEMENTO, bai.CODCIDADE '+
'from ENDERECO log '+
'inner join BAIRROS bai on bai.CODIGO = log.CODBAIRRO ';
QryUniaoCep.Execute;
assim todos os registros serão incluídos simultâneamente e automaticamente. note que nesta última opção pode ser necessário adicionar uma condicional, para que não sejam incluídos registros repetidos.
assim:
while not QryEnd.Eof do
begin
QryBai.First;
QryBai.Close;
QryBai.SQL.Text := 'SELECT * FROM BAIRROS WHERE CODIGO = ' + IntToStr(QryEnd.FieldByName('CodBairro').AsInteger);
QryBai.Open;
if not QryBai.IsEmpty then // encontrou o registro
with TblUniao do
begin
insert;
TblUniaoCep.AsString := QryEnd.FieldByName('Cep').AsString;
TblUniaoLogradouro.AsString := QryEnd.FieldByName('Logradouro').AsString;
TblUniaoNumero.AsString := QryEnd.FieldByName('Numero').AsString;
TblUniaoBairro.AsString := QryBai.FieldByName('Bairro').AsString;
TblUniaoComplemento.AsString := QryEnd.FieldByName('Complemento').AsString;
TblUniaoCodCidade.AsString := QryBai.FieldByName('CodCidade').AsString;
post;
end;
QryEnd.Next;
end;
ou somente assim, eliminando qualquer varredura (while) nas tabelas:
QryUniaoCep.Close;
QryUniaoCep.SQL.Text :=
'insert into UNIAO (CEP, LOGRADOURO, NUMERO, BAIRRO, COMPLEMENTO, CODCIDADE) '+
'select log.CEP, log.LOGRADOURO, log.NUMERO, bai.BAIRRO, '+
'log.COMPLEMENTO, bai.CODCIDADE '+
'from ENDERECO log '+
'inner join BAIRROS bai on bai.CODIGO = log.CODBAIRRO ';
QryUniaoCep.Execute;
assim todos os registros serão incluídos simultâneamente e automaticamente. note que nesta última opção pode ser necessário adicionar uma condicional, para que não sejam incluídos registros repetidos.
GOSTEI 0