Parar While quando achar o registro e prosseguir para o proximo!

Delphi

22/06/2010

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.....



  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

Robson Morais

Curtidas 0

Respostas

Robson Morais

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

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
Miguel Oliveira

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;
GOSTEI 0
Wilson Junior

Wilson Junior

22/06/2010

Utilize o comando Break.

  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

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?

GOSTEI 0
Robson Morais

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 ??


GOSTEI 0
Emerson Nascimento

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.


GOSTEI 0
POSTAR