POUQUOI MON UPDATE FONCTIONNE PAS [Résolu]

Signaler
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
-
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
-
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

Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
salut,

tu ne donnes pas de conditions à ton update.

naga
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
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."'");
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
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 ?
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
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>';
}
}
}
?>
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
au fait je remet à jour deux champs de la table stocks : les champs stock_entree et stock_sortie
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
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
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
351
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.
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
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());
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
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
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
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 ??
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
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());
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
je comprend pas cette requête . d'où provient
".$id_pros."
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
16
c'était celui que tu avais donné dans le post au départ, c'est plutot à toi de dire d'ou elle provient ;)
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
351
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...


Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
voici la structure de mes 2tables:


<signature>-- Structure de la table 'stocks'
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
351
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



Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
bonjour ,
merci beaucoup ça marche mais @jordane46 s'il te plait explique moi un peu cette requête
Messages postés
32940
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 juin 2021
351
Bonjour.
Je suis juste passé par ce qu'on appelle une sous requete dans le from.
Messages postés
500
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
13 avril 2021
1
ok merci