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 

Pesquisa SQL - Delphi
Ir à página Anterior  1, 2
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10497
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Sex Fev 28, 2020 7:09 am    Assunto: Responder com Citação

Amigo, crie uma view no banco, vai simplificar o seu trabalho.


bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
imex
Moderador
Moderador


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

MensagemEnviada: Sex Fev 28, 2020 11:57 am    Assunto: Responder com Citação

Bom dia,

Experimente fazer uns testes com a versão abaixo:

Código:
with
    CTE_Agrupa as
    (
        select
            p.pro_codigo,
            p.pro_saldo,
            min(lan_data) as data_Inicial,
            sum(case when l.lan_situacao = 'E' then l.lan_qtde else 0 end) as Entrada,
            sum(case when l.lan_situacao = 'S' then l.lan_qtde else 0 end) as Saida
        from Produtos as p
        left join Lancamentos as l
            on l.lan_codigo = p.pro_codigo
        where
            (l.lan_codigo is null) or
            (l.lan_data between :DataIni and :DataFim)
        group by
            p.pro_codigo,
            p.pro_saldo
    ),

    CTE_SaldoIni as
    (
        select
            a.pro_codigo,
            coalesce(
                (select first 1 s.sal_saldo_inicial
                 from SaldoInicial as s
                 where
                     s.sal_codigo = a.pro_codigo and
                     s.sal_data >= a.data_inicial
                 order by
                     a.data_inicial), a.pro_saldo) as saldo_inicial,
            a.Entrada,
            a.Saida
        from CTE_Agrupa as a
    )

select
    pro_codigo,
    saldo_inicial,
    Entrada,
    Saida,
    saldo_inicial + Entrada - Saida as saldo_final
from CTE_SaldoIni


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
l.keiner
Novato
Novato


Registrado: Quarta-Feira, 29 de Janeiro de 2020
Mensagens: 12

MensagemEnviada: Qui Mar 19, 2020 11:26 pm    Assunto: Pesquisa SQL - DElphi Responder com Citação

Boa Noite
Desculpe pela demora no retorno, estava montando os relatorios na esperança que tinha funcionado seu ultimo codigo postado, mas não esta trazendo os valores corretos.

Ex: Tenho várias entradas ou saidas de um mesmo produto no mesmo dia, diferenças de segundos, minutos ou horas.
No relatorio ele esta trazendo o último registro gravado no dia, não considerando a hora, minuto e segundos.

Exemplo: Tenho Produto 10001 com saldo inicial de 10,5360 M³, faço os lançamentos

10001 19/03/2020 22:34:00 1,00 M³ Saida
10001 19/03/2020 22:35:00 10,00 M³ Entrada

Ao final deveria ter o saldo de 19,5360 M³, mas ele esta trazendo no reltório 18,5360 M³.

Mesmo no select estar "min(lan_data)", ele não esta considerando a hora, e sim o ultimo registro com a mesma data.
No relatorio ele esta fazendo os cálculos corretamente, porem ele traz o saldo inicial errado ai o calculo fica errado, conforme imagens

https://uploaddeimagens.com.br/imagens/relatorio-png-61f573c9-baf2-40c9-ab2f-1cf72b12290b
https://uploaddeimagens.com.br/imagens/banco-png-598982c7-ebf6-49b2-bcde-c87eecf4a2d8
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


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

MensagemEnviada: Sex Mar 20, 2020 2:30 pm    Assunto: Responder com Citação

Boa tarde,

Qual é o tipo de dados do campo lan_data? E do campo sal_data?
O registro é gravado primeiro na tabela de saldos ou na tabela de lançamentos? De onde é obtida a data e a hora para gravação?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
l.keiner
Novato
Novato


Registrado: Quarta-Feira, 29 de Janeiro de 2020
Mensagens: 12

MensagemEnviada: Qui Mar 26, 2020 9:10 pm    Assunto: Pesquisa SQL - DElphi Responder com Citação

Boa Noite

Lan_Data = TimeStamp
Sal_Data = TimeStamp

O Registro e gravado primeiro na Tabela Saldo_inicial e depois em Lançamentos.

A data e hora e captura de um DataTimePeicker, quando acesso o form, ele carrega a data e hora atual.

Linha de gravação
DM_Cadastros.FDQ_Saldo_InicialSAL_DATA.AsDateTime := E_Data.DateTime;
https://uploaddeimagens.com.br/imagens/4pZiBlc
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


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

MensagemEnviada: Sex Mar 27, 2020 11:28 am    Assunto: Responder com Citação

Bom dia,

Experimente alterar o campo utilizado no Order By da subquery, colocando o campo s.sal_data no lugar do campo a.data_inicial.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
l.keiner
Novato
Novato


Registrado: Quarta-Feira, 29 de Janeiro de 2020
Mensagens: 12

