RES: [firebase-br] Consulta Muito Demorada com Left Join
Fausto
fausto.s.a em uol.com.br
Sex Jul 29 18:08:44 -03 2005
Ué.. vamos supor que ME.OPERACAO = 'E', seja entrada e ME.OPERACAO =
'S' saida
Se for assim o case abaixo não esta fazendo distinção do tipo de
operação, esta somando tudo em saidas.
Jony, me corrija se eu estiver errado.
Fausto
Jony escreveu:
>Valdir eu errei no Select de soma coloquei um Case só qdo era pra ter dois
>um para cada situação.
> CASE ME.OPERACAO
> WHEN 'E' THEN SUM (E.QUANTIDADE),
> ELSE 0 END AS SAIDAS
> END,
> CASE ME.OPERACAO
> WHEN 'S' THEN SUM (E.QUANTIDADE),
> ELSE 0 END AS SAIDAS
> END
>
>-----Mensagem original-----
>De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
>nome de Jony
>Enviada em: sexta-feira, 29 de julho de 2005 17:35
>Para: 'FireBase'
>Assunto: RES: [firebase-br] Consulta Muito Demorada com Left Join
>
>Experimente fazer uma procedure
>
>Parâmetros de Entrada:
>PI_DATA
>
>Parâmetros de saída:
>PO_CODPRO,
>PO_DESCRICAO,
>PO_SALDO
>
>Variáveis:
>Vn_Entradas
>Vn_Saidas
>
>// varrendo o cadastro de produtos
>For SELECT P.CODIGO,
> P.DESCRICAO
> FROM PRODUTOS P INTO :PO_CODPRO, :PO_DESCRICAO do
>Begin
> SELECT
> CASE ME.OPERACAO
> WHEN 'E' THEN SUM (E.QUANTIDADE) END AS ENTRADAS,
> ELSE SUM(ME.QUANTIDADE) END AS SAIDAS
> END
> FROM
> MOVIESTOQUE ME
> WHERE
> ME.PRODUTO = :PO_CODPRO
> AND
> ME.DATA > :PI_DATA
> INTO :VN_ENTRADAS, :VN_SAIDAS;
>
> PO_SALDO := VN_ENTRADAS - VN_SAIDAS;
>
> SUSPEND;
>
>End;
>
>Depois é so fazer um select da procedure
>SELECT * FROM PROCEDURE("DATA")
>
>Espero ter ajudado,
>
>----------------------------
>Jony Ridel
>Grupo Êxito - Salvador - BA
>----------------------------
>
>-----Mensagem original-----
>De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
>nome de Valdir Dill
>Enviada em: sexta-feira, 29 de julho de 2005 17:03
>Para: lista em firebase.com.br
>Assunto: [firebase-br] Consulta Muito Demorada com Left Join
>
>Tenho a tabela PRODUTOS com os campos CODIGO e ATUAL. ATUAL é o campo onde
>gravo o saldo do estoque do produto. Tenho outra tabela MOV_ESTOQUE com os
>campos NR_SEQUENCIAL, PRODUTO(gravo o código do produto), OPERACAO(gravo 'E'
>
>ou 'S') e QUANTIDADE.
>Como se pode ver são tabelas básicas de cadastro e movimento de produtos.
>Minha dúvida/necessidade: preciso fazer um relatório que onde seja listado o
>
>CODIGO e saldo ATUAL de cada produto. Se fosse só isso seria simples, pois
>eu imprimiria apenas os dois campos (CODIGO e ATUAL) do cadastro de
>produtos. O problema é que preciso que esse saldo seja com posição em uma
>data determinada pelo usuário. Assim, tenho que pegar o saldo ATUAL do
>cadastro de produtos e somar as saídas('S') e diminuir as entradas('E') que
>foram feitas na tabela MOV_ESTOQUE após a data informada pelo usuário.
>Minha dúvida é como montar a constula SQL.
>Já tentei de várias formas e não dá certo. A única forma é que consegui foi
>a forma abaixo
>
>"
>SELECT P.CODIGO, P.DESCRICAO, P.UNIDADE, P.MARCA, P.ESTOQUEMINIMO, P.ATUAL,
>CASE ME.OPERACAO WHEN 'E' THEN SUM (E.QUANTIDADE) END AS ENTRADAS, CASE
>ME.OPERACAO WHEN 'S' THEN SUM(ME.QUANTIDADE) END AS SAIDAS FROM PRODUTOS P
>INNER JOIN MOVIESTOQUE ME ON (ME.PRODUTO = P.CODIGO AND ME.DATA
> >:VDataPosicao) P.CODIGO, P.DESCRICAO, P.UNIDADE, P.MARCA, P.ESTOQUEMINIMO,
>
>P.ATUAL
>"
>
>O problema é que essa consulta fica muito, mas muito demorada mesmo,
>tornando inviável dessa forma.
>
>Já tentei o INNER em vez de LEFT, mas daí não mostra os produtos que não
>tiveram movimento no período.
>
>
>Utilizo o Firebird 1.5. Se você conhece bem o esse BD, por gentileza, me
>ajude a fazer esse relatório. Se tiver qualquer dica que possa me dar uma
>luz, já seria bom.
>
>Obrigado.
>
>
>
>
>
>
>
Mais detalhes sobre a lista de discussão lista