Sottrazione materiale dal magazzino

  • Creatore Discussione Creatore Discussione Max61
  • Data di inizio Data di inizio

Max61

Utente Attivo
2 Mar 2014
756
4
18
Salve, sono di nuovo a chiedere aiuto al forum, nella fattispecie ho due tabelle, tblmagazzino e tblintervento
Nella tabella tblintervento ci carico il tipo di intervento ed il materiale preso che deve essere scorporato dalla tabella tblmagazzino, una volta finito l'intervento il materiale dovrà essere restituito e aggiunto al totale magazzino.
Spiego come l'ho fatto:
Inserisco l'intervento con i dati di tipo geografico e successivamente lo richiamo e in modifica aggiorno il materiale utilizzato e quando vado ad aggiornare con il materiale utilizzato in contemporanea vorrei che lo stesso materiale venga sottratto dalla tabella magazzino, ma non riesco a fare la sottrazione tra le due tabelle.
Ho provato a fare una tabella di nome vettore dove gli passo i valori dei materiali per poi sottrarli alla tabella magazzino...
Codice non funzionante
HTML:
UPDATE tblmagazzino SET 
quantita_asfalto='$quantita_asfalto'-vettore.quantita_asfalto, quantita_cartelli='$quantita_cartelli'-vettore.quantita_cartelli,
quantita_lampade='$quantita_lampade'-vettore.quantita_lampade, quantita_transenne='$quantita_transenne'-vettore.quantita_transenne)
IN SELECT (vettore.quantita_asfalto, vettore.quantita_cartelli, vettore.quantita_lampade, vettore.quantita_transenne)
FROM vettore)
Allego le tabelle.
Grazie
Max61
 

Allegati

Ciao, cosa intendi con "dati di tipo geografico"? l'ubicazione dell'intervento? Potresti fare un esempio pratico dei dati inseriti e del risultato che vorresti ottenere? In pratica, se non ho capito male, il materiale richiesto dall'intervento deve essere sottratto da quello presente nel magazzino, giusto? a presto
 
Ciao, cosa intendi con "dati di tipo geografico"? l'ubicazione dell'intervento? Potresti fare un esempio pratico dei dati inseriti e del risultato che vorresti ottenere? In pratica, se non ho capito male, il materiale richiesto dall'intervento deve essere sottratto da quello presente nel magazzino, giusto? a presto
Si esattamente, vorrei sottrarre il materiale usato nell'intervento e una volta finito l'intervento il materiale non utilizzato dovrebbe essere sommato alla giacenza rimasta di magazzino.
Quindi dovrò utizzare anche l'id_intervento sia nella sottrazione che nella somma.
I materiali sono 4:
Asfalto
Cartelli
Lampade
Transenne

Grazie
Max 61
 
Scusa, qualche delucidazione: in magazzino (dalle tabelle che hai postato) risulta: asfalto 90, cartelli 150, lampade 50 e transenne 200 e, nella tabella interventi, nell'intervento 1 (via cipro) cosa indica materiale_asfalto transenne? più avanti poi c'è quantità_asfalto 1 (che presumo vada detratta dai 90 presenti in magazzino) e poi c'è quantità_usata_asfalto che è 1 che indica (presumo) che tutto l'asfalto prelevato dal magazzino sia statao utilizzato, per cui la giacenza attuale è 90-1=89; continuando più avanti c'è quantità_cartelli 20, che quindi andranno detratti dai 150 presenti in magazzino (130) però, più avanti, c'è quantità_usata_cartelli 2, il che indica che sono avanzati 18 cartelli che andranno quindi risommati ai 130 presenti in magazzino (148) e così via per le lampade e le transenne, giusto? ho interpretato bene?
 
