POUQUOI MON UPDATE FONCTIONNE PAS

Résolu
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 - 10 avril 2014 à 23:57
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 - 14 avril 2014 à 13:33
Bonjour,
je voudrais mettre a jour la somme des stocks entrés dans la table stock mais la requète marche pas. je l'ai testé directement de phpmysadmin on me met :
#1093 - You can't specify target table 'stocks' for update in FROM clause

voici la requète:
mysql_query("UPDATE stocks set stock_entree = (SELECT SUM(qte) AS qte_entree FROM stocks WHERE id_pros = '".$id_pros."' )");

8 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 avril 2014 à 08:01
salut,

tu ne donnes pas de conditions à ton update.

naga
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 avril 2014 à 09:39
voici ce que j'ai mi comme condition mais ça ne marche toujours pas:
mysql_query("UPDATE stocks set stock_entree = (SELECT SUM(qte) AS qte_entree FROM stocks WHERE id_pros = '".$id_pros."' )WHERE id_pros = '".$id_pros."'");
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 avril 2014 à 11:25
essaye en ajoutant un groupement et en retirant les guillements (normalement ca ne devrait pas être le problème mais on va déjà rendre la requête pus "propre" ;] ) :


mysql_query("UPDATE stocks set stock_entree = (SELECT SUM(qte) AS qte_entree FROM stocks WHERE id_pros = ".$id_pros." group by id_pros) WHERE id_pros = ".$id_pros);

Ensuite ce qui me "choque" un peu, c'est que tu remets à jours sur la table elle même ses propre éléments ... ou alors ca veut dire que ta table stock possède plusieurs lignes pour un même produit et chaque ligne contient une quantité d'entrée + la quantité actuelle mise à jours .. c'est aberrant dans le sens ou ca fait une redondance de données ET que ca mélange les types de données (d'une part on a les flux / l'historique et d'autre part on devrait avoir le stock actuel, pas les deux mélangé) ... ou alors tu t'es trompé en indiquant à chaque fois la table stocks?

Quel est la structure de ta base ?
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 avril 2014 à 13:28
j'ai fais ce que tu as dis mais ça ne passe toujours pas .
voici mon code complet.
<?php
include('body/header.php');
include('body/menu.php');
if (isset($_POST["valider"])) {
$num = mysql_real_escape_string(htmlspecialchars(trim($_POST['num'])));
$article = mysql_real_escape_string(htmlspecialchars(trim($_POST['article'])));
$ref = mysql_real_escape_string(htmlspecialchars(trim($_POST['ref'])));
$pa = mysql_real_escape_string(htmlspecialchars(trim($_POST['pa'])));
$fourn = mysql_real_escape_string(htmlspecialchars(trim($_POST['fourn'])));
$qte = mysql_real_escape_string(htmlspecialchars(trim($_POST['qte'])));
$depot = mysql_real_escape_string(htmlspecialchars(trim($_POST['depot'])));
$pv = mysql_real_escape_string(htmlspecialchars(trim($_POST['pv'])));
//RECUPERER ID PRODUIT
$id_pro = explode("/",$article);
$id_pros = $id_pro[1]; echo $id_pros;
$nom_pros = $id_pro[0];
//RECUPERER ID FOURNISSEUR
$id_fourn = explode("/",$fourn);
$id_fours = $id_fourn[1];
//RECUPERER ID DEPOT
$id_depot = explode("/",$depot);
$id_depots = $id_depot[1];
//VERIFICATION DE L EXISTENCE DU PRODUIT
$sql = "SELECT article FROM produits WHERE article='$article'";
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());

// on compte le nombre de résultats
$res = mysql_num_rows($req);

if($res!=0) // l'url existe déjà, on affiche un message d'erreur
{
$msg = 'Désolé, mais ce nom existe déjà dans notre base.';
echo '<script>alert(\' '.$msg.' \');</script>';
}
else // L'url n'existe pas, on insère les informations du formulaire dans la table
{
if (empty($article)) {

$msg="<font color=red>Veuillez saisir le nom !!!!!!!!</font>";
}
else {
$sql="INSERT INTO produits(id,article,pa,pv,ref,id_pros) VALUES('','".$nom_pros."','".$pa."','".$pv."','".$ref."','".$id_pros."')";
// on insère les informations du formulaire dans la table
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
$id_get = mysql_insert_id();
mysql_query("INSERT INTO tb_fournisseur(id,id_get,id_pros) VALUES('".$id_get."','".$id_fours."','".$id_pros."')");
mysql_query("INSERT INTO tb_depot(id,id_get,id_pros) VALUES('".$id_get."','".$id_depots."','".$id_pros."')");
mysql_query("INSERT INTO stocks(num,date,qte,stock_entree,stock_sortie,total_stock,id_get,id_pros) VALUES('".$num."',NOW(),'".$qte."','".$stock_entree."','','".$total_stock."','".$id_get."','".$id_pros."')");
//mysql_query("UPDATE stocks set stock_entree = (SELECT SUM(qte) AS qte_entree FROM stocks WHERE id_pros = '".$id_pros."' )WHERE id_pros = '".$id_pros."'");
$r = mysql_query("UPDATE stocks set stock_entree = (SELECT SUM(qte) AS qte_entree FROM stocks WHERE id_pros = ".$id_pros." group by id_pros) WHERE id_pros = ".$id_pros);
printf($r);
$msg = 'Produit***de***'.$article.'***enregistré!!!!';
echo '<script>alert(\' '.$msg.' \');</script>';
}
}
}
?>
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 avril 2014 à 13:51
au fait je remet à jour deux champs de la table stocks : les champs stock_entree et stock_sortie
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 avril 2014 à 14:44
ce qui est étrange avec ta requete, c'est que si elle fonctionnait, tous les stock_entree du même id_pros auraient la même valeur (la somme des qte).

