Somar Tabels com condicionais

Delphi

29/01/2014

Olá pessoal.


Tenho essa SQL abaixo.
Ele está filtrando de uma tabela, uma referida classe (bimestre, série e ano Letivo), selecionada pelos campos Combo.
Até aqui, está rodando beleza.

Como faço para somar os registros pertinentes à essa classe e mostrar em um Edit.
Não quero somar valores de registros e sim saber quantos registros (alunos) existem nesse bimestre, série e ano letivo)
A função SUM, não serve, pois soma valores de uma tabela inteira e apresenta um total.
No caso aqui, preciso saber quantos alunos (registros) tem em uma sala de aula, de acordo com o bimestre, série e ano letivo e se está ativo ('S') = x4 do ParambyName

Podem ajudar??
Desde já agradeço

Abaixo a SQL faltando esse pedaço (da soma de registros)

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Select nome_aluno, num_aluno, ano_letivo, serie, bimestre, ativo_sn from JU_CadAlunos where bimestre=:x1 and serie=:x2 and ano_letivo=:x3 and ativo_sn=:x4');
Query1.ParamByName('x1').AsString:=ComboBimestre.Text;
Query1.ParamByName('x2').AsString:=ComboSerie.Text;
Query1.ParamByName('x3').AsString:=ComboAnoLetivo.Text;
Query1.ParamByName('x4').AsString:='S';
Query1.Open;
Panel7.Caption:='Classe encontrada, selecione um registro, adicione as notas e clique em "Editar".';
Panel7.Refresh;

Alexandre

Alexandre

Curtidas 0

Respostas

Douglas

Douglas

29/01/2014

Alexandre você pode utilizar o "COUNT", onde você vai saber a quantidade de registros daquele aluno.
GOSTEI 0
Douglas

Douglas

29/01/2014

Acrescentando. O seu código ficaria da seguinte forma abaixo:


Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('Select Count(num_aluno) as Qtde_Aluno from JU_CadAlunos where bimestre=:x1 and serie=:x2 and ano_letivo=:x3 and ativo_sn=:x4');
Query1.ParamByName('x1').AsString:=ComboBimestre.Text;
Query1.ParamByName('x2').AsString:=ComboSerie.Text;
Query1.ParamByName('x3').AsString:=ComboAnoLetivo.Text;
Query1.ParamByName('x4').AsString:='S';
Query1.Open;

GOSTEI 0
Alexandre

Alexandre

29/01/2014

Olá amigo.
Te agradeço a resposta.

Fiz como seu exemplo.
Só que 3 registros na tabela... 2 com ativo='S' e 1registro com ativo='N'

No edit deveria dar 2 e não 1 como está dando.

Pode dar uma ajuda?

Seque a SQL

Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('Select Count(num_aluno) as Qtde_Aluno, ano_letivo, serie, bimestre, ativo_sn from JU_CadAlunos where bimestre=:y1 and serie=:y2 and ano_letivo=:y3 and ativo_sn=:y4');
Query2.ParamByName('y1').AsString:=ComboBimestre.Text;
Query2.ParamByName('y2').AsString:=ComboSerie.Text;
Query2.ParamByName('y3').AsString:=ComboAnoLetivo.Text;
Query2.ParamByName('y4').AsString:='S';
Query1.Open;
EdNalunos.Text:=inttostr(Query2.SQL.Add('count'));
GOSTEI 0
Douglas

Douglas

29/01/2014

Alexandre, após open na query, filtre o resultado da seguinte forma abaixo:

  EdNalunos.Text :=  Query2.FieldByName('Qtde_Aluno').AsString;


OBS: Não foi utilizando o campo "num_aluno" no fieldbyname, pois utilizando a função count você tem que apelidar o campo
de sua tabela, senão fica "No Column Name".

Aguardo o seu feedback.
GOSTEI 0
Alexandre

Alexandre

29/01/2014

Olá Douglas Claudio
Bom dia...

Desculpe, mas não entendi o que vc fez.
Como assim? apelidar o campo?
Pode esclarecer, pois estou engatinhando ainda nisso.

