Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Filtrar dados de tabela paradox e visualizar em uma report


António44

Pergunta

Boa tarde amigos será que me podem ajudar?

Fiz um programa para gestão de treinos num campo de futebol

Treinam varias equipas e em varios escalões todos os dias.

exemplo:

Olhanense -Infantis

Olhanense -iniciados

Olhanense -Juvenis

Olhanense -juniores

Olhanense -Seniores

Olhanense -Veteranos

Maritimo _ '''''''

MAritimo -'''''''

Fuseta _''''''

Fuseta -''''''' e por ai fora...

é tudo regiatado em tabela Paradox com os seguites campos.

Data,Clube,Escalão,NºAtletas,tempo de utilização.

O que preciso é filtrar entre datas dos resultados desta tabela onde apareça só uma linha para

cada clube e escalão. Clube ,escalão,Total Atletas ,total de registos para cada escalão e

média de atletas.

Exemplo:Maritimo,Iniciados,300,100 presenças,media=3 Atletas

Maritimo,Juniores ,200 ,100 presenças,Média=2 Atletas

Olhanense,Veteranos,100 ,10 Presenças,Média=10 Atletas

será possivel filtrar estes dados e mete-los numa report para impressão.?

Eu ao filtrar aparece os registos todos,isto é de todas as presenças.

Meu E-mail

abotinas@sapo.pt

Link para o comentário
Compartilhar em outros sites

  • Respostas 51
  • Created
  • Última resposta

Top Posters For This Question

Posts Recomendados

  • 0

No final de cada més preciso filtrar por Clube e Escalão +numero de presenças de cada escalão + soma de atletas de cada Escalão + Média de atletas de cada escalão e média geral de atletas de cada clube.

Exemplo do que quero filtrar da tabela e imprimir.

NomeClube , NomeEscalão , AtletasMédia do escalão no més , AtletasMédia Geral do clube no més .

Olhanense -Infantis -Nºatletas -Média por escalão-Média Geral do clube

Olhanense -iniciados-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Olhanense -Juvenis-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Olhanense -juniores-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Olhanense -Seniores-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Olhanense -Veteranos-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Seguindo outro clube.........

Maritimo -Veteranos-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Maritimo -Juniores-Nºatletas-Média por escalão-Média Geral do clube no més de Dezembro.

Fazendo um filtro do més, faz uma contagem mas só dando 1 resultado para cada Clube / escalão e não todos os registros do Clube / escalão durante o més... problema é que eu sou novo nesta coisa da programação e não percebo nada de SQL.

Link para o comentário
Compartilhar em outros sites

  • 0

Fazendo um filtro do més, faz uma contagem mas só dando 1 resultado para cada Clube / escalão e não todos os registros do Clube / escalão durante o més... problema é que eu sou novo nesta coisa da programação e não percebo nada de SQL.

Antonio.. voce terá que aprender, pois desta maneira será mais falcil fazer o filtro que está querendo, pois isso vai o conceito básico sobre instrução SQL.

COMENTÁRIOS

Para executar esta operação, o programa principal de banco de dados procura a tabela ou tabelas especificadas, extrai as colunas escolhidas, seleciona as linhas que satisfazem o critério e classifica ou agrupa as linhas resultantes na ordem especificada.

A instrução SELECT não muda os dados no banco de dados.

SELECT é normalmente a primeira palavra em uma instrução SQL. A maior parte das instruções SQL são instruções SELECT.

A sintaxe mínima da instrução SELECT é:

SELECT campos FROM tabela

Você pode usar um asterisco (*) para selecionar todos os campos na tabela. O exemplo abaixo seleciona todos os campos na tabela Funcionários:

SELECT * FROM Funcionários;

Se o nome de um campo estiver incluído em mais de uma tabela na cláusula FROM, preceda-o com o nome da tabela e o operador . (ponto). No exemplo abaixo, o campo Departamento está nas tabelas Funcionários e Supervisores. A instrução SQL seleciona Departamento da tabela Funcionários e NomeSupv da tabela Supervisores:

SELECT Funcionários.Departamento, Supervisores.NomeSupv

FROM Funcionários INNER JOIN Supervisores

WHERE Funcionários.Departamento = Supervisores.Departamento;

Ao criar um objeto Recordset, o programa principal de banco de dados do Jet usa o nome do campo da tabela como o nome do objeto Field no objeto Recordset. Se você quiser um nome de campo diferente ou um nome que não esteja implícito na expressão usada para gerar o campo, use a palavra reservada AS. O exemplo abaixo usa o título Nasc para nomear o objeto Field retornado no objeto Recordset resultante:

SELECT DataNasc AS Nasc FROM Funcionários;

Sempre que você usar funções aggregate ou consultas que retornem nomes de objetos Field ambíguos ou duplicados, você precisará usar a cláusula AS para fornecer um nome alternativo para o objeto Field. O exemplo abaixo usa o título Contagem para nomear o objeto Field retornado no objeto Recordset resultante:

SELECT COUNT(FuncionárioID) AS Contagem FROM Funcionários;

Você pode usar outras cláusulas na instrução SELECT para restringir e organizar posteriormente os seus dados retornados.

Cláusula GROUP BY

GROUP BY é opcional. Valores de resumo são omitidos se não houver qualquer função aggregate SQL na instrução SELECT. Os valores Null nos campos GROUP BY são agrupados e não omitidos. No entanto, os valores Null não são avaliados em qualquer função aggregate SQL. Use a cláusula WHERE para excluir linhas que você não quer agrupadas e use a cláusula HAVING para filtrar os registros após eles terem sido agrupados.

A não ser que contenha dados Memo ou OLE Object, um campo na lista de campos GROUP BY pode fazer referência a qualquer campo em qualquer tabela listada na cláusula FROM. Mesmo que o campo não esteja incluído na instrução SELECT, fornecida a instrução SELECT, inclua pelo menos uma função SQL. O programa principal de banco de dados do Jet não pode agrupar campos Memo ou OLE Objects.

Todos os campos na lista de campos SELECT devem ser incluídos na cláusula GROUP BY ou incluídos como argumentos em uma função aggregate SQL.

Cláusula HAVING

HAVING é opcional. HAVING é semelhante a WHERE, que determina quais registros são selecionados. Depois que os registros são agrupados com GROUP BY, HAVING determina quais registros são exibidos:

SELECT CategoriaID, Sum(UnidadesNoEstoque) FROM Produtos

GROUP BY CategoriaID

HAVING Sum(UnidadesNoEstoque) > 100 AND LIKE "BOS*";

Uma cláusula HAVING pode conter até 40 expressões vinculadas por operadores lógicos, como And ou Or.

Cláusula ORDER BY

ORDER BY é opcional. Entretanto, se você quiser exibir seus dados na ordem classificada, você deve utilizar ORDER BY. O padrão ordem de classificação é ascendente (A a Z, 0 a 9). Os dois exemplos abaixo classificam os nomes dos funcionários pelo sobrenome.

SELECT Sobrenome, Nome FROM Funcionários ORDER BY Sobrenome;

SELECT Sobrenome, Nome FROM Funcionários ORDER BY Sobrenome ASC;

Para classificar em ordem descendente (Z a A, 9 a 0), adicione a palavra reservada DESC ao final de cada campo que você quiser classificar em ordem descendente. O exemplo abaixo seleciona salários e os classifica em ordem descendente

SELECT Sobrenome, Salário FROM Funcionários ORDER BY Salário DESC, Sobrenome;

Se você especificar um campo que contém dados Memo ou OLE Objects na cláusula ORDER BY, um erro ocorrerá. O programa principal de banco de dados do Jet não classifica campos deste tipo. ORDER BY é normalmente o último item em uma instrução SQL.

Você pode incluir campos adicionais na cláusula ORDER BY. Os registros são classificados primeiro pelo primeiro campo listado depois de ORDER BY. Os registros que tiverem valores iguais naquele campo são classificados pelo valor no segundo campo listado e assim por diante.

Cláusula WITH OWNERACCESS OPTION

A declaração WITH OWNERACCESS OPTION é opcional. O exemplo abaixo habilita o usuário a ver as informações de salário (mesmo que não tenha outra permissão para ver a tabela Folha de Pagamentos) desde que o proprietário da consulta tenha tal permissão:

SELECT Sobrenome, Nome, Salário FROM Funcionários ORDER BY Sobrenome

WITH OWNERACCESS OPTION;

Se, por outro lado, um usuário for impedido de criar ou anexar a uma tabela, você poderá usar WITH OWNERACCESS OPTION para habilitá-lo a executar uma consulta construção de tabela ou consulta anexação. Se você quiser reforçar as configurações de segurança do grupo de trabalho e as permissões dos usuários, não inclua a declaração WITH OWNERACCESS OPTION. Esta opção exige que você tenha acesso ao arquivo System.mda associado ao banco de dados. É realmente útil em implementações de multiusuários seguras.

Exemplo da instrução SELECT, cláusula FROM

Esse exemplo seleciona os campos "Sobrenome" e "Nome" de todos os registros da tabela "Funcionários".

SELECT Sobrenome, Nome FROM Funcionários

Esse exemplo seleciona todos os campos da tabela "Funcionários".

SELECT Funcionários.* FROM Funcionários;

Esse exemplo conta o número de registros que têm uma entrada no campo "CódigoPostal" e nomeia o campo retornado como "Tcp".

SELECT Count(CódigoPostal) AS Tcp FROM Clientes;

Esse exemplo mostra qual seria o salário se cada funcionário recebesse um aumento de 10 porcento. Não altera o valor original dos salários.

SELECT Sobrenome, Salário AS Atual, Salário * 1.1 AS Proposto FROM Funcionários;

Esse exemplo coloca o título Nome no topo da coluna "Sobrenome". O título Salário é exibido no topo da coluna "Salário".

SELECT Sobrenome AS Nome, Salário FROM Funcionários;

Esse exemplo mostra o número de funcionários e os salários médio e máximo.

SELECT Count(*) AS [Total de Funcionários], Avg(Salário) AS [salário Médio], Max(Salário) AS [salário Máximo] FROM Funcionários;

Para cada registro, mostra Sobrenome e Salário no primeiro e último campos. A seqüência de caracteres "tem um salário de" é retornada como o campo do meio de cada registro.

SELECT Sobrenome, 'tem um salário de', Salário FROM Funcionários;

Exemplo de cláusula GROUP BY

Esse exemplo cria uma lista de nomes de departamentos únicos e o número de funcionários em cada um destes departamentos.

SELECT Departamento, Count([Departamento]) AS Tbc FROM Funcionários

GROUP BY Departamento;

Para cada título de função único, calcula o número de funcionários do departamento de Vendas que têm este título.

SELECT Título, Count(Título) AS Tbc FROM Funcionários

WHERE Departamento = 'Vendas' GROUP BY Título;

Esse exemplo calcula o número de itens em estoque para cada combinação de número e cor do item.

SELECT Item, Sum(Unidades) AS Tbc FROM ItensEmEstoque

GROUP BY Item, Cor;

Exemplo de cláusula HAVING

Esse exemplo seleciona os títulos de cargos do departamento de Produção atribuídos a mais de 50 funcionários.

SELECT Título, Count(Título) FROM Funcionários WHERE Departamento = 'Produção'

GROUP BY Título HAVING Count(Título) > 50;

Esse exemplo seleciona os departamentos que tenham mais de 100 funcionários.

SELECT Departamento, Count([Departamento]) FROM Funcionários

GROUP BY Departamento HAVING Count(Departamento) > 100;

Exemplo de cláusula ORDER BY

As instruções SQL mostradas abaixo usam a cláusula ORDER BY para classificar os registros em ordem alfabética e depois por categoria.

