Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

six

Soma de contas no quickreport

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.