Fórum RecordCount no StatusBar #325748

21/07/2006

0

Olá pessoal, tudo bem? Espero que sim.

No Software que to desenvolvendo, em todos forms de casdastro e visualização de registros eu coloco um StatusBar com o texto:

´Nº de Registros Listados: X´

e boto junto um RecordCount, pra listar todos registros da tabela e informar quantos registros tem.

Bom, mas nesse form que fiz agora, eu coloquei uma ´Pesquisa Rápida´. Como serão muitos registros, essa pesquisa serve pra achar um rapidamente pra ser usado.

Então fiz a mesma coisa, com o mesmo intuito de listar os dados exibidos. Cada vez que se pesquisa alguma coisa, ele atualiza o número de registros de acordo com a pesquisa, sempre mostrando quantos estao sendo listados e nao o total da tabela.

Mas agora me surgiu uma idéia que gostar de implementar. Gostaria de ter um texto assim no StatusBar:

´Nº de Registros Listados: X de Y´.

Ou seja, gostaria que ele continuasse me mostrando quantos registros tem ao total na tabela, no lugar do Y, e no lugar do X, quantos registros estao sendo mostrados no momento.

Mas se eu uso o RecordCount no ClientDataSet, ele vai me listar quantos ele pesquisou e não o total. Tem como eu listar desse jeito? Pegando o total da tabela e o total de registros mostrados?

Grato pela ajuda. :D


Aersoftware

Aersoftware

Responder

Posts

21/07/2006

Paullsoftware

você pode ter um CDS auxiliar que efetua a pesquisa, e guardar em uma variavel o numero total de registros existentes na tabela tipo..


var
TR : Integer;
begin
with cdsAuxiliar do
 begin
  Close;
  CommandText := ´´;
  CommandText := ´Select Count(*) as TotalRegistros from Tabela´;
  Open;
  TR                   := FieldByName(´TotalRegistros´).AsInteger; 
  Close;
 end;
// e para pesquisar somente um exemplo:
with cdsCadastro do
 begin
  Close;
  CommandText := ´´;
  CommandText := ´Select * from Tabela where Upper(Nome) like :pNome´;
  Params.ParamByName(´pNome´).AsString := Edit1.Text + ´¬´;
  Open;
 end;
StatusBar.Panels[3].Text := ´Registros Encontrados: ´ + IntToStr(cdsCadastro.RecordCount) ´ + ´ de ´ + IntToStr(tr);
espero ter ajudado :wink:


Responder

Gostei + 0

21/07/2006

Aersoftware

Hmmm.. entendi.. eu nunca tinha pensando em usar um CDS auxiliar pra isso.. hehe.. pensei q pudesse ser feito com o mesmo. Mas é uma boa sugestão.. valeu..


Responder

Gostei + 0

21/07/2006

Paullsoftware

Eu como uso FireBird normalmente faço isso com uma ´View´ chamo ela sempre que preciso, para ter que tá criando instruções aqui e ali, simplesmente chamo ela e pronto...


Responder

Gostei + 0

21/07/2006

Aersoftware

Como assim uma View? Tb uso Firebird.


Responder

Gostei + 0

21/07/2006

Paullsoftware

Como assim uma View? Tb uso Firebird.


Mais ou menos assim:

CREATE VIEW TITULOS(TOTAL)
AS
select COUNT(*) AS TOTAL from ACERVO
where CODIGO>0;

isso no próprio banco, e para usar faço:


cdsTotalAcervo.Open;
VarTotal := cdsTotalAcervo.FieldByName(Total).AsInteger;
cdsTotalAcervo.Close;

Label1.Caption := IntToStr(VarTotal);


deu pra entender? :lol:


Responder

Gostei + 0

21/07/2006

Aersoftware

Mais ou menos.. hehe.. mas eu pensei numa coisa, se funcionar eu posto aqui.. valeu cara.. abraços..


Responder

Gostei + 0

21/07/2006

Aersoftware

Olha, fiz uma gambiarra aqui e funcionou.. hehe.. só nao sei se vai perder performance, pra isso gostaria da ajuda de quem puder.

Criei uma variável universal do tipo inteiro e o seguinte procedimento pra jogar o número de registros dentro dela:

procedure TFrmVerTitulosNacionais.TotalRegistros;
begin
  DmDados.ClientTitulosNacionais.Close;
    With DmDados.SqlTitulosNacionais do
      begin
        close;
        CommandText :=
        ´Select * From TB_TITULOS_NACIONAIS´;
        open;
      end;
    DmDados.ClientTitulosNacionais.Open;
    TotalRegistrosTabela := DmDados.ClientTitulosNacionais.RecordCount;

end;


Aí, em todo código onde eu chamo a entrada pro StatusBar, eu coloquei, primeiro a chamada pra essa procedure, depois a pesquisa a ser feita e depois a entrada pro StatusBar, que ficou assim um exemplo:

