Função Que Diga Se é Último Registro
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.
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
Curtidas 0
Respostas
Marco Salles
09/05/2009
vc pode trocar o While pelo Until e usar um Marcador
Tipo isto
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
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
09/05/2009
Boa tarde Pessoal.
Eu utilizaria o Loop ´For´ dessa maneira.
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
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
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:
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
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
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;
Ou se preferir usar o While do nosso amigo Armindo.
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.
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
09/05/2009
Obrigado pelas contribuições.
GOSTEI 0