- Este tópico contém 2 respostas, 2 vozes e foi atualizado pela última vez 11 anos, 11 meses atrás por JOSIMAR ALVES.
-
AutorPosts
-
21 de dezembro de 2012 às 5:04 pm #104943JOSIMAR ALVESParticipante
A situação:
Fui incumbido desenvolver um relatorio de saldo de titulos aqui da empresa.
Através de informações obtidas juntamente com o solicitante do relatorio cheguei ao Select que se segue. Tenho duas tabelas que onde os dados estão gravados: a primeira (SE2010) contem os dados dos titulos, a segunda (SE5010) contem os dados referentes aos pagamentos realizados para aquele titulo.Os dados são obtidos através da seguinte maneira:
[color=#FF0000]Obs.: O BD aqui não relacional, o relacionamento entre as tabelas e feito apenas com indices não contendo chaves primarias ou estrageiras.
[/color]
1º – O primeiro Select traz os campos principais do titulo a serem impressos no relatorio e tambem o valor total do mesmo.
2º – Os titulos são filtrados através da clausula Having de acordo com os parametros passados pelo usuario.
3º – O segundo Select fica responsavel por traz os valores pagos ate o momento, para os titulos.Eis o problema:
Atualmente o select está atendendo parcialmente os requisitos do usuario, digo parcialmente porque o problema so com alguns titulos que diferem-se entre a tabelas (SE2/SE5) apenas pelo campo e2_origem pertencente a tabela se2010, e devido isso, ao executar o Select o valor pago e repetido para os titulos que são “parecidos”. Tentei realizar o select(tmp2) utilizando as duas tabelas, no entando os valores trazidos não são corretos.
Ficaria muito grato se alguem pudesse me ajudar.
select tmp1.filial,
tmp1.titulo,
tmp1.prefixo,
tmp1.fornecedor,
tmp1.tipo,
tmp1.natureza,
tmp1.loja,
tmp1.nomefor,
tmp1.emissao,
tmp1.origem,
tmp1.valortotal,
tmp2.valorpago
from
(select se2.e2_filial filial,
se2.e2_num titulo,
se2.e2_fornece fornecedor,
se2.e2_tipo tipo,
se2.e2_naturez natureza,
se2.e2_loja loja,
se2.e2_nomfor nomefor,
se2.e2_emis1 emissao,
se2.e2_origem origem,
se2.e2_prefixo prefixo
,sum(se2.e2_valor) valortotal
from se2010 se2
where se2.e2_filial between '01' and '21'
and se2.e2_emis1 between '20000101' and '20121031'
and se2.e2_fornece between ' ' and 'zzzzzz'
and se2.e2_loja between ' ' and 'zzzz'
and se2.e2_naturez between ' ' and 'zzzzzz'
and se2.e2_tipo between ' ' and 'zz'
and se2.e2_status <> 'b'
and se2.d_e_l_e_t_ = ' '
group by se2.e2_filial,
se2.e2_num,
se2.e2_fornece,
se2.e2_tipo,
se2.e2_naturez,
se2.e2_loja,
se2.e2_nomfor,
se2.e2_emis1,
se2.e2_origem,
se2.e2_prefixo
having ( se2.e2_filial,
se2.e2_num,
se2.e2_fornece,
se2.e2_tipo,
se2.e2_naturez,
se2.e2_loja,
se2.e2_nomfor,
se2.e2_emis1,
se2.e2_origem,
se2.e2_prefixo) in (select se2.e2_filial,
se2.e2_num,
se2.e2_fornece,
se2.e2_tipo,
se2.e2_naturez,
se2.e2_loja,
se2.e2_nomfor,
se2.e2_emis1,
se2.e2_origem,
se2.e2_prefixo
from se2010 se2
where se2.e2_vencrea between '20121101' and '20600130'
and se2.e2_filial between '01' and '21'
and se2.e2_status <> 'b'
and se2.d_e_l_e_t_ = ' '
)
order by se2.e2_filial,
se2.e2_num,
se2.e2_fornece
) tmp1,
(select se5.e5_filial filial,
se5.e5_numero titulo,
se5.e5_clifor fornecedor,
se5.e5_prefixo prefixo
,sum(se5.e5_valor)valorpago
from se5010 se5
where se5.e5_filial between '01' and '21'
and se5.e5_clifor between ' ' and 'zzzzzz'
and se5.e5_loja between ' ' and 'zzzz'
and se5.e5_naturez between ' ' and 'zzzzzz'
and se5.e5_tipo between ' ' and 'zz'
and se5.e5_data <= '20121031' and se5.e5_tipodoc not in ('jr','es','ba','mt') and se5.e5_motbx not in (' ','dsd') and se5.d_e_l_e_t_ = ' ' group by se5.e5_filial, se5.e5_numero, se5.e5_clifor, se5.e5_prefixo order by se5.e5_filial, se5.e5_numero, se5.e5_clifor, se5.e5_prefixo ) tmp2 where tmp1.filial = tmp2.filial and tmp1.titulo = tmp2.titulo and tmp1.fornecedor = tmp2.fornecedor and tmp1.prefixo = tmp2.prefixo order by tmp1.filial , tmp1.titulo, tmp1.fornecedor;21 de dezembro de 2012 às 5:29 pm #104944rmanParticipante@Josimar
Não consegui visualizar o problema. 😯
Analisando a solução, não entendi o uso do HAVING, o filtro pode ser feito direto no WHERE do SELECT da tabela se2010.
Apesar de não ter a definição da chave estrangeira implementada, a ligação das tabelas pode ser feita normalmente, é só identificar os campos de ligação.
21 de dezembro de 2012 às 7:04 pm #104945JOSIMAR ALVESParticipanteAgradeco sua resposta rman.
Usei o Having pelo seguinte fato:
Existem titulos que são parcelados, logo é gravado um registro para cada parcela (SE2010).
No entanto para cada parcela existe uma data de vencimento diferente, ficaria inviavel
eu conseguir o valor total do titulo, caso usa-se o campo E2_VENCREA como filtro inicialmente, pois poderia ocorrer de uma das parcelas do titulo não estar no intervalo, por isso usei o Having.Sobre o problema, deixa eu explicar melhor:
Tabela SE2010
Titulo 1
e2_filial e2_num e2_prefixo e2_tipo e2_naturez e2_fornece e2_loja e2_origem e2_dtemis1
80 12345 09 NF 8765 F098888 009 FIN100 20120306Titulo 2
e2_filial e2_num e2_prefixo e2_tipo e2_naturez e2_fornece e2_loja e2_origem e2_dtemis1
80 12345 09 NF 8765 F098888 009 FAT800 20120211Existem situações como o exemplo acima, e quando executo todo o select ele traz o mesmo valor pago para os dois titulos, pelo fato de no select da SE5 não conter o campo correspondente ao e2_origem ou e2_emis1.
Os campos que fazem ligação entre as tabelas são:
SE2010 SE5010
E2_Filial -> E5_Filial
E2_Num -> E5_Numero
E2_Tipo -> E5_Tipo
E2_Fornece -> E5_CliFor
E2_Loja -> E5_Loja
E2_Naturez -> E5_Naturez
E2_Parcela -> E5_ParcelaObs.: Pelo fato de precisar obter o valor total do titulo e o valor total pago não uso o campo e2_parcela como parametro de agrupamento.
-
AutorPosts
- Você deve fazer login para responder a este tópico.