Fórum Função Que Diga Se é Último Registro #370330
09/05/2009
0
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
Curtir tópico
+ 0Posts
09/05/2009
Marco Salles
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
10/05/2009
Discorpio
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
10/05/2009
Discorpio
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
10/05/2009
Marco Salles
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 >>>
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
10/05/2009
Discorpio
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
11/05/2009
Armindo
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)