Jump to content

numero de registros


lealdl
 Share

Recommended Posts

Boa noite!

Estou precisando retornar o número de registros de uma tabela "aluno", em um sistema.

Escrevi o seguinte código em um button, inseri uma query e um datasource:

No sql escrevi:

select conut(*) from aluno

Código:

			Query1.RecordCount;

				
			Label1.Caption:=IntToStr(Query1.RecordCount);			

Acontece que quando clico no botão, retorna apenas "1", sendo que tenho mais de 100 registros.

Em que estou errando?????

Grato,

Luciano

Edited by nunopicado
Adicionadas tags GeShi
Link to comment
Share on other sites

Isto é mais uma questão de SQL, mas...

O teu problema é que estás a misturar duas formas diferentes de fazer o que precisas.

Estás a usar a função de contagem de registos do SQL (Count) E a do Delphi (RecordCount).

Como a função Count do SQL é uma função de agrupamento, a tua query não te retorna todos os registos, mas sim apenas 1 registo com um campo numérico que te indica o total de registos.

Das duas, uma:

Ou usas a opção do SQL (recomendo a nível de performance, com uma query parecida à tua:

Query.SQL.Text := 'SELECT Count(*) AS Total FROM aluno';

Label1.Caption := Query.FieldByName('Total').AsString;

(O AS Total serve para teres o contador indicado com um nome de campo fácil de usares depois)

Ou usas a opção do Delphi:

Query.SQL.Text := 'SELECT * FROM aluno';

Label1.Caption := IntToStr(Query.RecordCount);

(não usando a função Code no SQL, a query retorna todos os registos, e assim a função RecordCount já te dá um valor correcto, embora à custa de performance, porque só precisas saber o total, e não todos os registos da tabela)

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

A propósito, mas esta questão, não precisas do componente datasource para nada.

Só precisarás dele se em vez de uma TLabel para mostrar o resultado, usares uma TDBLabel.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Muito obrigado, amigos portugueses! Fiz como me indicaram e agora deu certinho. Fico muito agradecido mesmo.

Um grande abraço a todos!

Permita-me abusar um pouco...

aproveitando a mesma questão, em meu cadastro, tenho alunos matriculados nas turmas 1, 2, 3 4 5. Com uma query consigo buscar quais alunos estão em cada uma delas.

E se eu quiser saber quantos alunos estão matriculados em uma determinada turma, como faço?

o código para a busca de turmas é o seguinte... Código:

                                        
			Query1.Close;
			Query1.SQL.Clear;
			Query1.SQL.Add('select * from aluno where turma =:turma');
			Query1.ParamByName('turma').AsInteger := StrToInt(Edit1.TExt);
			fconsulta_turma.Query1.Open;
			edit1.Clear;
			edit1.SetFocus;			

Como faço para "juntar o código e me retornar o número de alunos da turma 1 por exemplo?

Boa noite e me desculpem pelo abuso!!!

Luciano

Edited by nunopicado
Link to comment
Share on other sites

Mais uma de SQL...

SELECT Count(*) AS TotalTurma FROM Aluno WHERE Turma = :Turma

Depois usas o campo TotalTurma para saber o resultado. 😉

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

Mais uma de SQL...

SELECT Count(*) AS TotalTurma FROM Aluno WHERE Turma = :Turma

Depois usas o campo TotalTurma para saber o resultado. 😉

Desculpe-me, mas essa vez eu não entendi...

Coloco junto com a minha outra query ou insiro uma nova query.

*** Noto que à medida que vou aprendendo, surgem cada vez mais dúvidas!

Se puder me explicar passo a passo (explicar, não peço pra fazer pra mim, deixando bem claro). A ajuda de vcs está servindo pra construir uma boa base.

Grato

Link to comment
Share on other sites

Por trás de uma resposta, há sempre duas dúvidas!

😉

Podes usar uma segunda query só para saber isso, ou podes usar uma subquery para a tua (embora como todas as subqueries, isto tenha custos de performance.

Por exemplo, pegando na tua query:

                                        
               Query1.Close;
               Query1.SQL.Clear;

               Query1.SQL.Add('select *, (select Count(*) from aluno where turma = :turma) AS TotalTurma from aluno where turma =:turma');

               Query1.ParamByName('turma').AsInteger := StrToInt(Edit1.TExt);
               fconsulta_turma.Query1.Open;
               edit1.Clear;
               edit1.SetFocus;            

Isto irá dar-te um campo extra em todas as linhas da query com indicação do total. Mas claro, vai repetir a mesma informação em todas as linhas, e vai-te custar em performance.

Por mim, achava preferível executares uma query à parte, como indiquei no post anterior, de cada vez quer precisares saber o número de alunos de uma turma.

Podes ainda executar uma query que te devolve o total de cada turma, e depois pesquisares os dados que precisas:

SELECT Turma, Count(*) AS TotalTurma
  FROM aluno
WHERE Turma = :Turma
GROUP BY Turma
ORDER BY Turma;

Esta vai dar-te alguma coisa como isto

|--------------------|--------------------|
|       Turma        |     TotalTurma     |
|--------------------|--------------------|
|         1          |         12         |
|         2          |         11         |       
|         3          |         16         |
|         4          |         13         |
|         5          |         15         |  
|--------------------|--------------------|

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Link to comment
Share on other sites

😉

Podes usar uma segunda query só para saber isso, ou podes usar uma subquery para a tua (embora como todas as subqueries, isto tenha custos de performance.

Por exemplo, pegando na tua query:

                                        
               Query1.Close;
               Query1.SQL.Clear;

               Query1.SQL.Add('select *, (select Count(*) from aluno where turma = :turma) AS TotalTurma from aluno where turma =:turma');

               Query1.ParamByName('turma').AsInteger := StrToInt(Edit1.TExt);
               fconsulta_turma.Query1.Open;
               edit1.Clear;
               edit1.SetFocus;            

Isto irá dar-te um campo extra em todas as linhas da query com indicação do total. Mas claro, vai repetir a mesma informação em todas as linhas, e vai-te custar em performance.

Por mim, achava preferível executares uma query à parte, como indiquei no post anterior, de cada vez quer precisares saber o número de alunos de uma turma.

Podes ainda executar uma query que te devolve o total de cada turma, e depois pesquisares os dados que precisas:

SELECT Turma, Count(*) AS TotalTurma
  FROM aluno
WHERE Turma = :Turma
GROUP BY Turma
ORDER BY Turma;

Esta vai dar-te alguma coisa como isto

|--------------------|--------------------|
| Turma | TotalTurma |
|--------------------|--------------------|
| 1 | 12 |
| 2 | 11 |
| 3 | 16 |
| 4 | 13 |
| 5 | 15 |
|--------------------|--------------------|

Acabei de testar, nunopicado! Usei a última dica, achei mais conveniente e consegui entender melhor. Adicionei um label, para evitar redundância de dados, ficou assim:

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from aluno where turma =:turma');
Query1.ParamByName('turma').AsInteger := StrToInt(Edit1.TExt);
fconsulta_turma.Query1.Open;
edit1.Clear;
edit1.SetFocus;

Label1.Caption := Query2.FieldByName('TotalTurma').DisplayText;

No SQL:

SELECT Turma, COUNT(*) AS TotalTurma
FROM aluno
WHERE Turma = :Turma
GROUP BY Turma
ORDER BY Turma;

Quando faço a pesquisa, retorna exatamente o que eu preciso.

Mais uma vez agradeço, começo a entender mais com suas explicações!

Abraços,

Luciano

Edited by nunopicado
GeShi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.