António44 Postado Dezembro 6, 2008 Denunciar Share Postado Dezembro 6, 2008 Boa tarde amigos será que me podem ajudar?Fiz um programa para gestão de treinos num campo de futebolTreinam varias equipas e em varios escalões todos os dias.exemplo:Olhanense -InfantisOlhanense -iniciadosOlhanense -JuvenisOlhanense -junioresOlhanense -SenioresOlhanense -VeteranosMaritimo _ '''''''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 Atletasserá 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-mailabotinas@sapo.pt Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 8, 2008 Denunciar Share Postado Dezembro 8, 2008 Antonio ... use a apostila de SQL Básico para aprender filtrar os resultados da sua tabelahttp://www.delphix.org/?q=downloads/apostilasabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 8, 2008 Autor Denunciar Share Postado Dezembro 8, 2008 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 clubeOlhanense -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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 8, 2008 Denunciar Share Postado Dezembro 8, 2008 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.NomeSupvFROM Funcionários INNER JOIN SupervisoresWHERE 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 ProdutosGROUP BY CategoriaIDHAVING 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 descendenteSELECT 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 SobrenomeWITH 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 TabelaWhere 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/2008entretanto as datas serão passadas via parametros (:DataIni e :Datafim) ou poderiam tambem ser digitadas na própria instrução SQLOBS: 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...etcabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 8, 2008 Autor Denunciar Share Postado Dezembro 8, 2008 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 TabelaWhere 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 8, 2008 Denunciar Share Postado Dezembro 8, 2008 Se voce quiser incluir todos os clubes e todos escalões basta fazer assimSelect * from Tabelawhere ( data >= :DataIni and Data <= :DataFim )Order by NomeClube, NomeEscalão ou aindaSelect * from TabelaWhere 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 8, 2008 Autor Denunciar Share Postado Dezembro 8, 2008 Select * from TabelaWhere NomeClube <> ' ' and NomeEscalão <> ' ' and ( data >= :DataIni and Data <= :DataFim ) Order by NomeClube, NomeEscalão Eu só tenho um campo data na tabela, como usar um DateTimePicker para Dataini e DataFim.Agradecido pela sua ajuda.Abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 8, 2008 Denunciar Share Postado Dezembro 8, 2008 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 assuntoabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 9, 2008 Autor Denunciar Share Postado Dezembro 9, 2008 Dá um erro no componente...ClientDataSet1....onde encontro esse componente??? eu uso o delphi3 o velhinho...abbbraço ai. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 9, 2008 Denunciar Share Postado Dezembro 9, 2008 Como eu aposentei o delphi 3 faz tempo ... não me lembro onde está ... veja se encontra na aba midasprocure 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 queryOBS: 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 9, 2008 Autor Denunciar Share Postado Dezembro 9, 2008 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á???rsrssrrssnão estou conseguindo fazer isto funcionar defeni os parametros Dataini e DataFinal na Query1 e nada...que chatice agradeço a vossa paciência amigosSe puderem safem-me lá desta....Abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 9, 2008 Denunciar Share Postado Dezembro 9, 2008 Usei este aqui e quando faço o click no botão não acontece nada...!nem erro dá???rsrssrrssIsso porque o código está corretonão estou conseguindo fazer isto funcionar defeni os parametros Dataini e DataFinal na Query1 e nada...que chaticeVoce está usando um dbgrid para visualizar os registros ? Linke o DataSouce da sua tabela à propriedade DataSource do DBGrid.abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 9, 2008 Autor Denunciar Share Postado Dezembro 9, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 9, 2008 Denunciar Share Postado Dezembro 9, 2008 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 rbSummaryentretanto 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 reportabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 10, 2008 Autor Denunciar Share Postado Dezembro 10, 2008 voce deve usar este componente na banda rbGroupFooter ou rbSummaryentretanto 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 reportmas 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ê. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 10, 2008 Denunciar Share Postado Dezembro 10, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 11, 2008 Autor Denunciar Share Postado Dezembro 11, 2008 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.???? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Dezembro 12, 2008 Denunciar Share Postado Dezembro 12, 2008 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 adicionaishttp://scriptbrasil.com.br/forum/index.php...st&p=397211http://www.guiadodelphi.com.br/ler.php?codigo=417http://www.ramosdainformatica.com.br/art_r...s01.php?CDA=473abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 12, 2008 Autor Denunciar Share Postado Dezembro 12, 2008 Obrigado pela sua preciosa ajuda.um abraço ai Jhonas e Feliz Natal. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Dezembro 12, 2008 Denunciar Share Postado Dezembro 12, 2008 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 AtletasNo 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ão01/12/2008 | Maritimo | Juvenis | 2201/12/2008 | Olhanense | Infantis | 2501/12/2008 | Olhanense | Iniciados | 2201/12/2008 | Olhanense | Juvenis | 2203/12/2008 | Fuseta | Infantis | 2403/12/2008 | Olhanense | Seniores | 2405/12/2008 | Fuseta | Infantis | 2005/12/2008 | Maritimo | Infantis | 2008/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ão03/12/2008 | Fuseta | Infantis | 2405/12/2008 | Fuseta | Infantis | 2005/12/2008 | Maritimo | Infantis | 2001/12/2008 | Maritimo | Juvenis | 2201/12/2008 | Olhanense | Infantis | 2508/12/2008 | Olhanense | Infantis | 2501/12/2008 | Olhanense | Iniciados | 2201/12/2008 | Olhanense | Juvenis | 2203/12/2008 | Olhanense | Seniores | 24o 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édiaA 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ãoNo 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 atletasQRExpr2 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 13, 2008 Autor Denunciar Share Postado Dezembro 13, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Dezembro 13, 2008 Denunciar Share Postado Dezembro 13, 2008 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 13, 2008 Autor Denunciar Share Postado Dezembro 13, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 13, 2008 Autor Denunciar Share Postado Dezembro 13, 2008 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??? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Dezembro 14, 2008 Denunciar Share Postado Dezembro 14, 2008 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ãoAbraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 António44 Postado Dezembro 14, 2008 Autor Denunciar Share Postado Dezembro 14, 2008 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
António44
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
Top Posters For This Question
27
16
9
Dias Populares
Jan 2
9
Dez 8
9
Jan 3
8
Dez 9
5
Top Posters For This Question
António44 27 posts
Micheus 16 posts
Jhonas 9 posts
Dias Populares
Jan 2 2009
9 posts
Dez 8 2008
9 posts
Jan 3 2009
8 posts
Dez 9 2008
5 posts
51 respostass a esta questão
Posts Recomendados
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.