Como ficaria a síntaxe completa?
Não entendi essa linha >>>>>> EdNalunos.Text := Query2.FieldByName('Qtde_Aluno').AsString;
De onde veio esse campo "Qtde_Aluno"?? Ele não existe na tabela e não saquei como vc apelidou isso.

Ficou assim...mas está reclamando que esse campo Qtde alunos não existe.
Se puder passar a sintaxe completa, pois realmente não entendi.

Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('Select Count(num_aluno) as Qtde_Aluno from JU_CadAlunos where bimestre=:y1 and serie=:y2 and ano_letivo=:y3 and ativo_sn=:y4');
Query2.ParamByName('y1').AsString:=ComboBimestre.Text;
Query2.ParamByName('y2').AsString:=ComboSerie.Text;
Query2.ParamByName('y3').AsString:=ComboAnoLetivo.Text;
Query2.ParamByName('y4').AsString:='S';
Query1.Open;
EdNalunos.Text:=Query2.FieldByName('Qtde_Aluno').AsString;

Agradeço as respostas.
Um excelente dia para vc.
GOSTEI 0
Douglas

Douglas

29/01/2014

Boa tarde Amigo, vamos lá..
Quando utilizei a expressão "Apelidar", eu quis dizer de dar um novo nome a sua coluna da tabela, pois se você
colocar a função count desta forma -> COUNT(num_Aluno), quando você rodar for rodar select, vai aparecer "No Column Name".
Por isto eu coloquei -> Count(num_Aluno) as Qtde_Aluno. Para você ter uma ideia melhor, pegue o seu select e execute no
seu banco de dados das duas formas.

No post anterior você tinha colocado o seguinte código abaixo:

Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('Select Count(num_aluno) as Qtde_Aluno, ano_letivo, serie, bimestre, ativo_sn from JU_CadAlunos where bimestre=:y1 and serie=:y2 and ano_letivo=:y3 and ativo_sn=:y4');
Query2.ParamByName('y1').AsString:=ComboBimestre.Text;
Query2.ParamByName('y2').AsString:=ComboSerie.Text;
Query2.ParamByName('y3').AsString:=ComboAnoLetivo.Text;
Query2.ParamByName('y4').AsString:='S';
Query1.Open;
EdNalunos.Text:=inttostr(Query2.SQL.Add('count'));


Foi da dúvida que você me passou que peguei o campo EdNalunos.text.
O campo Qtde_Aluno, vem do apelido que você deu na sua tabela, daí basta você filtrar o campo da sua Query, com
o nome "Qtde_Aluno". Quando você for filtrar este campo, passe o nome da sua query, fieldbyname é campo que você
quer filtrar no seu select e no final o valor se é do tipo AsString, AsInteger e etc.

A partir daí, pedi para você estruturar o seu código da seguinte forma abaixo:


Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('Select Count(num_aluno) as Qtde_Aluno from JU_CadAlunos where bimestre=:y1 and serie=:y2 and ano_letivo=:y3 and ativo_sn=:y4');
Query2.ParamByName('y1').AsString:=ComboBimestre.Text;
Query2.ParamByName('y2').AsString:=ComboSerie.Text;
Query2.ParamByName('y3').AsString:=ComboAnoLetivo.Text;
Query2.ParamByName('y4').AsString:='S';
Query2.Open;
EdNalunos.Text:=Query2.FieldByName('Qtde_Aluno').AsString;



O que vai acontecer é o seguinte, no Open da Query o seu select vai executar, após isto, você filtra
o resultado passando para o EdNalunos.Text conforme o código acima. O código que você postou não funcionou, porque
no Open da query esta com o nome diferente das demais. Faça esta Observação no seu código.


Espero que tenha ficado claro, mas foi uma rápida explicação. Você precisa buscar mais conceitos com uso
de query e banco de dados.
GOSTEI 0
Alexandre

Alexandre

29/01/2014

Olá Douglas Claudio

Eram duas Querys na verdade.
Uma conta o número de alunos com ativo="S"

A outra, soma os valores contidos em um campo média.
O campo media estava como char
Ao alterar para float, ocorreu um problema estranho.
Alguns outros campos que eram char, passaram para float sozinho.

