[Resolvido] Ajuda com Consulta

Boa tarde amigos, sou novo no uso da ferramenta, e estou com uma duvida na montagem da minha aplicação.

Nesta tela, pretendo calcular todas as entradas e as saídas que os produtos tiveram. Os campos Entradas, Saídas e Giro não tem no meu banco, criei apenas na aplicação.

meu select principal ta assim:

SELECT
Codigo,
Descricao,
Data_Ult_Compra,
Data_Ult_Venda,
Saldo
FROM
produtos
ORDER BY
Codigo

para somar fiz assim:

select
razao.codigo,sum(razao.qtd) as ‘Soma Entradas’
from
razao, tipomov
where
tipomov.codigo = razao.codigo_mov
and
tipomov.ent_sai = ‘E’
and
razao.codigo = 3325;

Onde vai ler na minha tabela razão os registros das entradas e saídas, e filtrar apenas o que for do tipo ENTRADA, e então somar. Porém no caso ai eu coloquei apenas um produto que é o codigo 3325.

Minha duvida é, como faço para na aplicação ele atualizar o campo Entradas de cada produto na consulta?

Desculpe a ignorância mais toda ajuda sera bem vinda amigos.

Porque não faz tudo no SQL Principal?

Boa Tarde Haroldo.

Então amigo sou bem novato é minha primeira aplicação, acho que não saberia como fazer isso. Nesse select principal esta apenas os campos da tabela produto, não coloquei nada da tabela razão ou tipomov.

É que calcular as entradas também é apenas o primeiro passo, depois eu vou precisar calcular as saídas.

Alguma dica para me iluminar as ideias?

Independente do SC, tente construir sua Select (instrução SQL) com todas informações que precisa.

Nas colunas criadas manualmente tem a opção de lookup manual, onde vc pode colocar os selects citados abaixo em cada campo.

Muito obrigado Haroldo! Consegui fazer desse jeito que falou. Só tive um pequeno contratempo, alguns produtos que não houve movimentação de Saída e/ou Entradas, os respectivos campos aparecem sem nada. Coloquei valor Default 0 na configuração da lookup mais não funcionou… Como eu faço para que ele apareça com valor 0?

Mostre seu Select como está agora.

Bom dia Haroldo!

Select principal

SELECT
produtos.Codigo,
produtos.Descricao,
produtos.Data_Ult_Compra,
produtos.Data_Ult_Venda,
produtos.saldo,
razao.Data
FROM
razao,produtos
WHERE
produtos.codigo = razao.codigo
group BY
produtos.Codigo

Select do Lookup do campo:

select
sum(razao.qtd)
from
razao, tipomov
where
tipomov.codigo = razao.codigo_mov
and
tipomov.ent_sai = ‘E’
and
razao.codigo = {produtos.codigo};

Luis Fernandes,

Como o Haroldo sugeriu, poderia ter feito um único select mais ou menos conforme abaixo:

SELECT
PRODUTOS.CODIGO AS CODPRODUTO,
PRODUTOS.DESCRICAO AS DESCPRODUTO,
PRODUTOS.DATA_ULT_COMPRA AS DATA_ULT_COMPRA,
PRODUTOS.DATA_ULT_VENDA AS DATA_ULT_VENDA,
PRODUTOS.SALDO AS SALDO,
CASE
WHEN TIPOMOV.ENT_SAI = ‘E’ THEN SUM(RAZAO.QTD)
ELSE 0
END AS TOTAL_ENTRADAS,
CASE
WHEN TIPOMOV.ENT_SAI = ‘S’ THEN SUM(RAZAO.QTD)
ELSE 0
END AS TOTAL_SAIDAS
FROM
PRODUTOS
LEFT OUTER JOIN RAZAO ON PRODUTOS.CODIGO=RAZAO.CODIGO
LEFT OUTER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
GROUP BY PRODUTOS.CODIGO,PRODUTOS.DESCRICAO,PRODUTOS.DATA_ULT_COMPRA,PRODUTOS.DATA_ULT_VENDA,PRODUTOS.SALDO
ORDER BY CODIGO

Veja se ajuda…

Como utilizamos CASE será necessário criar uma view para não ter problema no ScriptCase… daí vc cria a aplicação do SC a partir dessa view como sendo a tabela com as informações… por exemplo:
CREATE OR REPLACE VIEW PRODUTORAZAO AS
SELECT
PRODUTOS.CODIGO AS CODPRODUTO,
PRODUTOS.DESCRICAO AS DESCPRODUTO,
PRODUTOS.DATA_ULT_COMPRA AS DATA_ULT_COMPRA,
PRODUTOS.DATA_ULT_VENDA AS DATA_ULT_VENDA,
PRODUTOS.SALDO AS SALDO,
CASE
WHEN TIPOMOV.ENT_SAI = ‘E’ THEN SUM(RAZAO.QTD)
ELSE 0
END AS TOTAL_ENTRADAS,
CASE
WHEN TIPOMOV.ENT_SAI = ‘S’ THEN SUM(RAZAO.QTD)
ELSE 0
END AS TOTAL_SAIDAS
FROM
PRODUTOS
LEFT OUTER JOIN RAZAO ON PRODUTOS.CODIGO=RAZAO.CODIGO
LEFT OUTER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
GROUP BY PRODUTOS.CODIGO,PRODUTOS.DESCRICAO,PRODUTOS.DATA_ULT_COMPRA,PRODUTOS.DATA_ULT_VENDA,PRODUTOS.SALDO

Espero que ajude…

Devailton, obrigado por participar do tópico.

Esse segundo select criado a view que vc colocou, eu teria que colocar no SQL principal da minha aplicação?

Tentei e deu erro na hora de salvar…

Não… esse segundo select cria a view no banco de dados… essa view será armazenada no banco de dados e ficará “parecendo” como uma nova tabela para você… depois de criar a view no banco de dados vc poderá fazer um novo select, parecido com SELECT * FROM PRODUTORAZAO… Nesse caso, crie a aplicação consulta a partir da view (parecido com tabela)… entende?

Você deve criar a view apenas se tiver algum problema com o primeiro select… porque o scriptcase não trabalha bem Case When diretamente… daí a necessidade de criar view… se seu banco de dados tiver decode… pode alterar o case when por decode que funcionará sem a necessidade de criar view…

O primeiro select ou o segundo que cria a view substituem o seu select principal, ou seja, se eu fiz tudo certo, você não terá a necessidade de outro select e tal…

Bacana Devailton!

Criei a view no banco de dados, e iniciei uma nova aplicação selecionando a view, ele executa bonitinho, porem as entradas e saídas ele esta se perdendo, as vezes ele duplica os valores, as vezes ele joga tudo nas entradas… outra hora joga tudo na saída…

Bom, coloquei o case dentro lookup e funcionou:

select
CASE
WHEN
TIPOMOV.ENT_SAI = ‘E’ THEN SUM(RAZAO.QTD)
ELSE 0
END AS
TOTAL_ENTRADAS
FROM
PRODUTOS
LEFT OUTER JOIN RAZAO ON PRODUTOS.CODIGO=RAZAO.CODIGO
LEFT OUTER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
where
tipomov.codigo = razao.codigo_mov
and
tipomov.ent_sai = ‘E’
and
razao.codigo = {produtos.codigo}

Porem… Percebi que assim não vou conseguir manipular esses campos entrada e saídas que criei manualmente… pois vou precisar aplicar filtro de data…

Alguma dica, ou solução no caso do select da view que calcula errado as entradas e saídas?

Desde já agradeço a atenção de todos

Olá Luis Fernandes,

Eu devo ter errado nos relacionamentos das suas tabelas por isso valor entrada/saída não ficou correto… mas foi o interpretei naquele momento que olhei para os selects que havia feito…

Mas essa é a idéia…

Foque na query da view… corrija ela, deixe-a certinha… aí não vai precisar de usar lookup na aplicação…

Se eu tivesse como testar te ajudava mais.

Pior que o relacionamento esta correto…

Mais vou ver o que faço aqui…

Analisando, vi que naquela query, ele estava jogando tudo no ultimo registro, por exemplo se meu ultimo registro era uma saida, ele somava tudo em saídas.

Montei uma outra query com mais select, possivelmente estou fazendo trabalho a mais, porem o resultado foi satisfatorio.

SELECT
PRODUTOS.CODIGO AS CODPRODUTO,
PRODUTOS.DESCRICAO AS DESCPRODUTO,
PRODUTOS.DATA_ULT_COMPRA AS DATA_ULT_COMPRA,
PRODUTOS.DATA_ULT_VENDA AS DATA_ULT_VENDA,
PRODUTOS.SALDO AS SALDO,
if ((Select Sum(Razao.Qtd) From Razao
INNER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
Where Razao.Codigo=Produtos.Codigo and TIPOMOV.ENT_SAI = ‘E’)> 0,
(Select Sum(Razao.Qtd) From Razao
INNER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
Where Razao.Codigo=Produtos.Codigo and TIPOMOV.ENT_SAI = ‘E’), 0) as TOTAL_ENTRADAS,
if ((Select Sum(Razao.Qtd) From Razao
INNER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
Where Razao.Codigo=Produtos.Codigo and TIPOMOV.ENT_SAI = ‘S’) > 0,
(Select Sum(Razao.Qtd) From Razao
INNER JOIN TIPOMOV ON RAZAO.CODIGO_MOV=TIPOMOV.CODIGO
Where Razao.Codigo=Produtos.Codigo and TIPOMOV.ENT_SAI = ‘S’),0) as TOTAL_SAIDAS
FROM
PRODUTOS

agradeço a todos pela ajuda, Abraço!