comando while...como faço...loop...

08/03/2006

Olá,

no comando do while tenho que testar um campo e caso este campo retorne False...tenho que dar um Next e continuar a testar os outros registro...tipo assim:

while not tblfuncionarios.eof do
begin
IF tblFuncionarios.FieldByName(´causa__fu´).AsInteger <> 0 then
begin
IF (yyear(tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) =
StrToInt(delphiRight(mesano,4))) then
begin
IF (ymonth(tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) <
StrToInt(delphiLeft(periodo_w,4))) or
((ymonth(.tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) >
StrToInt(delphiLeft(periodo_w,4))) then
tblFuncionarios.Next;
>>>>aqui eu gostaria de dar um loop e continuar do while novamente para os testes dos outros funcionarios
end;
end
else
begin
-----
----- aqui o restante dos comando e buscas
-----
end;
end;

para quem ja trabalho com o clipper existe o comando dentro do while que vai para o final do enddo e continua no proximo registro...tipo assim :

do while .not. eof ()
IF day (fun->rescis_fu) > 0 .or. fun->causa__fu <> 0
IF year (fun->rescis_fu) = val (RIGHT (mesano, 4))
IF month (fun->rescis_fu) < val (LEFT (periodo_w, 2)) .or. month (fun->rescis_fu) > val (LEFT (periodo_w, 2))
skip 1 <<<aqui e o proximo registro
loop <<<<< aqui dao o loop e vai para o final do while
ENDIF
ENDIF
IF year (fun->rescis_fu) < val (RIGHT (mesano, 4))
skip 1
loop
ENDIF
else
IF month (fun->admiss_fu) > val (LEFT (periodo_w, 2)) .and. year (fun->admiss_fu) = val (RIGHT (mesano, 4))
skip 1
loop
ENDIF
IF year (fun->admiss_fu) < val (RIGHT (mesano, 4))
IF month (fun->admiss_fu) <= val (LEFT (periodo_w, 2)) .or. month (fun->admiss_fu) >= val (LEFT (periodo_w, 2))
skip 1
loop
ENDIF
else
IF year (fun->admiss_fu) = val (RIGHT (mesano, 4))
IF month (fun->admiss_fu) < val (LEFT (periodo_w, 2))
skip 1
loop
ENDIF
ENDIF
ENDIF
ENDIF


espero não esta sendo bastante confuso na minha explição...

valeu galera,

fabio


Cavalcanti.fabio

Respostas

08/03/2006

Marco Salles

tirando o excesso de begin end que sua estrutura apresenta , tirando os testes que voce faz (isto é exclusivo de sua logica e de sua necessidade),
Fora isso o unico erro que eu vejo erro na sua estrutura é que o comando next , não pode depender especificamente de uma condição , sobre pena de ficar nun loop infinito

While not tblfuncionarios.eof do 
  begin
    if condicao then
       //faça algo
    else
       //faca outro algo
   tblfuncionarios.next;
  end;


geralmente é usado desta maneira , salvo situaçoes , aonde se tem que sair do loop , caso alguma condição seja satisfeita , ai nesse caso o Next pode ficar dentro de um text

Tipo isso

While not tblfuncionarios.eof do 
  begin
    if condicao then
       begin
         //faça algo
           tblfuncionarios.next
       end
    else
      begin
        //faca outro algo
        exit ; ou abort etc...
      end;
   end;


Ha , outro ero que vi , não sei se foi digitação , mas next sozinho , não compila no delphi.. No caso faltou o tblfuncionarios.next

Por mais é so:


Responder Citar

08/03/2006

Marco Salles

tirando o excesso de begin end que sua estrutura apresenta , tirando os testes que voce faz (isto é exclusivo de sua logica e de sua necessidade),
Fora isso o unico erro que eu vejo erro na sua estrutura é que o comando next , não pode depender especificamente de uma condição , sobre pena de ficar nun loop infinito

While not tblfuncionarios.eof do 
  begin
    if condicao then
       //faça algo
    else
       //faca outro algo
   tblfuncionarios.next;
  end;


geralmente é usado desta maneira , salvo situaçoes , aonde se tem que sair do loop , caso alguma condição seja satisfeita , ai nesse caso o Next pode ficar dentro de um text

Tipo isso

While not tblfuncionarios.eof do 
  begin
    if condicao then
       begin
         //faça algo
           tblfuncionarios.next
       end
    else
      begin
        //faca outro algo
        exit ; ou abort etc...
      end;
   end;


Ha , outro ero que vi , não sei se foi digitação , mas next sozinho , não compila no delphi.. No caso faltou o tblfuncionarios.next

Por mais é so:


Responder Citar

09/03/2006

Emerson

simplesmente respondendo a sua questão, o código deveria ficar mais ou menos assim:
while not tblfuncionarios.eof do 
begin 
  IF (tblFuncionarios.FieldByName(´causa__fu´).AsInteger <> 0)
   and (yyear(tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) =
        StrToInt(delphiRight(mesano,4)))
   and ( (ymonth(tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) < 
          StrToInt(delphiLeft(periodo_w,4))) or 
         (ymonth(.tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) > 
          StrToInt(delphiLeft(periodo_w,4)))
       ) then
  begin
    tblFuncionarios.Next;
    continue; <-- aqui continua o loop
  end 
  else 
  begin 
    ----- 
    ----- aqui o restante dos comando e buscas 
    ----- 
  end; 
end;


mas eu concordo com o Marco Salles: o next não deveria estar numa condição, sob pena de entrar num loop infinito. a versão que ilustra essa observação seria algo como:
while not tblfuncionarios.eof do 
begin 
  IF not ( (tblFuncionarios.FieldByName(´causa__fu´).AsInteger <> 0)
   and (yyear(tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) =
        StrToInt(delphiRight(mesano,4)))
   and ( (ymonth(tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) < 
          StrToInt(delphiLeft(periodo_w,4))) or 
         (ymonth(.tblFuncionarios.FieldByName(´admiss_fu´).AsDateTime) > 
          StrToInt(delphiLeft(periodo_w,4)))
       ) ) then
  begin
    ----- 
    ----- aqui o restante dos comando e buscas 
    ----- 
  end; 

  tblFuncionarios.Next;
end;



Responder Citar