procedure TFrmVerTitulosNacionais.EdtPesquisarTituloChange(Sender: TObject);
begin
  if (EdtPesquisarTitulo.Text <> ´´) and (LkUpPesquisarEditoraOriginal.Text = ´´) and (LkUpPesquisarEditoraNacional.Text = ´´) then
    begin
      [b]TotalRegistros;[/b]
      DmDados.ClientTitulosNacionais.Close;
      With DmDados.SqlTitulosNacionais do
        begin
          close;
          CommandText :=
            ´Select * From TB_TITULOS_NACIONAIS where upper(NOME_TITULO_NACIONAL) like ´
            + AnsiUpperCase(QuotedStr(EdtPesquisarTitulo.Text+´¬´))
            + ´Order by NOME_SERIE_TITULO_NACIONAL´;
          open;
        end;
      DmDados.ClientTitulosNacionais.Open;
      [b]StbTitulosNacionais.Panels[0].Text := ´Total de Títulos Nacionais: ´+ IntToStr(DmDados.ClientTitulosNacionais.RecordCount)+ ´ de ´+ IntToStr(TotalRegistrosTabela);[/b]
    end
  else if (EdtPesquisarTitulo.Text = ´´) and (LkUpPesquisarEditoraOriginal.Text = ´´) and (LkUpPesquisarEditoraNacional.Text = ´´) then
    begin
      [b]TotalRegistros;[/b]
      DmDados.ClientTitulosNacionais.Close;
      With DmDados.SqlTitulosNacionais do
        begin
          close;
          CommandText :=
            ´Select * From TB_TITULOS_NACIONAIS where upper(NOME_TITULO_NACIONAL) like ´
            + AnsiUpperCase(QuotedStr(EdtPesquisarTitulo.Text+´¬´))
            + ´Order by NOME_SERIE_TITULO_NACIONAL´;
          open;
        end;
      DmDados.ClientTitulosNacionais.Open;
      StbTitulosNacionais.Panels[0].Text := ´Total de Títulos Nacionais: ´+ IntToStr(DmDados.ClientTitulosNacionais.RecordCount)+ ´ de ´+ IntToStr(TotalRegistrosTabela);
  end;



Responder

Gostei + 0

21/07/2006

Aersoftware

Olha, fiz uma gambiarra aqui e funcionou.. hehe.. só nao sei se vai perder performance, pra isso gostaria da ajuda de quem puder.

Criei uma variável universal do tipo inteiro e o seguinte procedimento pra jogar o número de registros dentro dela:

procedure TFrmVerTitulosNacionais.TotalRegistros; begin DmDados.ClientTitulosNacionais.Close; With DmDados.SqlTitulosNacionais do begin close; CommandText := ´Select * From TB_TITULOS_NACIONAIS´; open; end; DmDados.ClientTitulosNacionais.Open; TotalRegistrosTabela := DmDados.ClientTitulosNacionais.RecordCount; end;


Aí, em todo código onde eu chamo a entrada pro StatusBar, eu coloquei, primeiro a chamada pra essa procedure, depois a pesquisa a ser feita e depois a entrada pro StatusBar, que ficou assim um exemplo:

procedure TFrmVerTitulosNacionais.EdtPesquisarTituloChange(Sender: TObject); begin if (EdtPesquisarTitulo.Text <> ´´) and (LkUpPesquisarEditoraOriginal.Text = ´´) and (LkUpPesquisarEditoraNacional.Text = ´´) then begin [b:9ceeba2103]TotalRegistros;[/b:9ceeba2103] DmDados.ClientTitulosNacionais.Close; With DmDados.SqlTitulosNacionais do begin close; CommandText := ´Select * From TB_TITULOS_NACIONAIS where upper(NOME_TITULO_NACIONAL) like ´ + AnsiUpperCase(QuotedStr(EdtPesquisarTitulo.Text+´¬´)) + ´Order by NOME_SERIE_TITULO_NACIONAL´; open; end; DmDados.ClientTitulosNacionais.Open; [b:9ceeba2103]StbTitulosNacionais.Panels[0].Text := ´Total de Títulos Nacionais: ´+ IntToStr(DmDados.ClientTitulosNacionais.RecordCount)+ ´ de ´+ IntToStr(TotalRegistrosTabela);[/b:9ceeba2103] end else if (EdtPesquisarTitulo.Text = ´´) and (LkUpPesquisarEditoraOriginal.Text = ´´) and (LkUpPesquisarEditoraNacional.Text = ´´) then begin [b:9ceeba2103]TotalRegistros;[/b:9ceeba2103] DmDados.ClientTitulosNacionais.Close; With DmDados.SqlTitulosNacionais do begin close; CommandText := ´Select * From TB_TITULOS_NACIONAIS where upper(NOME_TITULO_NACIONAL) like ´ + AnsiUpperCase(QuotedStr(EdtPesquisarTitulo.Text+´¬´)) + ´Order by NOME_SERIE_TITULO_NACIONAL´; open; end; DmDados.ClientTitulosNacionais.Open; [b:9ceeba2103]StbTitulosNacionais.Panels[0].Text := ´Total de Títulos Nacionais: ´+ IntToStr(DmDados.ClientTitulosNacionais.RecordCount)+ ´ de ´+ IntToStr(TotalRegistrosTabela);[/b:9ceeba2103] end;


Como eu disse, funcionou perfeitamente. Mas teste só com 57 registros. Acredito que esta tabela não terá muuuitos registros.. talvez de 500 a 1.000. Isso q eu fiz traria uma perda de performance nessa pesquisa?


Responder

Gostei + 0

22/07/2006

Paullsoftware

Crie essa procedure:

Function TotalRegistro(aCDS:TClientDataSet;aTabela:String):Integer;
begin
result := 0;
with aCds do
 begin
   close;
   commandText := ´´;
   commandText := ´Select Count(*) as Total from ´+UpperCase(Tabela);
   open;
 end;
result := aCds.FieldByName(´Total´).AsInteger;
end;

modo de usar...
StatusBar.Panels[0].Text := ´Total de Registros: ´+ IntToStr(TotalRegistro(ClientDataSet1,´Clientes´));

espero ter ajudado... :wink:


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar