ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Gerar Fluxo de caixa tabela Cpagar e Creceber SQL

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
jescudeiro
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2012
Mensagens: 261
Localização: ribeirao preto

MensagemEnviada: Qui Mar 05, 2015 1:14 pm    Assunto: Gerar Fluxo de caixa tabela Cpagar e Creceber SQL Responder com Citação

Boa tarde,
Tenho duas tabelas Cpagar e Creceber no SqlServer 2008 e Delphi 7.
Preciso montar uma consulta de fluxo de caixa como exemplo abaixo.


Data Valor Pagar Valor Receber Saldo
04/03/15 0,00 50,00 50,00
05/03/15 10,00 15,00 55,00
--------------------------------------------------------------
10,00 65,00 55,00

muito obrigado
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Mar 05, 2015 2:48 pm    Assunto: Responder com Citação

Boa tarde,

Experimente mais ou menos dessa forma:

Código:
with
    CTE_P as
    (
        select
            Data,
            sum(Valor) as Valor
        from Cpagar
        group by
            Data
    ),

    CTE_R as
    (
        select
            Data,
            sum(Valor) as Valor
        from Creceber
        group by
            Data
    ),

    CTE_Join as
    (
        select
            coalesce(p.Data, r.Data) as Data,
            coalesce(p.Valor, 0) as ValorPagar,
            coalesce(r.Valor, 0) as ValorReceber
        from CTE_P as p
        full join CTE_R as r
            on r.Data = p.Data
    )

select
    j.Data,
    j.ValorPagar,
    j.ValorReceber,
    (select sum(s.ValorReceber - s.ValorPagar)
     from CTE_Join as s
     where s.Data < j.Data) + j.ValorReceber - j.ValorPagar as Saldo
from CTE_Join as j


Espero que ajude.


Editado pela última vez por imex em Sex Set 29, 2023 12:11 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jescudeiro
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2012
Mensagens: 261
Localização: ribeirao preto

MensagemEnviada: Sex Mar 06, 2015 10:38 am    Assunto: Fluxo de caixa Responder com Citação

Boa tarde, Imex e muito obrigado pela Grande Ajuda...

Só tem um detalhe no script que nao consegui entender, o campo saldo da primeira linha sai com valor null..
exemplo

Data Pagar Receber Saldo
10-03-2015 499,99 300,00 null
11-03-2015 499,00 300,00 -399,98
12-03-2015 499,99 300,00 -599,97

muito obrigado mais uma vez Abraço
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Mar 06, 2015 11:42 am    Assunto: Responder com Citação

Bom dia,

Experimente acrescentar o Coalesce na subquery da parte final:

Código:
    coalesce((select sum(s.ValorReceber - s.ValorPagar)
              from CTE_Join as s
              where s.Data < j.Data), 0) +
    j.ValorReceber -
    j.ValorPagar as Saldo


Espero que ajude.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
jescudeiro
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 2 de Abril de 2012
Mensagens: 261
Localização: ribeirao preto

MensagemEnviada: Sex Mar 06, 2015 12:03 pm    Assunto: [Resolvido] Responder com Citação

Imex, muito obrigado..Parabéns....

Abraço
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Dez 19, 2016 7:01 am    Assunto: Responder com Citação

Revivendo esse tópico.

imex, parabéns pelo codigo, muito bom.
Se importa de me ajudar com 2 coisas?

Onde posso definir a data que eu desejar para gerar esse relatorio? Tipo através de 2 datetimepicker?

De que forma eu poderia mostrar esse resultado também num grafico?

Obrigado.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Dez 19, 2016 8:02 am    Assunto: Responder com Citação

Para definir a data, você vai ter que passar o valor da mesma por parâmetro, ficando assim:

Código:
with
    CTE_P as
    (
        select
            Data,
            sum(Valor) as Valor
        from Cpagar
        group by
            Data
    ),

    CTE_R as
    (
        select
            Data,
            sum(Valor) as Valor
        from Creceber
        group by
            Data
    ),

    CTE_Join as
    (
        select
            coalesce(p.Data, r.Data) as Data,
            coalesce(p.Valor, 0) as ValorPagar,
            coalesce(r.Valor, 0) as ValorReceber
        from CTE_P as p
        full join CTE_R as r
            on r.Data = p.Data
    )

select
    j.Data,
    j.ValorPagar,
    j.ValorReceber,
    (select sum(s.ValorReceber - s.ValorPagar)
     from CTE_Join as s
     where s.Data < j.Data) + j.ValorReceber - j.ValorPagar as Saldo
from CTE_Join as j
where j.data = :Data


quanto aos gráficos, pode utilizar os componentes da guia TeeChart do próprio Delphi
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Dez 19, 2016 10:37 am    Assunto: Responder com Citação

Opa, bom dia.

ok, entendi.

Estou testando tudo no ibexpert, mas estou com dificuldades de colocar isso no delphi. da erro que não reconhece o CTE_P, por exemplo.

