Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Demolion

access - subtração em consulta multiplica valores

Recommended Posts

Demolion

Codifiquei as seguintes consultas:

SomaEntradasTotais:

SELECT artigos.Nome, Sum(Entradas.quantidade_ent) AS [Total Entradas]
FROM artigos INNER JOIN Entradas ON artigos.Cod_artigo = Entradas.Cod_artigo
GROUP BY artigos.Nome;

SomaSaidasTotais:

SELECT Artigos.Nome, Sum(Saidas.quantidade_sai) AS [Total Saidas]
FROM Artigos INNER JOIN Saidas ON Artigos.Cod_artigo = Saidas.cod_artigo
GROUP BY Artigos.Nome;

StockTotal:

SELECT Artigos.cod_artigo, Artigos.Nome, Sum([somaEntradasTotais]![Total Entradas]-[somaSaidasTotais]![Total Saidas]) AS Stock
FROM Artigos, SomaEntradasTotais, SomaSaidasTotais
GROUP BY Artigos.cod_artigo, Artigos.Nome;

Quando a consulta StockTotal é executada contendo contendo apenas um registo de artigos, funciona normalmente.

EX: Artigo:a1 --> Entradas:10 --> Saidas:5 ------------> Resultado da Consulta: Artigo:a1 -->5

No entanto quando tenho 2 ou mais artigos ela soma os dois e duplica para as duas linhas

EX:

  • Artigo:a1 --> Entradas:10 --> Saidas:5
  • Artigo:a2 --> Entradas:20 --> Saidas:5
  • Resultado da Consulta: Artigo:a1 --> 40, Artigo:a2 --> 40

Eu estou a presumir que tenha a ver com a forma como as tabelas estão relacionada, mas por um lado nao estou a ver outra forma de as relacionar e por outro nao estou a ver o que está de errado, se estiver, com a consulta.

Se me conseguirem dar uma ajuda eu agradecia :)

AQUI ESTÁ O FICHEIRO: https://1drv.ms/u/s!Ao_FfsJUSm3dgmGHmlet4xduVe_l

Share this post


Link to post
Share on other sites
carlosAl

Nao verifiquei em pormenor o que pretendes fazer , mas se percebi bem o que queres é o stock do produto que esta escolhido no formulario FormArtigos

se assim for acho q podes fazer assim:

a consulta stockTotal iria buscar os dados a duas novas consultas :

SELECT Entradas.Cod_artigo, Sum(Entradas.quantidade_ent) AS SomaDequantidade_ent
FROM Entradas
GROUP BY Entradas.Cod_artigo
HAVING (((Entradas.Cod_artigo)=[Forms]![FormArtigos]![Cod_artigo]));

SELECT Saidas.cod_artigo, Sum(Saidas.quantidade_sai) AS SomaDequantidade_sai
FROM Saidas
GROUP BY Saidas.cod_artigo
HAVING (((Saidas.cod_artigo)=[Forms]![FormArtigos]![Cod_artigo]));

e finalmente a consulta stockTotal iria buscar os dados ás 2 anteriores :

SELECT StockT_E.Cod_artigo, StockT_E.SomaDequantidade_ent, StockT_S.SomaDequantidade_sai, [somaDequantidade_ent]-[somaDequantidade_sai] AS Stock
FROM StockT_E INNER JOIN StockT_S ON StockT_E.Cod_artigo = StockT_S.cod_artigo;

  • Vote 1

Share this post


Link to post
Share on other sites
Demolion

ja tenho uma funcionalidade feita dessa maneira.

o que eu queria era uma listagem do stock de TODOS os artigos

Share this post


Link to post
Share on other sites
carlosAl

entao nao devo estar a perceber o que queres, porque se queres todos os produtos listados, porque estas a limitar a listagem ao produto que tem o foco no formulario ?

se queres todos os produtos retira a condiçao da primeira consulta

HAVING (((Entradas.Cod_artigo)=[Forms]![FormArtigos]![Cod_artigo]));

e da segunda consulta

HAVING (((Saidas.Cod_artigo)=[Forms]![FormArtigos]![Cod_artigo]));

depois depois ao executar a consulta stockTotal o resultado tera de ser o correto

Edited by carlosAl
  • Vote 1

Share this post


Link to post
Share on other sites
Demolion

OK!

Finalmente funciona!

Ao juntar os teus dois comentários ficou a funcionar corretamente :D

Muitíssimo obrigado.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.