Esse exemplo ordena os registros pelo sobrenome, em ordem descendente (Z-A).

SELECT Sobrenome, Nome FROM Funcionários ORDER BY Sobrenome DESC;

Esse exemplo ordena, primeiro, por categoria ID e depois por nome do produto.

SELECT CategoriaID, ProdutoNome, PreçoUnit FROM Produtos

ORDER BY CategoriaID, NomeProduto;

Então de acordo com o que foi explicado, voce deve tentar montar a sua instrução:

( Exemplo do que quero filtrar da tabela e imprimir.

NomeClube , NomeEscalão , AtletasMédia do escalão no més , AtletasMédia Geral do clube no més .)

exemplo:

Select * from Tabela

Where NomeClube = 'Olhanense' and NomeEscalão = 'Veteranos'

and ( data >= :DataIni and Data <= :DataFim )

Neste caso o seu filtro procurará todos os registros que tenham o nome do clube igual 'Olhanense' e o nome escalão igual a 'Veteranos' e que esses registros estejam dentro de uma faixa de datas exemplo: 01/12/2008 a 31/12/2008

entretanto as datas serão passadas via parametros (:DataIni e :Datafim) ou poderiam tambem ser digitadas na própria instrução SQL

OBS: Se voce não está familiarizado com este tipo de procedimento, sugiro que leia mais sobre isso... e faça tambem uma pesquisa no forum com palavras chave ex: SQL, Select, filtros...etc

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Então de acordo com o que foi explicado, voce deve tentar montar a sua instrução:

( Exemplo do que quero filtrar da tabela e imprimir.

NomeClube , NomeEscalão , AtletasMédia do escalão no més , AtletasMédia Geral do clube no més .)

exemplo:

Select * from Tabela

Where NomeClube = 'Olhanense' and NomeEscalão = 'Veteranos'

and ( data >= :DataIni and Data <= :DataFim )

O filtro está optimo assim,mas só me dá um resultado de cada vez... será possivel Onde tem'Ollhanense' esteja dirigido a todos os clubes que testiverem cadastrados...??? e para Escalões, Onde tem 'Veteranos' possa estar dirigido a todos os escalões cadastrados e assim dar todos os resultados Clube/Escalão seguidos.... eu criei uma tabela só com o nome dos clubes e queria que ao filtrar me dê a lista completa dos clubes que tiverem cadastrados e respectivos escalões...peço desculpa por ser tão basico.

Link para o comentário
Compartilhar em outros sites

  • 0

Se voce quiser incluir todos os clubes e todos escalões basta fazer assim

Select * from Tabela

where ( data >= :DataIni and Data <= :DataFim )

Order by NomeClube, NomeEscalão

ou ainda

Select * from Tabela

Where NomeClube <> ' ' and NomeEscalão <> ' '

and ( data >= :DataIni and Data <= :DataFim )

Order by NomeClube, NomeEscalão

Neste caso todos os registros dentro da faixa de datas seriam ordenados por NomeClube e NomeEscalão

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Antonio ... somente para exemplificar o uso:

Na propriedade SQL da Query teria esta instrução:

Select * from Tabela
Where NomeClube <> ' ' and NomeEscalao <> ' ' 
and ( data >= :DataIni and Data <= :DataFim ) 
Order by NomeClube, NomeEscalao
então para fazer uso do DateTimePicker para Dataini e DataFim, voce teria que usar 2 DateTimePicker, um para a data inicial da pesquisa e outro para a data final da pesquisa, atribuindo os seus valores aos parametros e consequentemente passando os valores para a instrução SQL exemplo:
procedure TForm1.Button1Click(Sender: TObject);
begin
   Query1.Active := false;
   ClientDataSet1.Active := false;
   ClientDataSet1.Params[0].AsDate := DateTimePicker1.Date;  // parametro Dataini   01/02/2008
   ClientDataSet1.Params[1].AsDate := DateTimePicker1.Date;  // parametro Datafim  31/12/2008
   Query1.Prepare;
   Query1.Active := true;
   ClientDataSet1.Active := true;