Je ne vois pas ce que tu essaye de faire ...

Sinon pour répondre à ta question (j'aurai du le dire plus tot ... ) tu ne peux pas utiliser la même table comme source et cible dans un update. Donc si vraiment c'est ce que tu veux faire, il faut faire en 2 étapes (récupération de
SUM(qte)
puis mise à jours).

naga
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
Modifié par jordane45 le 11/04/2014 à 14:50
Hello,
Pour ma part je ne comprend pas l'intérêt de cette opération...
Si à un instant T tu as besoin de connaitre les Qte ... vu que part requête tu peux facilement les avoir.. il n'y pas d'intérêt à les stocker dans ta table.
Ou au pire...( mais vraiment juste si tu veux "historiser" ces données) tu créés une table "stocks_qte" qui aura pour champs :
id | id_pro | stock_entree | stock_sortie

id : champ auto-increment
id_pro : id_pro correspondant à ton produit
stock_entree / stock_sortie: le SUM(qte) de ta table stocks.

Mais bon... perso je resterai sur ma première proposition.
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 avril 2014 à 15:53
voici ma nouvelle requête mais elle donne des valeurs qui ne sont fausses.
- pour stock reçu àa donne 98035 au lieu de 14005

voici le code :
// on crée la requête SQL
$sql = "SELECT DISTINCT
b.articleVendu,
SUM(a.qte) AS arrive,
SUM(b.articleQuant) AS vendu,
SUM(a.qte) - SUM(b.articleQuant) AS diff

FROM stocks a,articles b
WHERE a.id_pros = b.id_prod
GROUP BY a.id_pros
";
// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 avril 2014 à 16:09
fais cette requete :


"SELECT DISTINCT
a.qte,
b.articleQuant

FROM stocks a,articles b
WHERE a.id_pros = b.id_prod
";

ensuite tu ne filtre pas le id_pros donc tu récuèpre (avec le sum et le group by) 1 ligne par article donc si tu ne lis que la première ligne le résultat ne concernera pas forcément l'id_pros que tu veux
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 avril 2014 à 16:25
j'ai pas bien saisi ce que tu me propose de faire .
voici ce que je veux:
			   SUM(a.qte) AS arrive,
SUM(b.articleQuant) AS vendu,
SUM(a.qte) - SUM(b.articleQuant) AS diff
comment je procede ??
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 avril 2014 à 16:31
je te demandais juste les résultats, car tu dis que le sum est erroné mais tu ne regarde pas quel valeur il a groupé.

et il faudraa quand même que tu limite par un id_pros :

$sql = "SELECT DISTINCT
b.articleVendu,
SUM(a.qte) AS arrive,
SUM(b.articleQuant) AS vendu,
SUM(a.qte) - SUM(b.articleQuant) AS diff

FROM stocks a,articles b
WHERE a.id_pros = b.id_prod
AND id_pros = ".$id_pros."
GROUP BY a.id_pros
";
// on envoie la requête
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 avril 2014 à 16:48
je comprend pas cette requête . d'où provient
".$id_pros."
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
14 avril 2014 à 08:02
c'était celui que tu avais donné dans le post au départ, c'est plutot à toi de dire d'ou elle provient ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
11 avril 2014 à 17:31
Ta requête ne me semble pas fausse...
$sql="
SELECT DISTINCT b.articleVendu
			  , SUM(a.qte) AS arrive
			  , SUM(b.articleQuant) AS vendu
			  , SUM(a.qte) - SUM(b.articleQuant) AS diff
        FROM stocks a
                 ,articles b 
	WHERE a.id_pros = b.id_prod
        GROUP BY a.id_pros,b.articleVendu
";


Mais pour que l'on puisse essayer de comprendre.. tu pourrais nous fournir sa structure et quelques données de test ?
---> tu fais un export de tes tables en fichier SQL et tu nous colles le contenu de ces fichiers sur le forum...


0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
Modifié par msi79 le 11/04/2014 à 20:15
voici la structure de mes 2tables:


<signature>-- Structure de la table 'stocks'
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
11 avril 2014 à 20:48
SELECT DISTINCT S.id_pros
		 ,ART.*	    
		 ,SUM(S.qte) AS arrive
		 ,SUM(S.qte) - (ART.vendu) AS diff

FROM  stocks S 
,(SELECT 
 A.id_prod
,SUM(A.articleQuant) as vendu 
FROM  articles A 
GROUP BY A.id_prod) ART

WHERE(ART.id_prod = S.id_pros)
GROUP BY S.id_pros



0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
12 avril 2014 à 09:45
bonjour ,
merci beaucoup ça marche mais @jordane46 s'il te plait explique moi un peu cette requête
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
12 avril 2014 à 12:45
Bonjour.
Je suis juste passé par ce qu'on appelle une sous requete dans le from.
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
14 avril 2014 à 13:33
ok merci
0
Rejoignez-nous