Sobre o componente de grafico, vi uns tutoriais, mas com uma sql desse tamanho não sei bem como fazer a ligação.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Dez 19, 2016 10:56 am    Assunto: Responder com Citação

renanbg escreveu:
Opa, bom dia.

ok, entendi.

Estou testando tudo no ibexpert, mas estou com dificuldades de colocar isso no delphi. da erro que não reconhece o CTE_P, por exemplo.

Sobre o componente de grafico, vi uns tutoriais, mas com uma sql desse tamanho não sei bem como fazer a ligação.


Quanto ao erro de não reconhecer o CTE, poste como ficou o código no Delphi p/ o pessoal poder avaliar.

Quanto a ligação dos campos, esse sql vai retornar os campo:
Citação:
j.Data,
ValorPagar,
ValorReceber,
Saldo


toda a estrutura montada é para conseguir esses 3 valores, e é em cima desses 3 que você vai trabalhar no seu gráfoco
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Dez 19, 2016 3:29 pm    Assunto: Responder com Citação

Alterei a ultima linha para:

Código:
where j.data >= :INICIO and j.data <= :FIM


Criei esses 2 parametros direto na propriedade params da query

Joguei todo o codigo da SQL dentro da propriedade SQL da query, no object inspector.

Aí chamei, por um button, dessa forma:

Código:
close;
parambyname('INICIO').asdate:= datetimepicker1.date;
parambyname('FIM').asdate:= datetimepicker2.date;
open;


Só que não está trazendo os dados de acordo, como trazia no ibexpert.

Fora isso, percebi que o saldo nunca inicia corretamente, pois ele esta pegando valores anteriores as datas informadas.

O saldo só inicia certo, caso eu não use os parametros para filtrar por periodo.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Dez 19, 2016 3:57 pm    Assunto: Responder com Citação

tenta desse jeito aqui:
Código:
with
    CTE_P as
    (
        select
            Data,
            sum(Valor) as Valor
        from Cpagar
        group by
            Data
    ),

    CTE_R as
    (
        select
            Data,
            sum(Valor) as Valor
        from Creceber
        group by
            Data
    ),

    CTE_Join as
    (
        select
            coalesce(p.Data, r.Data) as Data,
            coalesce(p.Valor, 0) as ValorPagar,
            coalesce(r.Valor, 0) as ValorReceber
        from CTE_P as p
        full join CTE_R as r
            on r.Data = p.Data
        where p.Data Between :DataIni and :DataFim
    )

select
    j.Data,
    j.ValorPagar,
    j.ValorReceber,
    (select sum(s.ValorReceber - s.ValorPagar)
     from CTE_Join as s
     where s.Data < j.Data) + j.ValorReceber - j.ValorPagar as Saldo
from CTE_Join as j
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Dez 19, 2016 4:19 pm    Assunto: Responder com Citação

No ibexpert rodou blz. Agora traz o saldo certo, de acordo com o periodo.

Estou saindo do trabalho, amanhã vou tentar novamente botar isso na query e ver se descubro porque lá não está filtrando direito.

Postarei aqui.

obrigado pela ajuda.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
leo_cj
Colaborador
Colaborador


Registrado: Sábado, 26 de Março de 2011
Mensagens: 1335

MensagemEnviada: Seg Dez 19, 2016 4:27 pm    Assunto: Responder com Citação

ok, mas chegou a testar esse último código na query?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Ter Dez 20, 2016 9:40 am    Assunto: Responder com Citação

Bom dia Leo.

Acabei de testar na query. Como antes eu joguei toda essa instrução na propriedade SQl e atraves de um button chamei assim

Código:
close;
parambyname('DataIni').asdate:= datetimepicker1.date;
parambyname('DataFim').asdate:= datetimepicker2.date;
open;


Rodou com perfeição.

Agora me ocorreu uma coisa em relação as contas a receber, via boleto.
Neste caso, se eu filtrar as contas que vencem hoje, estaria fazendo errado, pois o credito delas se dará amanhã. De que forma você trataria isso?

Outra curiosidade, suponhamos que eu tenha saldo em minhas contas bancárias...Eu poderia de alguma forma trazer esse saldo para o fluxo? Assim eu saberia exatamente a data que vou precisar buscar dinheiro, caso necessite.

Do grafico ainda não sobrei tempo, mas em breve vou ver se consigo montar um grafico em linhas para facilitar o entendimento.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
renanbg
Colaborador
Colaborador


Registrado: Quinta-Feira, 12 de Abril de 2012
Mensagens: 1158

MensagemEnviada: Seg Jan 02, 2017 11:43 am    Assunto: Responder com Citação

Olá amigos.

Alguem sabe como pegar as contas que vencem 1 dia antes e botar nessa SQL?

Além disso precisaria pegar o valor que tenho nos meus bancos e considerar.

Qualquer ajuda é bem vinda
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB