lealdl Posted April 13, 2015 at 02:37 AM Report Share #581108 Posted April 13, 2015 at 02:37 AM (edited) 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 April 13, 2015 at 08:43 AM by nunopicado Adicionadas tags GeShi Link to comment Share on other sites More sharing options...
nunopicado Posted April 13, 2015 at 07:28 AM Report Share #581110 Posted April 13, 2015 at 07:28 AM (edited) 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 April 13, 2015 at 07:40 AM 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 More sharing options...
nunopicado Posted April 13, 2015 at 07:43 AM Report Share #581111 Posted April 13, 2015 at 07:43 AM 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 More sharing options...
lealdl Posted April 14, 2015 at 02:27 AM Author Report Share #581181 Posted April 14, 2015 at 02:27 AM 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. Muito obrigado, amigos portugueses! Fiz como me indicaram e agora deu certinho. Fico muito agradecido mesmo. Um grande abraço a todos! Link to comment Share on other sites More sharing options...
lealdl Posted April 14, 2015 at 03:34 AM Author Report Share #581183 Posted April 14, 2015 at 03:34 AM (edited) 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 April 14, 2015 at 10:02 PM by nunopicado Link to comment Share on other sites More sharing options...
nunopicado Posted April 14, 2015 at 07:16 AM Report Share #581184 Posted April 14, 2015 at 07:16 AM 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 More sharing options...
lealdl Posted April 14, 2015 at 07:02 PM Author Report Share #581243 Posted April 14, 2015 at 07:02 PM 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 More sharing options...
nunopicado Posted April 14, 2015 at 10:18 PM Report Share #581258 Posted April 14, 2015 at 10:18 PM 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 More sharing options...
lealdl Posted April 15, 2015 at 12:07 AM Author Report Share #581261 Posted April 15, 2015 at 12:07 AM (edited) 😉 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 April 15, 2015 at 12:13 AM by nunopicado GeShi Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now