end;

Procure pesquisar no forum ... já tem muita coisa a respeito do assunto

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Como eu aposentei o delphi 3 faz tempo ... não me lembro onde está ... veja se encontra na aba midas

procure porque o delphi 3 também tem.

caso não encontre ainda pode ser usando desta maneira:

procedure TForm1.Button1Click(Sender: TObject);
begin
   Query1.Active := false;
   Query1.Params[0].AsDate := DateTimePicker1.Date;  // parametro Dataini   01/02/2008
   Query1.Params[1].AsDate := DateTimePicker1.Date;  // parametro Datafim  31/12/2008
   Query1.Prepare;
   Query1.Active := true;
end;

Neste caso não esqueça de definir o tipo do parametro no componente query

OBS: Se voce for usar o ClientDataSet1, voce em que adicionar os parametros neste componente usando a propriedade Params do próprio componente e definindo o tipo.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

procedure TForm1.Button1Click(Sender: TObject);
begin
   Query1.Active := false;
   Query1.Params[0].AsDate := DateTimePicker1.Date;  // parametro Dataini   01/02/2008
   Query1.Params[1].AsDate := DateTimePicker1.Date;  // parametro Datafim  31/12/2008
   Query1.Prepare;
   Query1.Active := true;
end;

Usei este aqui e quando faço o click no botão não acontece nada...!nem erro dá???rsrssrrss

não estou conseguindo fazer isto funcionar defeni os parametros Dataini e DataFinal na Query1 e nada...que chatice agradeço a vossa paciência amigos

Se puderem safem-me lá desta....Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Usei este aqui e quando faço o click no botão não acontece nada...!nem erro dá???rsrssrrss

Isso porque o código está correto

não estou conseguindo fazer isto funcionar defeni os parametros Dataini e DataFinal na Query1 e nada...que chatice

Voce está usando um dbgrid para visualizar os registros ? Linke o DataSouce da sua tabela à propriedade DataSource do DBGrid.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Usei assim e deu certo.

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

Form2.Query1.Active := false;

Form2.Query1.Params[0].AsDate := DateTimePicker1.Date;

Form2.Query1.Params[1].AsDate := DateTimePicker2.Date;

Form2.Query1.Prepare;

Form2.Query1.Active := true;

Form2.Query1.Filtered:=true;

Form2.QuickRep1.preview;

end;

Agora eu quero sumar o campo atletas e para isso uso um 'QRExpr', mas a expressão não dá certo 'SUM(Nº Atletas)'

fica a expressão escrita no 'QRExpr' em lugar de dar a soma dos atletas.

Abraço ai amigos.

Link para o comentário
Compartilhar em outros sites

  • 0
Agora eu quero somar o campo atletas e para isso uso um 'QRExpr', mas a expressão não dá certo 'SUM(Nº Atletas)'

fica a expressão escrita no 'QRExpr' em lugar de dar a soma dos atletas.

voce deve usar este componente na banda rbGroupFooter ou rbSummary

entretanto voce terá que ter o Dataset dentro do Report, caso contrario , voce pode trabalhar com variáveis internas para fazer a soma e mostrar o resultado em um QRLabel dentro do report

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
voce deve usar este componente na banda rbGroupFooter ou rbSummary

entretanto voce terá que ter o Dataset dentro do Report, caso contrario , voce pode trabalhar com variáveis internas para fazer a soma e mostrar o resultado em um QRLabel dentro do report

mas isso eu fiz uso um rbGroupFooter e o Dataset está dentro do Report.... :!: variaveis internas eu não sei fazer.

sou bastante basico confesso...

Abraço ai pra você.

Link para o comentário
Compartilhar em outros sites

  • 0
mas isso eu fiz uso um rbGroupFooter e o Dataset está dentro do Report.... variaveis internas eu não sei fazer.

sou bastante basico confesso...

