Array
(
)

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

Cavalcanti.fabio
   - 08 mar 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


Marco Salles
   - 08 mar 2006

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

#Código

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

#Código
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:


Marco Salles
   - 08 mar 2006

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

#Código

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

#Código
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:


Emerson
   - 09 mar 2006

simplesmente respondendo a sua questão, o código deveria ficar mais ou menos assim:
#Código

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:
#Código
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;