como retornar a quantidade de registros de uma tabela? (IB)

Firebird

02/02/2005

como retornar a quantidade de registros de uma tabela?

queria saber como faço pra meu IBdataset retornar a quantidade de registros de uma tabela... tentei usar recordcount mais ele responde sempre 0 ou 1... sendo q tem mais de 8 registros

showmessage(intTostr(bd.ibdataset1.recordcount));

no selectsql da minha table... tem la... selec * from tabela

alguem ae sabe oq tah errado ou oq fazer?[

valeu :)


Salsa

Salsa

Curtidas 0

Respostas

Isabelct

Isabelct

02/02/2005

Isso ocorre porque a query só tras para a estação os registros que necessita, por isso que exibe apenas 0 ou 1.

Uma alternativa para isso seria você forçar que todos os registros sejam trazidos para a estação, movendo a query para o último registro.

bd.ibdataset1.last;
showmessage(intTostr(bd.ibdataset1.recordcount)); 


Mas isso não fica muito elegante, porque se a sua tabela tiver muitos registros, o comando bd.ibdataset1.last pode demorar algum tempo. A melhor alternativa para o seu caso seria você contar os registros diretamente por uma instrução SQL. Assim:

bd.ibdataset1.SQL.Add(´SELECT COUNT(*) FROM TABELA´);
bd.ibdataset1.open;
showmessage(intTostr(bd.ibdataset1.recordcount)); 


Assim, independente do número de registros da sua tabela, a performance da sua aplicação será boa.


GOSTEI 0
Marcio.theis

Marcio.theis

02/02/2005

Evite usar o select *, isto pode lhe retornar as vezes até mesmo o -1 utilizando o RecordCount;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

02/02/2005

corrigindo uma coisinha...

o correto seria:

bd.ibdataset1.SQL.Clear;
bd.ibdataset1.SQL.Add(´SELECT COUNT(*) FROM TABELA´);
bd.ibdataset1.open;
showmessage(intTostr(bd.ibdataset1.fields[0].asinteger));


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

02/02/2005

ou simplesmente:


bd.ibdataset1.SQL.Clear;
bd.ibdataset1.SQL.Add(´SELECT COUNT(*) FROM TABELA´);
bd.ibdataset1.open;
showmessage(bd.ibdataset1.fields[0].asstring);


GOSTEI 0
Salsa

Salsa

02/02/2005

no caso isso ae seria usando um Query neh...
pq pelo dataset eu nao posso usar .SQL
pois no dataset nao existe essa propriedade neh?

:P


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

02/02/2005

bd.ibdataset1.SelectSQL.Clear;
bd.ibdataset1.SelectSQL.Add(´SELECT COUNT(*) FROM TABELA´);
bd.ibdataset1.open;
showmessage(bd.ibdataset1.fields[0].asstring);


GOSTEI 0
Rodolpho123

Rodolpho123

02/02/2005

Depois de aberto o seu DataSet, use o método FetchAll. Vai funcionar do jeitonho que vc quer...


GOSTEI 0
Salsa

Salsa

02/02/2005

como assim FetchAll?
pra que serve e como usar?


GOSTEI 0
Rodolpho123

Rodolpho123

02/02/2005

como assim FetchAll? pra que serve e como usar?


IBDataSet1.FetchAll

O método FetchAll funciona assim: Quando vc faz um SELECT * FROM TABELA, a maioria dos BD´s relacionais (ex: FB/IB), para otimizarem o tráfego de registros na rede, não trazem todos os registros do seu SELECT. Então, a cada medida que vc vai, digamos assim, ´visitando´ o registro, ele vai trazendo-os à medida que vc for chamando (Next ou Last). o FetchAll, traz todos os registros e os armazena em um buffer local. Então, depois que vc abrir o seu DataSet, se vc usar o FecthAll e depois der um RecordCount, vc terá todos os registros do seu SELECT.


GOSTEI 0
Gandalf.nho

Gandalf.nho

02/02/2005

Embora o método de usar SELECT COUNT(*) seja mais usual, já que o uso de FetchAll num ambiente cliente/servidor não é recomendado.


