Fórum Consulta Muito Demorada com Left Join #51891
29/07/2005
0
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 selecionada.
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.
Obriado.
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 selecionada.
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.
Obriado.
Valdirdill
Curtir tópico
+ 0
Responder
Posts
03/08/2005
Agostinho
tente usar assim
SELECT P.CODIGO,
P.DESCRICAO,
P.UNIDADE,
P.MARCA,
P.ESTOQUEMINIMO,
P.ATUAL,
(select sum(quantidade) from movestoque where movestoque.produto = produto.codigo and movestoque.opercao = ´E´) as entradas
(select sum(quantidade) from movestoque where movestoque.produto = produto.codigo and movestoque.opercao = ´S´) as saidas
FROM PRODUTOS P
SELECT P.CODIGO,
P.DESCRICAO,
P.UNIDADE,
P.MARCA,
P.ESTOQUEMINIMO,
P.ATUAL,
(select sum(quantidade) from movestoque where movestoque.produto = produto.codigo and movestoque.opercao = ´E´) as entradas
(select sum(quantidade) from movestoque where movestoque.produto = produto.codigo and movestoque.opercao = ´S´) as saidas
FROM PRODUTOS P
Responder
Gostei + 0
03/08/2005
Afarias
eu daria preferência a usar um stored procedure
T+
T+
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)