Isso ocorreu, depois que meu IBerXPERT venceu e tive que instalar outro.
Antes nao dava esse pau.

Como tenho + duas máquinas com a mesma coisa (backup) t[a dando o mesmo erro no Firebird quando edita-se com o IBexpert.

Não há vírus algum.

Mas que coisa...
Te agradeço a ajuda.


GOSTEI 0
Douglas

Douglas

29/01/2014

Olá Douglas Claudio

Eram duas Querys na verdade.
Uma conta o número de alunos com ativo="S"

A outra, soma os valores contidos em um campo média.
O campo media estava como char
Ao alterar para float, ocorreu um problema estranho.
Alguns outros campos que eram char, passaram para float sozinho.

Isso ocorreu, depois que meu IBerXPERT venceu e tive que instalar outro.
Antes nao dava esse pau.

Como tenho + duas máquinas com a mesma coisa (backup) t[a dando o mesmo erro no Firebird quando edita-se com o IBexpert.

Não há vírus algum.

Mas que coisa...
Te agradeço a ajuda.




Entendo Alexendre, mas de qualquer forma o Open tinha que ser na segunda Query.
Bem vamos por parte, você conseguiu executar a segunda Query e exibir o resultado?
GOSTEI 0
Alexandre

Alexandre

29/01/2014

Olá Douglas Claudio
Agradeço a resposta.

Consegui contar quantos registros tem a tabela.
Agora somar os registros é que está um problema.

O campo media estava como char e tentei mudar para float. (senão dá pau mesmo)
Para minha surpresa, alguns outros campos, que nada tem a ver, passaram de char para float também, sem
que eu tenha editado esse "outros" campos da tabela com o IBexpert.

Formatei o PC, e instalei novamente o Firebird 2.0 que sempre usei sem problemas e o IBexpert (esse tive que baixar um novo
porque o meu tinha vencido) Ai os problemas começaram.
Se alterar um campo para outro tipo (var, varchar, float, etc) alguns outros campos continuam assumindo o mesmo tipo de campo como também
o tamanho do campo que altero (nº caracteres).

Estou achando que isso é uma "bucha" no IBExpert, uma vez que começou a dar esse problema, assim que tive que pegar nova versão.
É que fazer um tabela no "braço" via DOS é ruim demais no Firebird.

Preciso consertar esse problema para resolver testar a rotina que vc passou.
Não consegui testar ainda por conta deste "Imprevisto".

GOSTEI 0
Douglas

Douglas

29/01/2014

Olá Douglas Claudio
Agradeço a resposta.

Consegui contar quantos registros tem a tabela.
Agora somar os registros é que está um problema.

O campo media estava como char e tentei mudar para float. (senão dá pau mesmo)
Para minha surpresa, alguns outros campos, que nada tem a ver, passaram de char para float também, sem
que eu tenha editado esse "outros" campos da tabela com o IBexpert.

Formatei o PC, e instalei novamente o Firebird 2.0 que sempre usei sem problemas e o IBexpert (esse tive que baixar um novo
porque o meu tinha vencido) Ai os problemas começaram.
Se alterar um campo para outro tipo (var, varchar, float, etc) alguns outros campos continuam assumindo o mesmo tipo de campo como também
o tamanho do campo que altero (nº caracteres).

Estou achando que isso é uma "bucha" no IBExpert, uma vez que começou a dar esse problema, assim que tive que pegar nova versão.
É que fazer um tabela no "braço" via DOS é ruim demais no Firebird.

Preciso consertar esse problema para resolver testar a rotina que vc passou.
Não consegui testar ainda por conta deste "Imprevisto".



Alexandre, tem alguma novidade sobre os testes?
GOSTEI 0
Alexandre

Alexandre

29/01/2014

Olá L.Cláudio.

Testei com outra tabela que fiz de 2 campos e sua rotina funcionou.
Agora vou tentar criar a tabela novamente (tem 45 campos), já definindo os campos corretos e não editando para ver
se não dá aquele problema de algus campos se "autoeditarem". Tá parecendo coisa do GRIMM.... hehhe

Agradeço sua dica,, foi valiosa.
Grde abraço e boa semana.
GOSTEI 0
POSTAR