como retornar a quantidade de registros de uma tabela? (IB)
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 :)
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
Curtidas 0
Respostas
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.
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:
Assim, independente do número de registros da sua tabela, a performance da sua aplicação será boa.
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
02/02/2005
Evite usar o select *, isto pode lhe retornar as vezes até mesmo o -1 utilizando o RecordCount;
GOSTEI 0
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));
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
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);
bd.ibdataset1.SQL.Clear;
bd.ibdataset1.SQL.Add(´SELECT COUNT(*) FROM TABELA´);
bd.ibdataset1.open;
showmessage(bd.ibdataset1.fields[0].asstring);
GOSTEI 0
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
pq pelo dataset eu nao posso usar .SQL
pois no dataset nao existe essa propriedade neh?
:P
GOSTEI 0
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);
bd.ibdataset1.SelectSQL.Add(´SELECT COUNT(*) FROM TABELA´);
bd.ibdataset1.open;
showmessage(bd.ibdataset1.fields[0].asstring);
GOSTEI 0
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
02/02/2005
como assim FetchAll?
pra que serve e como usar?
pra que serve e como usar?
GOSTEI 0
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
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
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:
:wink:
GOSTEI 0
Vitoreduardo
02/02/2005
:D Gostaria de usar este código 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:
.
isso eu colocaria em baixo de post e no oncreate do form.
Se alguém puder me ajudar ficarei grato.
Jackell Alves
bd.ibdataset1.SQL.Clear; bd.ibdataset1.SQL.Add(´SELECT COUNT(*) FROM TABELA´); bd.ibdataset1.open; showmessage(bd.ibdataset1.fields[0].asstring);
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
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
02/02/2005
oq seria esse AS TotalRegistros?
:)
vc poderia me explicar? valeu :P
:)
vc poderia me explicar? valeu :P
GOSTEI 0
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
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
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
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
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
02/02/2005
Isabelct preciso do seu contato ...
favor enviar retorno foxvenda@hotmail.com
t+
Mano
GOSTEI 0
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;
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