six 0 Denunciar post Postado Janeiro 27, 2014 Boa tarde a todos do forum iMasters pessoal preciso muito da ajuda de vocês Tenho as seguintes tabelas Tabela: Caixa CAI_CODIGO - PK CAI_DATA CAI_NUMDOC CAI_CODCONTA - FK CAI_TIPO (E ou S) CAI_HISTORICO CAI_VALOR CAI_SALDO Tabela: CadastroConta CON_CODIGO – PK CON_NOME Preciso fazer um relatório no Quick report para somar cada conta lançada no Caixa e poder pesquisar por um período de data (tipo Balancete). Exemplo: lançamentos no Caixa 05/01/2014 – lanche – R$ 20,00 06/01/2014 – ajuda de custo – R$ 30,00 07/01/2014 – lanche – R$ 20,00 09/01/2014 – lanche – R$ 10,00 10/01/2014 – ajuda de custo – R$ 40,00 ... No relatório quero trazer a soma das contas, assim: . Ajuda de Custo - R$ 70,00 . Lanche - R$ 50,00 Uso Delphi 7 e banco de dados Access Se alguém puder me ajudar agradeço Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 27, 2014 Amigo, isso é algo que pode resolver usando uma consulta SQL... dê uma lida nesse link: http://www.macoratti.net/sql_acc.htm Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 27, 2014 Chrnos, primeiramente muito obrigado pela ajuda. eu fiz uma consulta com ADOQuery No ADOQuery fiz o seguinte código: SELECT CadastroConta.CON_NOME, Caixa.* FROM Caixa INNER JOIN CadastroConta ON CadastroConta.CON_CODIGO = Caixa.CAI_CODCONTA WHERE Caixa.CAI_DATA BETWEEN :dataini AND :datafin No QRExpr1 fiz o seguinte código: SUM(IF((ADOQuery1.CON_NOME= 'lanche'), ADOQuery1.CAI_VALOR, 0.0)) No QRExpr2 fiz o seguinte código: SUM(IF((ADOQuery1.CON_NOME= 'Ajuda de Custo'), ADOQuery1.CAI_VALOR, 0.0)) . Adicionei estes QRExpr na band Summary . Dataset do Quickreport está ligada a ADOquery1 mas quando abro o relatório não está trazendo a soma das contas. Aparece sempre o zero. Voce tem alguma idéia de como posso fazer? obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 28, 2014 Você pode usar o comando SUM no seu sql para somar as informações desejadas... algo do tipo: Select campoA, campoB, SUM(campoC) as Total from sua tabela group by campoA, campoB O select exemplo acima iria trazer a soma dos dados da sua tabela agrupados pelos campos A e B. Ai seria só pegar o retorno do select e montar seu relatório.... Ps.: Como não sei quais são os campos que vai usar da sua tabela Caixa, montei um exemplo genérico... mas uma dica: por performance, o melhor é sempre listar os campos no select ao invés de usar o asterisco nas consultas. Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 29, 2014 Chrnos boa tarde com vossa preciosa ajuda consegui fazer esta consulta (ADOQuery) para resolver a soma das contas no relatório Quickreport, a consulta traz apenas dois campos o nome da conta e o total da mesma. antes de abrir o formulário seleciono as datas de intervalo e o relatório é aberto com a soma de cada conta do período selecionado. Fiz um ADOQuery pra cada conta que fica no relatório e agora ligo cada query em QRDBText. Bem não sei se é o modo correto, mas está funcionando e me atendendo perfeitamente. SELECT Lancamento.LAN_NOME, Sum(Caixa.CAI_VALORMOVIMENTO) As Total FROM Caixa INNER JOIN Lancamento ON Lancamento.LAN_CODIGO = Caixa.CAI_CODLANCAMENTO WHERE Caixa.CAI_DATAMOVIMENTO BETWEEN :dataini AND :datafin and Lancamento.LAN_NOME = :nomeconta Group by Lancamento.LAN_NOME; Obrigado, espero contar com sua ajuda em mais dúvidas, que com certeza irão surgir. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 29, 2014 Se você quiser trazer a soma de todas as contas agrupadas de uma vez só, basta tirar o and Lancamento.LAN_NOME = :nomeconta do seu where, que vai trazer os totais agrupados por conta em uma consulta sql só... o group by é quem vai controlar para que os dados sejam somados na conta certa.... ai não precisará ter um Adoquery para cada conta e pode usar uma detail band pra mostrar os dados e deixar sua vida mais simples, dependendo da estrutura do seu relatório, claro.... qualquer coisa estamos ai pra ajudar six. Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 30, 2014 Chrnos, boa noite Apesar de ter tirado parte do código acima que você citou, não conseguir fazer a soma por conta, visto que eu tenho um QRDBText para cada conta. Você pode me passar um exemplo, como eu posso buscar a soma por conta de acordo com o período de data selecionado. Desculpe a minha falta de conhecimento em delphi. Obrigado mais uma vez. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 31, 2014 Você executou apenas o sql para ver se o resultado estava retornando com os valores agrupados por conta corretamente? Se sim, para listá-los poderia usar uma detailband associada a esta query e os qrdbtext iriam inserir todos os valores, um por linha.... agora, tem que ver a estrutura do relatório que está gerando... as vezes não há uma solução melhor que fazer individualizado conforme o layout utilizado.. se puder dar uma idéia de como está exibindo estes dados no seu relatório eu posso tentar ajudar um pouco mais. Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 31, 2014 Chrnos, bom dia 1): Eu executei a Query que você fez a modificação e não me retornou a soma das contas, trouxe apenas o valor aleatório de uma conta. 2): Vou descrever como fiz os procedimentos que está trazendo a soma das contas: Botão para chamar o Relatório de despesas (QuickRepCaixaContas) procedure TfrmRelMenuCaixa.BitBtnCaixaContaClick(Sender: TObject); begin try Application.CreateForm(TfrmRelCaixaContas, frmRelCaixaContas); frmRelCaixaContas.Q_RelLanche.Close; frmRelCaixaContas.Q_RelLanche.Parameters.ParamByName('dataini').Value:= JvDatePickerEdit3.Date; frmRelCaixaContas.Q_RelLanche.Parameters.ParamByName('datafin').Value:= JvDatePickerEdit4.Date; frmRelCaixaContas.Q_RelLanche.Parameters.ParamByName('nomeconta').Value:= 'Lanche'; frmRelCaixaContas.Q_RelLanche.Open; // frmRelCaixaContas.Q_RelAjudacusto.Close; frmRelCaixaContas.Q_ RelAjudacusto.Parameters.ParamByName('dataini').Value:= JvDatePickerEdit3.Date; frmRelCaixaContas.Q_ RelAjudacusto.Parameters.ParamByName('datafin').Value:= JvDatePickerEdit4.Date; frmRelCaixaContas.Q_ RelAjudacusto.Parameters.ParamByName('nomeconta').Value:= 'Ajuda de Custo'; frmRelCaixaContas.Q_ RelAjudacusto.Open; frmRelCaixaContas.QuickRepCaixaContas.Preview; finally freeandnil(frmRelCaixaContas); end; end; No relatório está assim: Adicionei duas ADOQuerys inicialmente para teste (mas vai ter mais contas) Q_RelLanche e Q_RelAjudacusto em ambas tem aquele código sql: SELECT Lancamento.LAN_NOME, Sum(Caixa.CAI_VALORMOVIMENTO) As Total FROM Caixa INNER JOIN Lancamento ON Lancamento.LAN_CODIGO = Caixa.CAI_CODLANCAMENTO WHERE Caixa.CAI_DATAMOVIMENTO BETWEEN :dataini AND :datafin and Lancamento.LAN_NOME = :nomeconta Group by Lancamento.LAN_NOME; Adicionei dois QRDBText e fiz os seguintes procedimentos: QRDBTextLanche - ligado Dataset: Q_RelLanche Datafield: Total QRDBTextAjudaCusto - ligado Dataset: Q_RelAjudacusto Datafield: Total Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 31, 2014 1) O select que executou estava como o abaixo quando executou e trouxe apenas uma conta? Como você testou, no console do access ou no seu relatório? SELECT Lancamento.LAN_NOME, Sum(Caixa.CAI_VALORMOVIMENTO) As Total FROM Caixa INNER JOIN Lancamento ON Lancamento.LAN_CODIGO = Caixa.CAI_CODLANCAMENTO WHERE Caixa.CAI_DATAMOVIMENTO BETWEEN :dataini AND :datafin and Group by Lancamento.LAN_NOME Order by Lancamento.LAN_NOME; //Incluí aqui o order by para exibir o retorno ordenado Se está retornando apenas um registro de lançamento, está um pouco estranho, a menos que na sua tabela caixa não exista nenhum outro lançamento cujo Lancamento.LAN_CODIGO = Caixa.CAI_CODLANCAMENTO... ai retornaria apenas um registro mesmo... ou a forma como está consultando o retorno do sql não é a correta.... 2) Os seus qrdbtext estão dentro de uma banda detail? Se não, aconselho a por ambos nela para poder pegar o retorno em caso de múltiplas linhas a partir da consulta e imprimir sem ter que por vários componentes qrdbtext. Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 31, 2014 Chrnos, fiz os testes que me passou incluindo o Código, ficou perfeito agora. Está trazendo o somatório por conta, na banda Detail do Quickreport Uma coisa que esqueci de dizer e fazer antes era ter ligado o Dataset do Quickreport na ADOQuery única. Uma pergunta. Neste relatório, eu adicionei os QRLabel com o nome de cada conta para ficar ao lado de cada soma. Acontece que os QRLabel estão duplicando assim: Ajuda de Custo: 60,00 (este é o somatório da ajuda de custo) Lanche: 60,00 Ajuda de Custo: 50,00 (este é o somatório do lanche) Lanche: 50,00 Estão na banda detail. Não estou conseguindo resolver. Obrigado. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 31, 2014 Quais as bands que está usando no seu quickreport? E qual seria o layout do relatório de saída? Precisa agrupar algum dado ainda? Não é mais simples usar só os qrdbtext, um pro campo do nome do lançamento, outro pro total e eliminar os qrlabel? Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 31, 2014 Quanto a substituição do QRLabel por QRDBText ( Fantástico, já substituí) mas continua duplicando agora desta forma: Ajuda de Custo: 60,00 (este é o somatório da ajuda de custo) Ajuda de Custo: 60,00 Lanche: 50,00 (este é o somatório do lanche) Lanche: 50,00 As Bands que estou usando: Page Header para cabeçalho Detail onde estão os QRDBText (tanto para os títulos quanto para a soma de cada conta) Summary Onde preciso trazer o total de todas as contas. Você falou num ponto importante, preciso agrupar também pelo campo Caixa.CAI_TIPO Quando é saida ele grava a letra 'S' no campo CAI_TIPO na tabela Caixa e quando é entrada ele grava a letra 'E' Obrigado mais uma vez. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 31, 2014 Para agrupar os dados por mais este campo, basta incluir o mesmo no seu sql na forma abaixo: SELECT Caixa.CAI_TIPO, Lancamento.LAN_NOME, Sum(Caixa.CAI_VALORMOVIMENTO) As Total FROM Caixa INNER JOIN Lancamento ON Lancamento.LAN_CODIGO = Caixa.CAI_CODLANCAMENTO WHERE Caixa.CAI_DATAMOVIMENTO BETWEEN :dataini AND :datafin and Group by Caixa.CAI_TIPO, Lancamento.LAN_NOME Order by Caixa.CAI_TIPO, Lancamento.LAN_NOME; //Incluí aqui o order by para exibir o retorno ordenado por entrada/saída Ps.: Se rodar no console do access, vai conseguir ver os dados agrupados sem precisar mexer no relatório... Quanto ao relatório, você quer ao final do relatório o total de todas as entradas/saídas somadas, é isto? E mostrando parcialmente um subtotal de entradas e saídas correto? Se for isso, terá que usar as bandas de grupo, numa estrutura como a sugerida neste link: http://www.planetadelphi.com.br/dica/3443/Totalizando%20no%20quickreport Estou sem o quickreport pra dar os nomes e pontos corretamente onde mexer, mas há muita coisa na web a respeito se pesquisar. Compartilhar este post Link para o post Compartilhar em outros sites
six 0 Denunciar post Postado Janeiro 31, 2014 Chrnos, perfeito Todas as modificações que me passou, já testei e estão funcionando inclusive a soma no QRExpr na band Summay Muito obrigado. Compartilhar este post Link para o post Compartilhar em outros sites