RES: [firebase-br] Consulta Muito Demorada com Left Join
Jony
jonyridel em yahoo.com.br
Sex Jul 29 17:34:44 -03 2005
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.
--
No virus found in this incoming message.
Checked by AVG Anti-Virus.
Version: 7.0.338 / Virus Database: 267.9.7/60 - Release Date: 28/7/2005
--
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.338 / Virus Database: 267.9.7/60 - Release Date: 28/7/2005
_______________________________________________________
Yahoo! Acesso Grátis - Internet rápida e grátis.
Instale o discador agora! http://br.acesso.yahoo.com/
Mais detalhes sobre a lista de discussão lista