Função Que Diga Se é Último Registro

Delphi

09/05/2009

Tenho que fazer um loop numa tabela e, dentro do loop, executar duas rotinas: uma se o ponteiro estiver no último registro e outra rotina se não. Faço assim:

ClientDataSet1.first;
While ClientDataSet1.eof do
if ClientDataSet1.RecNo = ClientDataSet1.RecordCount then
ShowMessage(´Último Registro´)
else
ShowMessage(´Não é último Registro´).

Gostaria de saber há alguma função (nativa) que retorne se o registro é o último ou não.
Dessa forma que detalhei acima funciona beleza, mas, por exemplo, se eu tiver que fazer essa mesma rotina em uma SQLQuery, já não daria, pois esta não suporta o RecorCount ou o RecNo.

Obrigado.


Armindo

Armindo

Curtidas 0

Respostas

Marco Salles

Marco Salles

09/05/2009

vc pode trocar o While pelo Until e usar um Marcador

Tipo isto

procedure TForm1.Button2Click(Sender: TObject);
var
fim:string;
begin
cds.Last;
fim:=SeuDataSet.FieldName(´ID´).AsString;
cds.First;
repeat
    executa a FuncaoA
    SeuDataSet.Next;
until fim = SeuDataSet.FieldName(´ID´).AsString ;
executa a FuncaoB
end;


Agora é claro que na situação especial aonde vc so tem um registro
A rotina acima vai exceutar a FuncaoA e tb a funcaoB .. Não fiz esta
correção , pq não sei , nesta situação especial , qual funcao que vc
quer que execute..

Pode aparecer ate uma funcao especifica do delphi ( eu particularmente)
não conheço. Mas fico na Torcida


GOSTEI 0
Discorpio

Discorpio

09/05/2009

Boa tarde Pessoal.

Eu utilizaria o Loop ´For´ dessa maneira.

  procedure TForm1.Button2Click(Sender: TObject);
  var I: Integer; 
  begin
      SeuDataSet.Last; 
      SeuDataSet.First; 
      for I := 0 to Pred(SeuDataSet.RecordCount) do
           ShowMessage(´Ainda não é o último registro´);
      ShowMessage(´Agora é o último registro´);
  end;


Agora perdoem a minha ignorância, eu gostaria de perguntar qual a finalidade de se fazer um loop em uma tabela para executar um rotina que não seja de pesquisa, filtro ou atualização :?:

Se for esse o caso, acredito que instruções SQL realizam filtros, pesquisas e atualizações bem mais rápidos.

Faço esta pergunta, por motivo de imaginar quando a sua tabela contiver 500.000 registros, logicamente a performance de seu aplicativo ficará comprometida


GOSTEI 0
Discorpio

Discorpio

09/05/2009

Olá, sou eu de novo.

Fazendo a correção do meu próprio código: esqueci o método Next, se não o Loop não sai do primeiro registro.

Eis:

    procedure TForm1.Button2Click(Sender: TObject); 
  var I: Integer; 
  begin 
      SeuDataSet.Last; 
      SeuDataSet.First; 
      for I := 0 to Pred(SeuDataSet.RecordCount) do
      begin 
           ShowMessage(´Ainda não é o último registro´);
           SeuDataSet.Next;
      end; 
      ShowMessage(´Agora é o último registro´); 
  end; 



GOSTEI 0
Marco Salles

Marco Salles

09/05/2009

 procedure TForm1.Button2Click(Sender: TObject); 
  var I: Integer; 
  begin 
      SeuDataSet.Last; 
      SeuDataSet.First; 
      for I := 0 to Pred(SeuDataSet.RecordCount) do 
      begin 
           ShowMessage(´Ainda não é o último registro´); 
           SeuDataSet.Next; 
      end; 
      ShowMessage(´Agora é o último registro´); 
  end; 


se puder usar o RecordCount , beleza >>>

se eu tiver que fazer essa mesma rotina em uma SQLQuery, já não daria, pois esta não suporta o [b:2623fc6545]RecorCount ou o RecNo[/b:2623fc6545].


eu acho que recordcount tem suport , se não tiver o proprio Sql pode
retrnar o numero de Registro sem problema.. O problema Maior
esta no RecNo


GOSTEI 0
Discorpio

Discorpio

09/05/2009

Boa noite a todos.

Com certeza os métodos RecordCount e RecNo estão presentes na Classe TDataSet que é a Classe Ancestral da maioria dos componentes que lêem tabelas, inclusive a Classe TClientDataSet.

Existe também presente na Classe TDataSet, os métodos boolenos ´Eof´ (End of File) que retorna verdadeiro se o ponteiro do registro estiver uma linha abaixo do útlimo registro, e o ´Bof´ (Begin of File) que retorna verdadeiro se o ponteiro do registro estiver uma linha acima do primeiro registro. Estas linhas abaixo e acima respectivamente são estruturas sem campo que apenas servem para delimitar o ínicio e o final da tabela.

Assim sendo, podemos também utilizar o código do nosso amigo Marcos Salles assim;

    procedure TForm1.Button2Click(Sender: TObject); 
    begin 
    SeuClientDataSet.First; 
    repeat 
          executa a FuncaoA 
          SeuClientDataSet.Next; 
    until SeuClientDataSet.Eof; 
    executa a FuncaoB 
end;


Ou se preferir usar o While do nosso amigo Armindo.

   procedure TForm1.Button2Click(Sender: TObject); 
   begin 
     SeuClientDataSet.First;
     while not SeuClientDataSet.Eof do
     begin
         executa a FuncaoA 
         SeuClientDataSet.Next; 
     end;
     executa a FuncaoB 
end;


Agora o que eu gostaria de saber é que FuncaoA esta que precisa ser executada toda vez que se varre a tabela, isto significa dizer que se a tabela contiver uns 500.000 registros, o loop fará a chamada da FuncaoA 500.000 vezes, o que pode comprometer o desepenho do seu aplicativo, provocando um processo demorado, a medida que vai inserindo registros.

Se esta FuncaoA for um filtro, pesquisa, ou até mesmo algum cálculo em todos os registros, sugiro utilizar instrução SQL, que é bem mais rápido.


GOSTEI 0
Armindo

Armindo

09/05/2009

Obrigado pelas contribuições.


GOSTEI 0
POSTAR