Aggiornare un intera tabella (credo for each)

Aggiornare un intera tabella

Ciao a tutti, mi trovo davanti al seguente problema e spero possiate aiutarmi:

nella tabella x ho i campi:

idrecord1, idprodotto, imponibile, ricarico(default 20), tot imponibile, iva, Tot con iva

idrecord2, idprodotto, imponibile, ricarico(default 20), tot imponibile, iva, Tot con iva

idrecord, idprodotto, imponibile, ricarico(default 20), tot imponibile, iva, Tot con iva

associati ad un id prodotto (magari 3 record per ogni idprodotto)

nella tabella y ho i campi:

idrecord1, idprodotto(uguale alla tabella x), imponibile,iva

ora, al cambiament dell'iva o dell'imponibile della tabella y dovrei estrarre dalla tabella y l'imponibile e l'iva (anch'esso associato alo stesso idprodotto)

Calcolare nuovamente i singoli valori per la tabella x e inserirli nella stessa così come sono, insomma ricalcolarli riga per riga.

ho provato a fare un semplice Update where idprodotto=$_POST[idprodotto] ma, così facendo tutti i record della tabella x assumevano lo stesso risultato...

...credo bisognerebe utilizzare un foreach ma non l'ho utilizzato così poco da non riuscire bene a capirne il suo funzionamento.

Grazie mille

inviato 9 anni fa
yusizu
X 0 X

Memorizzare nel database dei valori calcolabili attraverso operazioni su altri dati, sempre presenti nel database, è (normalmente) sbagliato. Il motivo lo stai sperimentando proprio adesso che devi fare degli aggiornamenti.

Se non è possibile effettuare l'aggiornamento con una sola UPDATE allora devi eseguirne più di una (banale). Per farlo devi mettere il codice che esegue l'UPDATE all'interno di un ciclo (for, foreach, ecc.) che ti ripeti le istruzioni tante volte quante sono le UPDATE da lanciare.

La domanda nasce spontanea: quante UPDATE devi lanciare? Come fai a soprirlo? In cosa differiscono le diverse UPDATE? Solo dopo aver risposto a queste domande puoi decidere come realizzare il ciclo.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

allora come premesso non riuscirei ad applicare un cilclo for in questo contesto, bho, ho sempre utlizzato while per recuperare "tutti i record";

ho provato ad inserire un Update in un WHILE che estrae tutti i record ma come risultato ho ottenuto una duplicazione dei record esattamente per quanti ne erano stati estratti,

Gianni sdaresti così gentile da postarmi qualcosA?

P.S x rispondere alla tua domanda:

credo che anche con un while(anche xkè non saprei fare altrimenti) saprei quanti sono i record da aggiornare e di conseguenza gli Update,

pou ogni record che devo aggiornare è associato ad un idprdotto e, come chiave primaria ho un idrecord

es:

idrecord                         imponibile                              ricarico      totale          codiceprodotto

1           (valore sempre uguale da recuperare da y)     10         risultato               01

2           (valore sempre uguale da recuperare da y)     20         risultato               01

grazie mille

risposto 9 anni fa
yusizu
modificato 9 anni fa
X 0 X

Inizia col realizzare il codice che ti fa capire quali e quante UPDATE devi fare. Solo partendo da questo codice possiamo realizzare il ciclo che eseguie gli update. Se non risolvi questa cosa è inutile pensare al ciclo per iterare le UPDATE.

 :bye:

P.S.: se non hai dimenstichezza con i cicli FOR, FOREACH e simili allora è inutile procedere... studiati prima i cicli!

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

...ok, ti ripeto ho già utilizzato il ciclo for ma, mi viene difficili applicarloin questo contesto, l'ho utilizzato per estrarre tutti i dati di una tabella  ed inserirli in un'altra...

cmq provo a buttare giù un pò di codice, magari mi dai una mano:

//tabella x (codiceprodotto >>primary key, imponibilex, ivax)
//tabella y (nomelistino, id, codiceprodotto, imponibiley, ricarico, ivay, totaleimponibile, totale)

$codiceprodotto = $_POST[codiceprodotto];
$dati = mysql_query("SELECT * FROM x WHERE codiceprodotto='$codiceprodotto');
WHILE($row = mysql_fetch_array($dati)){
//così facendo mi recupero tutti i dati relativi al codiceprodotto e mi preparo al calcolo

$imponibile = $row[imponibilex];
$ivax = $row[ivax];

$dati2 = mysql_query("SELECT * FROM y WHERE codiceprodotto='$codiceprodotto');
WHILE($row2 = mysql_fetch_array($dati2)){
//così mi recupero tutti gli  altri dati relativi al codiceprodotto e mi preparo al calcolo
$id = $row2[id];
$ricarico = $row2[ricarico];
$calc = $imponibile*$ricarico/100
$totimponibile = $imponibile+$calc 
$calc2 =$totimponibile*ivax/100
$totale=$totimponibile+$calc2;

//ora fatti i calcoli(sempre che li abbia fatti) dovrei iaggiornare questi "2" record nella tabella y
//provo ad inserirli qui nel WHILE

$dati3 = mysql_query(UPDATE y SET imponibley='$imponibile', ricarico='$ricarico',
totaleimponibile='$totimponibile', ivay='$ivax', totale='$totale'
WHERE codiceprodotto='$codiceprodotto' AND  id='$id') or die ("Err");
}
}
 //aggiungendo "AND  id='$id'" non funziona;
//se come condizine lascio solo " WHERE codiceprodotto='$codiceprodotto' " mi duplica i valori

questo è quanto so che dovrei sfruttare l'id ma con WHILE nn funge, :'(

grazie mille per un eventuale aiuto

 

risposto 9 anni fa
yusizu
modificato 9 anni fa
X 0 X

ho fatto (almeno credo) un piccolo passo avanti:

ho realizato un ciclo for (molto essenziale per vedere se funzionava, ma mi sono fermato all'echo)

$codiceprodottolistino = array();
$nomelistino = array();
$idlistino = array();
$i = 0;
$dati0 = mysql_query("SELECT * FROM listini WHERE codiceprodottolistino='$codiceprodotto'");
WHILE($array = mysql_fetch_array($dati0)){
$codiceprodottolistino[$i] = $array[codiceprodottolistino];
$nomelistino[$i] = $array[nomelistino];
$idlistino[$i] = $array[idlistino];
$i++;
}
for ($i=0; $i<count($idlistino);$i++){


$dati = mysql_query("UPDATE listini SET codiceprodottolistino='$codiceprodottolistino[$i]', nomelistino='$nomelistino[$i]', idlistino='$idlistino[$i]' WHERE idlistino='$idlistino[$i]'") or die ("err"); //ovviamnete non funziona

//se invece provo a stampare un echo, i prodotti li vedo (anche se lòi avrei visti anche solo col while)

echo" $codiceprodottolistino[$i], $nomelistino[$i], $idlistino[$i]"<br>\n";
}

 :(

risposto 9 anni fa
yusizu
X 0 X

finalmente ho risolto con ciclo for...ma ho un problema anomalo con i calcoli  :tichedoff:

$codiceprodottolistino = array();
$nomelistino = array();
$imponibilelistino2 = array();
$markuplistiono = array();
$totaleimponibilelistino2 = array();
$ivalistino = array();
$totaleconivalistino = array();
$idlistino = array();
$i = 0;

$dati0 = mysql_query("SELECT * FROM listini WHERE codiceprodottolistino='$codiceprodotto'");
WHILE($array = mysql_fetch_array($dati0)){


$codiceprodottolistino[$i] = $array[codiceprodottolistino];
$nomelistino[$i] = $array[nomelistino];
$imponibilelistino2[$i] =  $imponibilelistino;
$markuplistino[$i] =$array[markuplistino];
$calcolo[$i] =$imponibilelistino2[$i]*$markuplistino[$i];
$calcolo2[$i] =$calcolo[$i]/10; //qua ho dovuto fare diviso 10 anzicchè 100...non chiedetemi perchè
$totaleimponibilelistino2[$i] =$imponibilelistino2[$i]+$calcolo2[$i];
$ivalistino[$i] = $ivaprodotto;
$totaleconivalistino[$i] = $array[totaleconivalistino];
$idlistino[$i] = $array[idlistino];

$i++;
}
for ($i=0; $i<count($codiceprodottolistino);$i++){

$dati= mysql_query("UPDATE listini SET codiceprodottolistino='$codiceprodottolistino[$i]', nomelistino='$nomelistino[$i]', ivalistino='$ivalistino[$i]', imponibilelistino='$imponibilelistino2[$i]', totaleimponibilelistino='$totaleimponibilelistino2[$i]' WHERE idlistino='$idlistino[$i]'") or die ("err");

il risultato è che i vari imponibili (prezzo acquisto + ricarico in %) sono giusti (dividendo per 10 anzicchè 100) tranne se il ricarico è del 100%, lo considera come se fosse del 10 :tichedoff:

please help :-\

risposto 9 anni fa
yusizu
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda