Manipular variáveis de subtotais

Bom dia pessoal,

Estou montando um sistema de fluxo de caixa que controla receitas e despesas. O sistema cadastra várias empresas e para cada empresa lança receitas e despesas.

Criei uma aplicação de consulta customizada lendo em mais de tabela. O problema é que quando executo a tabela ele totaliza receita e despesa somando-os.

Quero saber se tem como manipular isso, essas variáveis de totalizações para poder fazer subtotal = receitas - despesas.

O total global, no fim da consulta, eu consegui manipular fazendo no evento onFooter um select para receitas, outro para despesas, gravando o resultado em variáveis. Depois no evento OnGroupBy da quebra eu fiz:

{lancamentos.valor_sum} = ([total_receitas] - [total_despesas]);

Em que {lancamento.valor_sum} é a soma total do campo valor da tabela lancamento (na minha consulta tem mais de uma tabela).

Uma solução mais rápida seria lançar todas as despesas com valor negativo. Porém, isso complica um pouco na hora de montar os gráficos, fica estranho e feio.

Alguém pode me ajudar? Alguém sabe como fazer para manipular essas variáveis no exemplo, fazendo no subtotal de cada quebra mostrar receitas menos despesa?

Qual o nome campo que você usa para diferenciar se é despesa é receita? um exemplo na SQL:

SELECT
LancamentoID,
DataVencimento,
Descricao,
IF(TipoLancamento=‘D’, Valor, 0) AS ValorDespesa,
IF(TipoLancamento=‘R’, Valor, 0) AS ValorReceita
FROM
despesas_e_receitas
WHERE
DataPagamento IS NOT NULL

Ai só fazer a SQL testar a consulta no seu gerenciador de banco de dados, criar uma nova consulta no SC e colar e adaptar.

Criar um Campo Novo chamado ‘Saldo’, tipo Moeda 2 casas decimais:

E coloque isto dentro onRecord:

if (isset($_SaldoAcumulado)) {
$_SaldoAcumulado = $_SaldoAcumulado + ({ValorReceita}-{ValorDespesa});
}else {
$_SaldoAcumulado = {ValorReceita}-{ValorDespesa};
}

{Saldo}=$_SaldoAcumulado;

Mudar na Consulta para ficar assim:

A aplicação de consulta é gerada a partir do seguinte comando SQL:

SELECT
   lancamentos.id,
   lancamentos.empresa,
   lancamentos.data,
   lancamentos.grupo,
   lancamentos.item,
   lancamentos.tipo,
   lancamentos.valor,
   lancamentos.status,
   lancamentos.forma_pgto,
   lancamentos.anexo,
   gp_lancamentos.tipo
FROM
   lancamentos LEFT OUTER JOIN gp_lancamentos ON lancamentos.grupo = gp_lancamentos.id
ORDER BY
   lancamentos.data

A informação se é despesa ou receita está no campo lancamentos.grupo que na verdade vem de outra tabela e só registra 1 ou 2, 1 para receita e 2 para despesa.

Fiz um nível de quebra por empresa e em baixo de cada empresa, outra quebra por tipo (receita, despesa)

A consulta mostra assim:
Empresa 1
campo1 campo2 campo3 tipo valor
dados dados dados Receita 100,00
dados dados dados Receita 200,00
dados dados dados Receita 300,00
Total receita 600,00
dados dados dados Despesa 100,00
dados dados dados Despesa 200,00
Total despesa 300,00
Subtotal 300,00 -> (aqui está o problema, pois nao consigo mostrar aqui a diferença, o SC soma por default)
Empresa 2
campo1 campo2 campo3 tipo valor
dados dados dados Receita 200,00
dados dados dados Receita 200,00
dados dados dados Receita 300,00
Total receita 700,00
dados dados dados Despesa 400,00
dados dados dados Despesa 200,00
Total despesa 600,00
Subtotal 100,00 -> (aqui está o problema, pois nao consigo mostrar aqui a diferença, o SC soma por default)
Total global 400,00 -> (aqui consegui fazer a diferença global, conforme descrevi)

O que eu preciso é poder manipular as variáveis de subtotais, pois no exemplo acima, ele soma tudo e não faz a diferença de receitas - despesas.

Se quiser negativar o valor pode colocar assim no OnRecord:
if {lancamentos.grupo==2) {
{lancamentos.valor}*=-1; // Converte valor número em Negativo.
}

Estou usando a versão 7.1 do SC, se aplica da mesma forma?

Sim.