GOSTEI 0
Salsa

Salsa

02/02/2005

ah entendi .. eh q tipo .. to tentando aprender firebird na raça.... tava mais acostumado a trabalhar com mysql e tal e fazia umas coisas de um modo mais facil.. e sem comandos e etc q existem no firebird.. valeu pessoal :P

:wink:


GOSTEI 0
Vitoreduardo

Vitoreduardo

02/02/2005

:D Gostaria de usar este código
bd.ibdataset1.SQL.Clear; 
bd.ibdataset1.SQL.Add(´SELECT COUNT(*) FROM TABELA´); 
bd.ibdataset1.open; 
showmessage(bd.ibdataset1.fields[0].asstring);
Claro q aqui eu adaptei as minhas necessidade, porei ele esta me retornado o seguinte erro(´IBQRClientes: Field ´Codigo´ not found´).

Estou usando os componentes da paleta InterBase.
E estou usando IBQuery.

Só q eu não quero q apareça um showmessage, eu tenho um Label no form e gostaria que a este label recebesse a quantidade de registro.

Não sei se fui claro, mais no paradox eu faria assim:
.
Label1.caption:=inttostr(Dbgrid1.DataSource.DataSet.RecordCount);


isso eu colocaria em baixo de post e no oncreate do form.

Se alguém puder me ajudar ficarei grato.

Jackell Alves


GOSTEI 0
Gandalf.nho

Gandalf.nho

02/02/2005

Faça assim:
bd.ibdataset1.SQL.Clear; 
bd.ibdataset1.SQL.Add(´SELECT COUNT(*) AS TotalRegistros FROM TABELA´); 
bd.ibdataset1.open; 
Label1.caption := bd.ibdataset1TotalRegistros.AsString;



GOSTEI 0
Salsa

Salsa

02/02/2005

oq seria esse AS TotalRegistros?

:)

vc poderia me explicar? valeu :P


GOSTEI 0
Renato_sp

Renato_sp

02/02/2005

Amigo o As seria para dar um Apelido para uma coluna

no codigo SELECT COUNT(*) AS TotalRegistros

Estou falando que a contagem (count) vai se chamar TotalRegistros, se vc colocar isso no dataset qualquer, uma query por exemplo e ativar ela, e ir no add fields ao adicionar o campo vai aparecer TotalRegistros e nao Count como seria se nao tivesse dado um apelido a ela


Espero que tenha entendido
Renato / SP


GOSTEI 0
Vitoreduardo

Vitoreduardo

02/02/2005

:D Olá gandalf.nho

Fiz o q vc disse mais continua dando o mesmo erro.

(Codigo not fond).
Quando eu abro o form

Jackell Alves


GOSTEI 0
Gandalf.nho

Gandalf.nho

02/02/2005

:D Olá gandalf.nho Fiz o q vc disse mais continua dando o mesmo erro. (Codigo not fond). Quando eu abro o form Jackell Alves


Os campos no IBDataSet são criados em design-time? Se sim, remova-os e recrie-os novamente. Se não, faça uma pequena alteração na última linha do código que te passei, use:

Label1.caption := bd.ibdataset1.FieldByName.(´TotalRegistros´).AsString



GOSTEI 0
Manoel

Manoel

02/02/2005

Isabelct    preciso do seu contato ...    favor enviar retorno foxvenda@hotmail.com   t+ Mano
GOSTEI 0
Vicente Santos

Vicente Santos

02/02/2005

SELECT RDB$RELATIONS.RDB$RELATION_NAME,
CASE
WHEN RDB$INDICES.RDB$STATISTICS = 0 THEN 0
ELSE CAST(1 / RDB$INDICES.RDB$STATISTICS AS INTEGER)
END
FROM RDB$RELATIONS
LEFT JOIN RDB$RELATION_CONSTRAINTS
ON RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME
AND RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
LEFT JOIN RDB$INDICES
ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME
WHERE RDB$VIEW_BLR IS NULL AND RDB$RELATION_ID >= 128
ORDER BY 1;
GOSTEI 0
POSTAR