Problema Baza de date pentru stocuri

Informatii despre cum se utilizeaza Microsoft Access 2003. Baze de date, Interogari, Formulare, Rapoarte, etc
ci3
Mesaje: 156
Membru din: Dum Apr 25, 2010 4:17 pm

Problema Baza de date pentru stocuri

Mesaj de ci3 » Dum Apr 25, 2010 4:20 pm

Am trei tabele in Access: Produse, Intrari, Iesiri. Vreau stocul actual si folosesc urmatoarea formula: Sum([Cantitate intrata]-[Cantitatea iesita]).
Pentru [Cantitate intrata] si [cantitatea iesita] am facut 2 queries care imi fac cu SUM totalul de intrari si totalul de iesiri. Problema imi apara in momentul in care am produse care au intrat dar nu au ieist. Formula nu functioneaza bine si in raport nu se vad produsele existente din stoc care nu au iesiri la produsul respectiv. In raport apar doar produsele care au si intrari si iesiri. Cum as putea sa rezolv problema? Multumesc.

Marin Zanfir
Mesaje: 88
Membru din: Vin Sep 04, 2009 7:45 am
Localitate: Slatina

Re: Problema Baza de date pentru stocuri

Mesaj de Marin Zanfir » Lun Apr 26, 2010 7:21 am

O solutie ar fi urmatoarea:

Cod: Selectaţi tot

SELECT Produse.ProdusID, First(Produse.Denumire) AS Denumire, Sum(Intrari.Cantitate) AS Intrari, Sum(NZ(Iesiri.Cantitate,0)) AS Iesiri, [Intrari]-[Iesiri] AS Stoc
FROM (Produse INNER JOIN Intrari ON Produse.ProdusID = Intrari.ProdusID) LEFT JOIN Iesiri ON Produse.ProdusID = Iesiri.ProdusID
GROUP BY Produse.ProdusID;
in ideea ca nu exista Iesiri fara Intrari

sau :

Cod: Selectaţi tot

SELECT Produse.ProdusID, First(Produse.Denumire) AS Denumire, Sum(NZ(Intrari.Cantitate,0)) AS Intrari, Sum(NZ(Iesiri.Cantitate,0)) AS Iesiri, [Intrari]-[Iesiri] AS Stoc
FROM (Produse LEFT JOIN Intrari ON Produse.ProdusID = Intrari.ProdusID) LEFT JOIN Iesiri ON Produse.ProdusID = Iesiri.ProdusID
GROUP BY Produse.ProdusID;
daca aceptam Iesiri fara Intrari.

Dezavantajul solutiei doi este ca se vor vizualiza toate produsele (indiferent daca au intrari sau iesiri).

IMPORTANT!!!!!

Din pacate aceasta solutie este eronata.

ci3
Mesaje: 156
Membru din: Dum Apr 25, 2010 4:17 pm

Re: Problema Baza de date pentru stocuri

Mesaj de ci3 » Lun Apr 26, 2010 7:33 am

Multumesc pentru ajutor. Pentru ca sunt incepator in access te rog sa imi spui si unde sa pun codul: in queries, form sau report? Cred ca m-ai zapacit putin.

Marin Zanfir
Mesaje: 88
Membru din: Vin Sep 04, 2009 7:45 am
Localitate: Slatina

Re: Problema Baza de date pentru stocuri

Mesaj de Marin Zanfir » Lun Apr 26, 2010 7:38 am

Codul il pui in Query si folosesti acel Query ca RecordSource pentru Form sau Report.

ci3
Mesaje: 156
Membru din: Dum Apr 25, 2010 4:17 pm

Re: Problema Baza de date pentru stocuri

Mesaj de ci3 » Lun Apr 26, 2010 9:00 am

Am atasat si imaginile cu query pentru Total intrari produse, Total iesiri produse si Stoc Actual. Pentru afisarea in Forms foloses Stoc actual. Si totusi undeva gresesc. Unde?
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Marin Zanfir
Mesaje: 88
Membru din: Vin Sep 04, 2009 7:45 am
Localitate: Slatina

Re: Problema Baza de date pentru stocuri

Mesaj de Marin Zanfir » Lun Apr 26, 2010 10:02 am

Nu imi dau seama unde gresesti.
Trimite-mi baza de date.

