RES: [firebase-br] Consulta Muito Demorada com Left Join

Ton hevertonc em hotmail.com
Sex Jul 29 17:22:25 -03 2005


   Olá Valdir...

   Você pode resolver isso com uma procedure...

   Traz a soma de todas as entradas e todas as saídas (num mesmo select dá,
usando group by) e depois faz os cálculo que precisa com o atual do produto
e retorna.

   Mais ou menos assim:

   SELECT OPERACAO,
          SUM(QUANTIDADE)
     FROM MOV_ESTOQUE
    WHERE (Não sei como tu vai fazer, pois não vi campo de data na tabela,
mas a condição que retorna só o que foi após a data que você quer)
    GROUP BY OPERACAO;

   E depois o select simples para o produto, ou um FOR SELECT para o produto
e o atual e dentro do bloco DO BEGIM END, este select para fazer o
cálculo...

   Esse problema é muito comum, resolvemos isso adotando outra maneira de
controlar o estoque, usando uma tabela de KARDEX, a QTD não fica mais no
produto, no Kardex temos:
   ID_KARDEX
   ID_PRODUTO
   ID_ALMOX
   OPERACAO (E/S)
  (Se Necessário (Origem e Destino) no caso de transferências entre estoques
de uma mesma empresa ou filiais)
   Quantidade
   Valor Unitário
   Estoque

   Como é uma procedure que vai fazer isso, ela pega o último lançamento do
ALMOX escolhido, Soma (E) ou Subtrai (S) a Quantidade no valor do ESTOQUE e
grava, assim, em cada registro, você tem o total do estoque em cada
lançamento, e para pegar o estoque atual, é só pegar o último lançamento
para aquele produto no ALMOX informado e retorna.

        Ton
Analista de Sistemas
 DotCom Informática

"A informação não é um produto,
mas sim a matéria prima." (Ton)

-----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
 




Mais detalhes sobre a lista de discussão lista