Antonio .. voce está usando um componente QuickReport dentro do seu form ... fiz uns testes aqui e realmente não mostra a somatória na banda rbGroupFooter, mas mostra na banda rbSummary.

troque para rbSummary, depois dou uma verificada melhor para descobrir o motivo.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Antonio .. voce está usando um componente QuickReport dentro do seu form ... fiz uns testes aqui e realmente não mostra a somatória na banda rbGroupFooter, mas mostra na banda rbSummary.

troque para rbSummary, depois dou uma verificada melhor para descobrir o motivo.

Eu tentei com o rbSummary,e tb não deu resultado...será preciso declarar alguma coisa na unit.????

Link para o comentário
Compartilhar em outros sites

  • 0
Eu tentei com o rbSummary,e tb não deu resultado...será preciso declarar alguma coisa na unit.????

Fiz uns testes aqui e funcionou .... voce linkou o DataSet do Quick Report ao DataSource da sua Tabela ?

Algumas informações adicionais

http://scriptbrasil.com.br/forum/index.php...st&p=397211

http://www.guiadodelphi.com.br/ler.php?codigo=417

http://www.ramosdainformatica.com.br/art_r...s01.php?CDA=473

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Permitam-me um pitaco aqui...

é tudo regiatado em tabela Paradox com os seguites campos.

Data, Clube, Escalão, NºAtletas, tempo de utilização.

O que preciso é filtrar entre datas dos resultados desta tabela onde apareça só uma linha para

cada clube e escalão. Clube ,escalão,Total Atletas ,total de registos para cada escalão e

média de atletas.

Exemplo:Maritimo,Iniciados,300,100 presenças,media=3 Atletas

Maritimo,Juniores ,200 ,100 presenças,Média=2 Atletas

Olhanense,Veteranos,100 ,10 Presenças,Média=10 Atletas

No final de cada més preciso filtrar por Clube e Escalão +numero de presenças de cada escalão + soma de atletas de cada Escalão + Média de atletas de cada escalão e média geral de atletas de cada clube.

Exemplo do que quero filtrar da tabela e imprimir.

NomeClube , NomeEscalão , AtletasMédia do escalão no més , AtletasMédia Geral do clube no més.

Colegas, baseado nestas informações, para fazer o agrupamento mensal, corretamente, ainda seria necessário colocar a "data" na cláusula ORDER BY, porque a banda de agrupamento avalia a expressão na sequência em que os dados são lidos do dataset. Entretanto, se nesta data aparecer ao dia, ainda assim o agrupamento não ficará correto pelos outros campos - exemplificando:

// resultado de consulta ordenada por Data, NomeClube, NomeEscalão

01/12/2008 | Maritimo | Juvenis | 22

01/12/2008 | Olhanense | Infantis | 25

01/12/2008 | Olhanense | Iniciados | 22

01/12/2008 | Olhanense | Juvenis | 22

03/12/2008 | Fuseta | Infantis | 24

03/12/2008 | Olhanense | Seniores | 24

05/12/2008 | Fuseta | Infantis | 20

05/12/2008 | Maritimo | Infantis | 20

08/12/2008 | Olhanense | Infantis | 25

// resultado esperado para agrupamento correto no relatório é obtido

// se a consulta for ordenada apenas usando o mês e ano da data, ou seja

// ordenada por Ano, Mes, NomeClube, NomeEscalão

03/12/2008 | Fuseta | Infantis | 24

05/12/2008 | Fuseta | Infantis | 20

05/12/2008 | Maritimo | Infantis | 20

01/12/2008 | Maritimo | Juvenis | 22

01/12/2008 | Olhanense | Infantis | 25

08/12/2008 | Olhanense | Infantis | 25

01/12/2008 | Olhanense | Iniciados | 22

01/12/2008 | Olhanense | Juvenis | 22

03/12/2008 | Olhanense | Seniores | 24

o que permitiria facilmente o agrupamento por ano, mês, ou simplesmente mês/ano, neste formato:

Dezembro/2008

+ Fuseta