Pentru a te inspira iti atasez o baza de test.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

ci3
Mesaje: 156
Membru din: Dum Apr 25, 2010 4:17 pm

Re: Problema Baza de date pentru stocuri

Mesaj de ci3 » Lun Apr 26, 2010 11:33 am

Asta este baza de date pe care lucrez. Am facut ca tine si nu functioneza.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

ci3
Mesaje: 156
Membru din: Dum Apr 25, 2010 4:17 pm

Re: Problema Baza de date pentru stocuri

Mesaj de ci3 » Lun Apr 26, 2010 4:46 pm

Din pacate am descoprit ceva si in exemplul tau. Toate intrarile si iesirile sunt dublate la rezultat.

Marin Zanfir
Mesaje: 88
Membru din: Vin Sep 04, 2009 7:45 am
Localitate: Slatina

Re: Problema Baza de date pentru stocuri

Mesaj de Marin Zanfir » Lun Apr 26, 2010 5:44 pm

Din pacate ai dreptate.

Solutia corecta este:

Cod: Selectaţi tot


SELECT Intrari.codmp, Sum(Intrari.Cant_intrata) AS Intrari, 0 AS Iesiri
FROM Intrari
GROUP BY Intrari.codmp
UNION ALL SELECT Iesiri.codmp, 0 AS Intrari, Sum(Iesiri.Cant_iesita) AS Iesiri
FROM Iesiri
GROUP BY Iesiri.codmp;

iar al doilea query este folosit in form sau report.

Cod: Selectaţi tot


SELECT Q_PregatireStoc.codmp, First(Produse.[Denumire produs]) AS [Denumire produs], Sum(Q_PregatireStoc.Intrari) AS Intrari, Sum(Q_PregatireStoc.Iesiri) AS Iesiri, [Intrari]-[Iesiri] AS [Stoc Actual]
FROM Q_PregatireStoc INNER JOIN Produse ON Q_PregatireStoc.codmp = Produse.codmp
GROUP BY Q_PregatireStoc.codmp;

Imi cer scuze pentr acest incident.

Atasez baza de date modificata corespunzator.
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: Problema Baza de date pentru stocuri

Mesaj de Dr.Windows » Lun Apr 26, 2010 6:42 pm

Am facut si eu o incercare:

1. Am creat 2 interogari asa cum ai spus si tu: una pentru intrari (_INTRARI) si alta pentru iesiri (_IESIRI) pentru a "totaliza" pentru fiecare tabela Intrari/Iesiri produsele.

Pentru _INTRARI:

Cod: Selectaţi tot

SELECT DISTINCTROW Produse.codmp, Produse.[Denumire produs], Sum(Intrari.Cant_intrata) AS [Sumă al Cant_intrata]
FROM Produse INNER JOIN Intrari ON Produse.codmp = Intrari.codmp
GROUP BY Produse.codmp, Produse.[Denumire produs];
Pentru _IESIRI:

Cod: Selectaţi tot

SELECT DISTINCTROW Produse.codmp, Produse.[Denumire produs], Sum(Iesiri.Cant_iesita) AS [Sumă al Cant_iesita]
FROM Produse INNER JOIN Iesiri ON Produse.codmp=Iesiri.codmp
GROUP BY Produse.codmp, Produse.[Denumire produs];
2. Acum interogarea _STOC se bazeaza pe tabela PRODUSE pentru a selecta TOATE produsele chiar daca au avut sau nu intrari/iesiri:

Cod: Selectaţi tot

SELECT Produse.codmp, Produse.[Denumire produs], [_Intrari].[Sumă al Cant_intrata], [_Iesiri].[Sumă al Cant_iesita], nz([_Intrari]![Sumă al Cant_intrata])-nz([_Iesiri]![Sumă al Cant_iesita]) AS [Stoc curent]
FROM (Produse LEFT JOIN _Intrari ON Produse.codmp = [_Intrari].codmp) LEFT JOIN _Iesiri ON Produse.codmp = [_Iesiri].codmp;
La nevoie aceasta interogare se poate filtra suplimentar pentru a elimina produsele care indeplinesc sau nu anumite criterii (de ex. poate nu le vrei pe cele cu stoc 0)

Pentru detalii vezi si baza atasata:
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Închis

Înapoi la “Intrebari despre Access 2003”