Ciao a tutti, scusate per il titolo un pò contorto ma non sapevo cosa scrivere
passo subito al problema:
ho un database con queste tabelle:
Codice PHP:
mysql> describe particolari;
+-------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+---------+----------------+
| id_p | smallint(5) unsigned | | PRI | NULL | auto_increment |
| codice | varchar(45) | | UNI | | |
| livello | tinyint(3) unsigned | | | 0 | |
| prezzo | float(4,2) | | | 0.00 | |
| descrizione | varchar(150) | | | | |
| abbrev | varchar(45) | | | | |
+-------------+----------------------+------+-----+---------+----------------+
mysql> describe consegne;
+-------------+----------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+------------+----------------+
| id_c | int(10) unsigned | | PRI | NULL | auto_increment |
| bolla | varchar(15) | | | | |
| data | date | | | 0000-00-00 | |
| particolare | smallint(5) unsigned | | MUL | 0 | |
| um | varchar(5) | | | | |
| quantita | smallint(5) unsigned | | | 0 | |
+-------------+----------------------+------+-----+------------+----------------+
mysql> describe forniture;
+-------------+----------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------+------+-----+------------+----------------+
| id_f | int(10) unsigned | | PRI | NULL | auto_increment |
| ddt | varchar(15) | | | 0000-00-00 | |
| data | date | | | 0000-00-00 | |
| particolare | smallint(5) unsigned | | MUL | 0 | |
| um | varchar(5) | | | | |
| quantita | smallint(5) unsigned | | | 0 | |
| completata | enum('SI','NO') | | | NO | |
+-------------+----------------------+------+-----+------------+----------------+
mysql> describe cons_forn;
+-----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+----------------+
| id_cf | int(10) unsigned | | PRI | NULL | auto_increment |
| consegna | int(10) unsigned | | MUL | 0 | |
| fornitura | int(10) unsigned | | MUL | 0 | |
| quantita | smallint(5) unsigned | | | 0 | |
+-----------+----------------------+------+-----+---------+----------------+
mysql> describe saldature;
+--------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------------------+------+-----+---------+----------------+
| id_s | int(10) unsigned | | PRI | NULL | auto_increment |
| figlio | smallint(5) unsigned | | MUL | 0 | |
| madre | smallint(5) unsigned | | MUL | 0 | |
+--------+----------------------+------+-----+---------+----------------+
che spiego brevemente:
nella mia ditta (metalmeccanica) saldiamo dei particolari per un cliente.
In pratica loro ci forniscono 1 o più particolari che noi andiamo a saldare e poi li restituiamo.
Quando ci forniscono un solo particolare noi produciamo il 2.
nella tabella PARTICOLARI ci sono tutti i particolari, suddivisi in livelli (1 e 2) dove livello 2 sono quelli che loro danno a noi e livello 1 sono quelli che noi restituiamo a loro (quindi un livello 1 e una composizione di uno o più livelli 2).
nella tabella CONSEGNE ci sono tutti i dati delle nostre consegne (numero bolla,quantita,data ecc ecc dei particolari di livello 1)
nella tabella FORNITURE ci sono tutti i dati delle loro consegne (numero ddt,quantita,data ecc ecc dei particolari di livello 2)
nella tabella CONS_FORN ci sono tutti i dati delle nostre consegne relativamente alle loro forniture (con una nostra consegna potremmo utilizzare una parte, una o più di una delle loro forniture)
ad esempio:
loro ci danno
3000 pezzi di un particolare in data 01/01/08
2000 pezzi dello stesso particolare in data 02/02/08
noi consegnamo in data 03/01/08 4000 pezzi quindi saldiamo la fornitura da 3000 e usiamo 1000 di quella da 2000
nella tabella SALDATURE ci sono le relazioni tra i particolari di livello 1 (madri) e 2 (figli)
ad esempio
particolare 1 -- livello 2
particolare 2 -- livello 2
particolare 3 -- livello 1 = particolare 1 + particolare 2
ora il mio problema sorge quando devo fare un riepilogo di una consegna effettuata!
Finora sono giunto a questa soluzione che pare funzionare se non per un particolare:
Codice PHP:
select ddt, data, p.codice, f.quantita as forniti, sum(cf.quantita) as consegnati
from cons_forn cf,forniture f,particolari p
where consegna in (
select id_c from consegne
where particolare=(select particolare from consegne where id_c='$id_c')
and data<=(select data from consegne where id_c='$id_c')
)
and fornitura=id_f
and f.particolare=p.id_p
and f.completata='NO'
group by fornitura
order by particolare,data
il problema è questo:
quando faccio un riepilogo consegna di un particolare di livello 1 formato da un solo particolare di livello 2 è tutto ok, quando invece utilizzo un particolare di livello 1 formato da più di un particolare di livello 2, nella somma delle quantita consegnate totali mi compare solo quello del particolare in esame e non quello di tutti i particolari utilizzati!
lo so che è contorto da morire ma qualcuno potrebbe darmi una mano?
grazie infinite!