Scusa, qualche delucidazione: in magazzino (dalle tabelle che hai postato) risulta: asfalto 90, cartelli 150, lampade 50 e transenne 200 e, nella tabella interventi, nell'intervento 1 (via cipro) cosa indica materiale_asfalto transenne? più avanti poi c'è quantità_asfalto 1 (che presumo vada detratta dai 90 presenti in magazzino) e poi c'è quantità_usata_asfalto che è 1 che indica (presumo) che tutto l'asfalto prelevato dal magazzino sia statao utilizzato, per cui la giacenza attuale è 90-1=89; continuando più avanti c'è quantità_cartelli 20, che quindi andranno detratti dai 150 presenti in magazzino (130) però, più avanti, c'è quantità_usata_cartelli 2, il che indica che sono avanzati 18 cartelli che andranno quindi risommati ai 130 presenti in magazzino (148) e così via per le lampade e le transenne, giusto? ho interpretato bene?
Sihai capito bene. Il Campo per esempio quantita_cartelli nel mio intento si differenzia dal campo quantita_usata_cartelli dal fatto che il primo campo è relativo ai cartelli presi dal magazzino, mentre il secondo campo contiene i cartelli veramente utilizzati, ovviamente i cartelli da restituire a fine intervento sono quelli del campo quantita_cartelli, perché sono quelli prelevati dal magazzino.
Spero di essere riuscito a spiegarmi, altrimenti chiedi e grazie per la pazienza.
Max61
 
Ciao (Max è anche il mio nome),
non avendo molta dimestichezza con le JOIN, da una ricerca in rete ho letto che le tabelle coinvolte debbono avere un campo in comune per cui dovrai suddividere la tabella tblinterventi in più tabelle: una con i dati 'di tipo geografico', campo comune id_intervento, e una solo per i materiali che, dovendo interagire con tblmagazzino, avrà in comune con questa il campo id_materiale; a questo proposito ho fatto alcune prove: ho creato una tblmateriali, con relativo form di inserimento (clicca qui per visualizzarlo) dove, ad ogni materiale, ho sostituito il suo id (preso da tblmagazzino) dopodiché, eseguendo la JOIN (che poi ti manderò) mi aggiorna correttamente le giacenze di magazzino con il materiale prelevato; a questo punto però nasce un problema: il materiale prelevato deve essere anche rimpiazzato; partendo dall'esempio dell'intervento 1, tu hai inizialmente una giacenza di 150 cartelli, di questi ne prelevi 20, per cui la nuova giacenza è 150-20=130, ora però dei 20 cartelli prelevati ne utilizzi solo 2 , a questo punto, quello che non mi è chiaro, quelli da risommare ai 130 (attuale giacenza di magazzino) sono i 18 residui o i 20 prelevati? Fammi sapere, a presto
 
Ciao Max e grazie per l'aiuto.
La form di prelevamento del materiale è simile alla mia, nella mia ci sono anche gli altri campi di tipo come li definisco io 'geografico' nel senso dell'ubicazione dell'intervento e la ditta che lo eseguirà.
Nel caso che mi chiedi i cartelli da restituire a fine intervento sono 20, cioè quelli presi dal magazzino indipendentemente da quelli utilizzati, lo stesso vale per gli altri materiali tranne l'asfalto che ovviamente non è possibile restituire.
Io ho provato a fare questa, ma non riesco a passargli il valore della quantita_cartelli...
PHP:
UPDATE tblmagazzino
INNER JOIN
tblintervento
ON
tblmagazzino.materiale = tblintervento.materiale
SET
tblmagazzino.quantita_cartelli = (tblmagazzino.quantita_cartelli-tblintervento.quantita_cartelli='$quantita_cartelli')
WHERE
tblintervento.materiale = '$materiale'
AND
tblmagazzino.materiale = '$materiale'
E comunque non è corretta perché il materiale va associato all'intervento
Grazie di nuovo
Max61
 
Ultima modifica:
ho fatto un po' di casino
Come ti dicevo ho creato la tblmateriali con questa struttura:


CREATE TABLE tblmateriali (
id int(3) AUTOINCREMENT PRIMARY-KEY
id_intervento int(3) NOT NULL,
id_materiale int(3) NOT NULL,
materiale varchar(10) NOT NULL,
quantita int(5) NOT NULL

PS. id_materiale è il campo che è in comune con tblmagazzino, per cui lo dovrai rinominare (in tblmagazzino) da id_magazzino a id_materiale.


Tramite il form inserisci i materiali prelevati dal magazzino dopodiché, dopo che ti ha visualizzato il riepilogo (i valori ricevuti) tramite un pulsante (o un semplice link) ti aggiorna tblmagazzino con questa JOIN:

UPDATE tblmagazzino
INNER JOIN tblmateriali
SET tblmagazzino.quantita=tblmagazzino.quantita-tblmateriali.quantita_prelevata
WHERE tblmagazzino.id_materiale=tblmateriali.id_materiale

ricordati di cambiare id_magazzino in id_materiale
 
creo una riga di materiale per ogni intervento?
Ho fatto diverse prove e credo proprio di si: quando usi una JOIN tra due tebelle, queste devono avere un campo in comune, in questo caso id_,materiale, che una volta è 1 (asfalto) una volta è 2 (cartelli) ecc. e, non potendo esistere due campi con lo stesso nome, devi avere per forza 4 record, uno per ogni materiale; ovviamente non conviene ripetere 4 volte gli stessi dati (ubicazione intervento, ditta esecutrice, suoi recapiti ecc.) ma dovresti creare due tabelle separate: una, dove inserisci solo i materiali prelevati dal magazzino (quindi con 4 record per ogni intervento) e una con tutti gli altri dati e collegate tra loro dal campo in comune id_intervento, d'altra parte il creare relazioni tra tabelle ha proprio lo scopo di evitare le ridondanze; fammi sapere come va o se hai ancora bisogno di aiuto. A presto
 
Ultima modifica:
Ho fatto diverse prove e credo proprio di si: quando usi una JOIN tra due tebelle, queste devono avere un campo in comune, in questo caso id_,materiale, che una volta è 1 (asfalto) una volta è 2 (cartelli) ecc. e, non potendo esistere due campi con lo stesso nome, devi avere per forza 4 record, uno per ogni materiale; ovviamente non conviene ripetere 4 volte gli stessi dati (ubicazione intervento, ditta esecutrice, suoi recapiti ecc.) ma dovresti creare due tabelle separate: una, dove inserisci solo i materiali prelevati dal magazzino (quindi con 4 record per ogni intervento) e una con tutti gli altri dati e collegate dal campo in comune id_intervento, d'altra parte il creare relazioni tra tabelle ha proprio lo scopo di evitare le ridondanze; fammi sapere come va o se hai ancora bisogno di aiuto. A presto
Ciao Max, non ho avuto tempo di provare, ma ho un dubbio, quando la creo la relazione tra le due tabelle? Come faccio a scrivere l'id dell'intervento dalla tabella tblintervento alla tabella tblmagazzino?
Grazie
 
Non occorre: tblintervento e tblmateriali sono accomunate dal campo id_intervento, mentre tblmateriali e tblmagazzino sono acccomunate dal campo id_materiale
 
Buongiorno Max, ho fatto un pò di prove cambiando la tabella tblmateriali, prima era una riga per ogni materiale mentre adesso è una riga unica avendo un campo per ogni materiale.
Ho fatto questa query e se gli passo l'id funziona, io vorrei che funzionasse anche senza passare l'id, perchè il materiale nella tabella tblmateriali è destinato ad ogni intervento e non mi interessa che sia associato all'intervento, anche perchè se aggiungo una riga ogni volta non so gestire il materiale nel magazzino che sta nel primo record...
con la speranza di essermi spiegato allego la query funzionante con l'id
PHP:
UPDATE tblmateriali
INNER JOIN
tblsinistri
ON
tblmateriali.idsinistri = tblsinistri.idsinistri
SET
tblmateriali.quantita_usata_cartelli = (tblmateriali.quantita_usata_cartelli-tblsinistri.quantita_usata_cartelli)
WHERE tblsinistri.idsinistri='1'
domando: è possibile sottrarre materiale senza passagli l'id?
Grazie
Max61
 
Buongiorno Max, ho fatto un pò di prove cambiando la tabella tblmateriali, prima era una riga per ogni materiale mentre adesso è una riga unica avendo un campo per ogni materiale.
Ho fatto questa query e se gli passo l'id funziona, io vorrei che funzionasse anche senza passare l'id, perchè il materiale nella tabella tblmateriali è destinato ad ogni intervento e non mi interessa che sia associato all'intervento, anche perchè se aggiungo una riga ogni volta non so gestire il materiale nel magazzino che sta nel primo record...
con la speranza di essermi spiegato allego la query funzionante con l'id
PHP:
UPDATE tblmateriali
INNER JOIN
tblsinistri
ON
tblmateriali.idsinistri = tblsinistri.idsinistri
SET
tblmateriali.quantita_usata_cartelli = (tblmateriali.quantita_usata_cartelli-tblsinistri.quantita_usata_cartelli)
WHERE tblsinistri.idsinistri='1'
domando: è possibile sottrarre materiale senza passagli l'id?
Grazie
Max61
Scusate mi è venuta l'illuminazione: visto che il record nella tabella è soltanto 1, io ad ogni query gli passo quello e credo di aver risolto...
adesso provo
 
Ciao Max, sono contento che hai risolto, ma infatti tu non devi passare nessun id, lo ricava lui automaticamente; comunque, dato che come diceva Edoardo non si finisce mai d'imparare, mi mandi uno screenshot di tblmateriali ed anche la JOIN; oltretutto ho visto che hai aperto un'altra discussione.
 
FUNZIONAAAAAA!!!
Grazie per la pazienza
Max61
Buongiorno, Max, adesso mi è venuto un altro dubbio, nel caso
Ciao Max, sono contento che hai risolto, ma infatti tu non devi passare nessun id, lo ricava lui automaticamente; comunque, dato che come diceva Edoardo non si finisce mai d'imparare, mi mandi uno screenshot di tblmateriali ed anche la JOIN; oltretutto ho visto che hai aperto un'altra discussione.
Buongiorno Max, adesso sono fuori casa, te li invio domani.
Ho aperto una nuova discussione che, anche se è inerente a questa si tratta di un problema successivo quindi questa discussione è chiusa.
Ti chiedo il favore di pensare ad una soluzione per la discussione successiva, sempre che io sia riuscito a spiegarmi.
Grazie, domani ti aggiorno
Max61
 
Buongiorno Max, ti invio quanto richiesto:
PHP:
        // calcola il materiale prelevato dalla tabella tblmateriali
       $result_asfalto = mysql_query("UPDATE tblsinistri t1, tblmateriali t2
SET t2.quantita_usata_cartelli = t2.quantita_usata_cartelli - t1.quantita_usata_cartelli
WHERE t2.id_materiale= '1' AND t1.idsinistri='$idsinistri'")
or die(mysql_error());


// calcola il materiale prelevato dalla tabella tblmateriali
       $result_cartelli = mysql_query("UPDATE tblsinistri t1, tblmateriali t2
SET t2.quantita_usata_asfalto = t2.quantita_usata_asfalto - t1.quantita_usata_asfalto
WHERE t2.id_materiale= '1' AND t1.idsinistri='$idsinistri'")
or die(mysql_error());


// calcola il materiale prelevato dalla tabella tblmateriali
       $result_lampade = mysql_query("UPDATE tblsinistri t1, tblmateriali t2
SET t2.quantita_usata_lampade = t2.quantita_usata_lampade - t1.quantita_usata_lampade
WHERE t2.id_materiale= '1' AND t1.idsinistri='$idsinistri'")
or die(mysql_error());


// calcola il materiale prelevato dalla tabella tblmateriali
       $result_transenne = mysql_query("UPDATE tblsinistri t1, tblmateriali t2
SET t2.quantita_usata_transenne = t2.quantita_usata_transenne - t1.quantita_usata_transenne
WHERE t2.id_materiale= '1' AND t1.idsinistri='$idsinistri'")
or die(mysql_error());
praticamento ho fatto una query per ogni materiale utilizzato dove l'id_materiale della tabella tblmateriali essendo un unico record è sempre 1, mentre l'idsinistri della tabella tblsinistri varia in base all'intervento selezionato nella form.
Ciao e di nuovo grazie
Max61
 

Allegati

Ultima modifica:

Discussioni simili