MensagemEnviada: Qui Abr 02, 2020 11:04 pm    Assunto: Pesquisa SQL - DElphi Responder com Citação

Boa Noite

Funcionou a sua ultima ajuda, trocando os campos...
Uma coisa que eu não entendi, vamos supor que este mês de abril eu não tenha feito nenhum lançamento ainda, somente no mês passado.
Se eu colocar para gerar o relatorio com data inicial de 01/04/20 e final 02/04/20, ele deveria trazer todos os registros da tabela produtos com os ultimos lançamentos feitos, mas ele não traz todos, ele deixa de fora justamente os produtos que tiveram lançamentos.

Ex: se eu der entrada ou saida nos produtos 1, 2 e 3 no mês passado, e gerar o relatorio com data inicial de 01/04/20 ele não vai listar estes 3 codigos, ele começa o relatorio pelo produto 4...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


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

MensagemEnviada: Sex Abr 03, 2020 9:08 am    Assunto: Responder com Citação

Bom dia,

Você fez alguma alteração na query? Se fez acho que você teria que postar a versão modificada.
Acho que a query que sugeri deveria retornar todos os produtos, tanto os que tem lançamentos no período como os que não tem. Inclusive esse foi um problema que estava ocorrendo antes e que a princípio tinha sido resolvido.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
l.keiner
Novato
Novato


Registrado: Quarta-Feira, 29 de Janeiro de 2020
Mensagens: 12

MensagemEnviada: Seg Abr 06, 2020 8:16 pm    Assunto: Pesquisa SQL - DElphi Responder com Citação

Boa Noite

Não modifiquei a query, esta conforme vc postou.
O Problema anterior, ele listava somente os produtos que tiveram entrada, agora se eu pesquisar este mês (04/20) sem ter feito nenhuma entrada ou saida, deveria listar todos movimentos do mês anterior,, mas esta ocultando justamente os valores que tiveram entradas ou saídas.

Na imagem anexo, pode ver que ele ocultou os registros codigos 10001, 10002, 10005, 10006, 10012 e 10014, justamente os registros que tiveram movimentações no mês 03/2020..
Agora, se eu fizer um lançamento nestes registros no mês 04, eles aparecem.

with CTE_Agrupa as(')
select p.pro_codigo, p.pro_saldo,
min(lan_data) as data_Inicial,
sum(case when l.lan_situacao = ''E'' then l.lan_qtde else 0 end) as Entrada,

sum(case when l.lan_situacao = ''S'' then l.lan_qtde else 0 end) as Saida
from Produtos as p left join Lancamentos as l
on l.lan_codigo = p.pro_codigo where
l.lan_codigo is null) or
l.lan_data between :DataIni and :DataFim group by p.pro_codigo, p.pro_saldo

'),
CTE_SaldoIni as (select a.pro_codigo,
coalesce(('
select first 1 s.sal_saldo_inicial from Saldo_Inicial as s
where s.sal_codigo = a.pro_codigo and s.sal_data >= a.data_inicial
order by s.sal_data), a.pro_saldo) as saldo_inicial, a.entrada, a.saida
from CTE_Agrupa as a)

select pro_codigo, saldo_inicial, Entrada, Saida, saldo_inicial + Entrada - Saida as saldo_final
from CTE_SaldoIni

https://ibb.co/ByQndSq
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


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

MensagemEnviada: Ter Abr 07, 2020 3:01 pm    Assunto: Responder com Citação

Boa tarde,

Experimente fazer uns testes com essa outra versão:

Código:
with
    CTE_Agrupa as
    (
        select
            p.pro_codigo,
            p.pro_saldo,
            min(lan_data) as data_Inicial,
            sum(case when l.lan_situacao = 'E' then l.lan_qtde else 0 end) as Entrada,
            sum(case when l.lan_situacao = 'S' then l.lan_qtde else 0 end) as Saida
        from Produtos as p
        left join Lancamentos as l
            on l.lan_codigo = p.pro_codigo and
               l.lan_data between :DataIni and :DataFim
        group by
            p.pro_codigo,
            p.pro_saldo
    ),

    CTE_SaldoIni as
    (
        select
            a.pro_codigo,
            coalesce(
                (select first 1 s.sal_saldo_inicial
                 from SaldoInicial as s
                 where
                     s.sal_codigo = a.pro_codigo and
                     s.sal_data >= a.data_inicial
                 order by
                     s.sal_data), a.pro_saldo) as saldo_inicial,
            a.Entrada,
            a.Saida
        from CTE_Agrupa as a
    )

select
    pro_codigo,
    saldo_inicial,
    Entrada,
    Saida,
    saldo_inicial + Entrada - Saida as saldo_final
from CTE_SaldoIni


Espero que ajude
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 -> Delphi Todos os horários são GMT - 3 Horas
Ir à página Anterior  1, 2
Página 2 de 2

 
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