| Infantis | 44 | Contador | Média

+ Maritimo

| Infantis | 20 | Contador | Média

| Juvenis | 22 | Contador | Média

+ Olhanense

| Infantis | 50 | Contador | Média

| Iniciados | 22 | Contador | Média

| Juvenis | 22 | Contador | Média

| Seniores | 24 | Contador | Média

A consulta SQL ficaria deste modo:

Select extract(year from data) as Ano, extract(month from data) as Mes, T.* 
from Tabela T
where data between :DataIni and :DataFim
Order by extract(Year from data), extract(Month from data), NomeClube, NomeEscalão

No QuickReport a propriedade Dataset deve estar linkada ao dataset utilizado para a realização da consulta e as bandas ficam deste modo:

- TQRGroup (1º) com a propriedade Expression contendo o campo Mes (no caso do agrupamento Mês/Ano)

---> contém TQRDBText com a propriedade DataField=Data e propriedade Mask=mmm/yyyy

- TQRGroup (2º) com a propriedade Expression contendo o campo NomeClube

---> contém TQRDBText com a propriedade DataField=NomeClube

- TQRGroup (3º) com a propriedade Expression contendo o campo NomeEscalão

---> Nada a mostrar

- TQRBand com BandType=rbDetail

---> Nada a mostrar

- TQRBand com BandType=rbGroupFooter (esta banda deve ser selecionada na propriedade FooterBand da banda group anteirior - NomeEscalão -> 3º)

---> TQRDBText com a propriedade DataField=NomeEscalão;

---> TQRExpr com a propriedade Expression contendo SUN(Total Atletas)*1.0; (Total Atletas é o campo do dataset, e o motivo de usar o "*1.0" você vê neste post)

---> TQRExpr com a propriedade Expression contendo COUNT;

---> TQRLabel para mostrar a média (resultado do SUM/COUNT)

---> No evento BeforePrint fazer o cálculo e atribuir ao TQRLabel. Os valores podem ser obtidos através a linha:

QRLabel1.Caption := FormatFloat('0.00', QRExpr1.Value.dblResult/QRExpr2.Value.dblResult)

onde:

QRLabel1 é o label para mostrar o resultado da média;

QRExpr1 contém o somatório de atletas

QRExpr2 contém a quantidade de "jogos marcados"

estes nomes dos componentes podem variar no seu relatório.

Para cada um dos outros Group, você pode ter outras GroupFooter e obter os valores para aqueles agrupamentos, baseando-se nesta footer que configurei.

No caso de uma totalização anual, poderia ser incluida no início mais uma banda Group com a propriedade Expression=Ano. Outra opção seria simplesmente utilizar uma banda Summary, mas esta representaria a totalização dos dados obtidos e caso nestes estejam informações de anos diferentes, os valores não corresponderiam ao esperado (valores anuais).

Acredito que esteja em condição de funcionar a contento.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus...espetacular esta sua informacão funciona ás mil maravilhas.

Muito Obrigado.

Agora eu estou aqui com um problemazinho,é o seguite:

Tenho um DBGrid com a informação e quando seleciono uma linha e carrego o btEditar tudo bem,mas se carrego no dBNavegador para editar linha seguinte(Alterar informação) editando ou não quando vou gravar dá erro (Dataset not in edit or insert mode)... isto tem maneira de contornar ??? é que assim só posso editar um registo de cada vez gravar e editar o seguinte ,o que é bastante chato haverá maneira de ficar sempre em modo de edição até gravar,e não sai do modo edição avaçando no DBnavegador???.

Agradecia uma ajuda vossa.

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

António44, você há de convir que esta nova dúvida não tem relação com o relatório. Assim, visando manter a ordem aqui do forum e facilitando o aproveitamento da dúvida por outros colegas é sempre bom que um novo tópico seja aberto, nestes casos. ;)

Mas vamos lá...

Agora eu estou aqui com um problemazinho,é o seguite:

Tenho um DBGrid com a informação e quando seleciono uma linha e carrego o btEditar tudo bem,mas se carrego no dBNavegador para editar linha seguinte(Alterar informação) editando ou não quando vou gravar dá erro (Dataset not in edit or insert mode)... isto tem maneira de contornar ???

fiquei meio confuso quanto a dúvida. :huh:

Voce está querendo dizer que teria um botao (btEditar) para pôr o dataset, ligado ao DBGrid, em modo edição e então e, a partir daí, ao usar o botão Next do DBNavigator seguir para o próximo campo mas já com este no modo edição? Seria isto?

é que assim só posso editar um registo de cada vez gravar e editar o seguinte, o que é bastante chato haverá maneira de ficar sempre em modo de edição até gravar,e não sai do modo edição avaçando no DBnavegador???
Supondo que a resposta a meu questionamento anterior seja sim, podemos dizer que seria possível implementar esta facilidade, mas não funcionaria como você pensa. Não tem como editar uma linha do DBGrid e ir para outra sem que a informação alterada seja antes gravada - é automático.

Não sei se você já observou, mas se no DataSource ligado ao DBGrid a propriedade AutoEdit=True (que é o padrão), ao tentar digitar qualquer coisa em uma coluna, automaticamente aquela linha entra em modo edição.

Em todos os casos, se você estiver utilizando o Delphi 7 (D3 não tem o evento e os outros eu não conheço) e o dataset que você utiliza tem o evento AfterScroll, voce pode colocar o código abaixo para que cada vez que você mova de uma linha para outra, automaticamente ela entre em modo de edição:

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  if Dataset.State = dsBrowse then
      DataSet.Edit;
end;

neste caso, o seu botão edEditar ficaria sem função.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  if btGravar.enabled=true then
begin
  if Dataset.State = dsBrowse then
      DataSet.Edit;
end;
end;

Micheus,eu usei assim e funcionou bem agora já passo de registo no navigador e fica sempre em edição.

Obrigado

Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

SQL
Select extract(year from data) as Ano, extract(month from data) as Mes, T.* 
from Tabela T
where data between :DataIni and :DataFim
Order by extract(Year from data), extract(Month from data), NomeClube, NomeEscalão

Micheus tá dando erro em extract(year from data)Erro =Invalide Keyword Token e tb deve dar em Ano, extract(month from data) ,o campo data na Tabela é mesmo Tipo Data porque dará esse erro???

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus tá dando erro em extract(year from data)Erro =Invalide Keyword Token e tb deve dar em Ano, extract(month from data) ,o campo data na Tabela é mesmo Tipo Data porque dará esse erro???
António44, desculpe minha falha.

Na cláusula ORDER BY, no caso do Paradox, não dá para usar a função. Em outros bancos, é possível até usar até o alias da coluna no SELECT (como Ano e Mes), mas com ele não dá e, então, temos que usar o nº referente à posição da coluna no SELECT que, em nosso caso, será 1 (Ano) e 2 (Mes):

Select extract(year from data) as Ano, extract(month from data) as Mes, T.* 
from Tabela T
where data between :DataIni and :DataFim
Order by 1, 2, NomeClube, NomeEscalão

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Agora a extração deu certo,mas o TQRExpr com a propriedade Expression contendo COUNT vai somando os valores anteriores se no 1º grupo tem 10 marcações e no segundo 5 =15 onde devia ser '5' sumou e ainda,na soma de atletas faz a mesma coisa,e no QRLabel1.Caption := FormatFloat('0.00', QRExpr1.Value.dblResult/QRExpr2.Value.dblResult);

o valor é 1.00...de resto alinhou tudo por clube e escalão certinho.

TQRBand com BandType=rbGroupFooter (esta banda deve ser selecionada na propriedade FooterBand da banda group anteirior - NomeEscalão -> 3º) isto eu fiz como você disse, e o QRLabel1,TQRExpr estão no rbGroupFooter que poderá ser o problema agradeço sua ajuda,e desculpe a mssg.. :(

Abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.




  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...