Auteur de questions
Problème requête SQL Stock !

Discussion générale
-
Bonsoir chers internautes ^^
J'ai 2 questions à vous poser svp pour que je puisse modifier la requête ci-dessous :
1) En fait, je veux mettre à jour la quantité de l'article (dans le stock) après chaque commande validée, càd :
a.Qte = a.Qte - c.Quantité
2) Je veux que la validation des commandes soit faite par ordre croissant des dates de commandes (Date_commande). Cela dit, si la quantité de l'article dans le stock est insuffisante après une validation d'une commande X , les autres commandes qui viennent après cette date ne pourront pas être validées.
Comment procéder ?
Requête :
UPDATE Commande SET Etat = 'Validée' OUTPUT INSERTED.* FROM Commande c JOIN Article a ON c.Code_article = a.Code_article WHERE (c.Quantité <= a.Qte) AND (c.Etat IS NULL OR c.Etat != 'Validée');
- Modifié DjSadwell mardi 6 août 2013 13:58
Toutes les réponses
-
Bonjour
A une première vue vous devez utiliser une boucle While (dans une procédure stockée ou bien dans le code) pour valider commande par commande en ordre.
Aussi vous avez besoin d'avoir un sort de témoin qui vas forcer l'invalidation des commandes, et qui peut être réinitialisée, (quand on a de nouveau des articles disponibles dans le stock). Ce témoin sera disponible par article.
Donc votre commande sera invalidée s’il y a des articles pour lesquels les témoins sont invalides ou si il il n’y a pas toute la quantité disponible.
Dans ce deuxième cas, on doit aussi mettre les témoins a indisponibles.
Apres tout ça, vous devez actualiser le stock pour les articles.
Parce-que il y a plusieurs opérations à faire, une procédure stockée va faire le travail.
Cordialement,
- Modifié Aurel Bera jeudi 8 août 2013 07:05
-
-
De point de vue utilisateur comment vous validez une commande? L'utilisateur valide son commande, ou il y a un administrateur/processus qui valide les commandes une par une/en vrac? On a besoin de ça pour vous proposer la solution.
Cordialement,
-
C'est un administrateur qui valide les commandes une par une (à l'aide d'un bouton VALIDER), et voilà le code que j'ai programmé pour ce bouton :
private void Valider_Click(object sender, EventArgs e) { con = new SqlConnection("Data Source=HAMANI\\SQLEXPRESS;Initial Catalog=AUSF_Database;Integrated Security=True"); cmd = new SqlCommand("UPDATE Commande SET Etat = 'Validée' OUTPUT INSERTED.* FROM Commande c JOIN Article a ON c.Code_article = a.Code_article WHERE (c.Quantité <= a.Qte) AND (c.Etat IS NULL OR c.Etat != 'Validée');", con); con.Open(); try { SqlDataAdapter sda = new SqlDataAdapter(); sda.SelectCommand = cmd; DataTable dbdataset = new DataTable(); sda.Fill(dbdataset); BindingSource bsource = new BindingSource(); bsource.DataSource = dbdataset; dataGridView2.DataSource = bsource; sda.Update(dbdataset); } catch (System.Exception ex) { MessageBox.Show(ex.Message); } con.Close(); }
En fait, comme vous pouvez remarquer, ce bouton valide les commandes EN VRAC. Mais là je veux changer le comportement de ce bouton afin de valider les commandes UNE PAR UNE, tout en incluant les questions ci-dessus (dans mon 1er message posté). -
Dans ce cas, vous avez besoin d’utiliser une boucle For/While soit dans une procédure stockée SQL soit dans le code .NET.
Vous devez récupérer avec un "select" les commandes qui ne sont pas ni valides ni invalides (un etat de debout d'une commande - per exemple "envoyé") triée par la date de la commande (c'est utile d'avoir un Id unique de la commande, un champ Identity par exemple).
Apres ça, vous commencez la validation commande par commande (selon un identifiant unique de la commande).
On doit créer en avant une table "Article_monitor" qui contient Code_article et un autre champ ForceInvalidate = 0 pour le debout, pour toutes les articles.
Je vous propose d’utiliser une procédure car il y a plusieurs choses à faire:
Actualiser la quantité disponible pour chaque article, aussi que mettre la avec Etat = 'Validée' si il y a disponible (ici vous avez deux requetés update - 1 pour le disponible, 1 pour la commande).
Aussi, la commande sera invalidée si on a des articles pour lequel ForceInvalidate dans la table ArticleMonitor = 1 (on a déjà eu une commande invalidée à cause de cet article indisponible).
Si un article n'est pas disponible vous devez mettre Etat = 'Invalide' aussi que actualiser dans ArticleMonitor le champ ForceInvalidate = 1 (pour forcer les commandes suivantes qui contient cet article d'être invalides).
Donc en Pseudo-code cette procédure va devenir :
SI existe (pour les articles de cette commande dans ArticleMonitor un article avec ForceInvalidate = 1 )
Update Etate = « Inavalid » pour la commande.
Sortir de procédure. (on ne doit pas continuer)
FIN SI
SI n’existe pas un article dans la commande pour lequel quantité n’est pas disponible :
Update Etate = « Valide » pour la commande.
Update quantite disponible ans les Stocks.
AUTRE
//on a des produits pour lequels la quantite n’est pas disponible :
Update Etate = « Inavalid » pour la commande.
Update ArticleMonitor set ForceInvalidate = 1 pour les articles pour lesquels il n’y a pas disponible
FIN SI
Vous pouvez vous servir de la construction IF du Serveur SQL http://technet.microsoft.com/en-us/library/ms182717.aspx
Cordialement,
-
Et pour compliquer les choses, vous devez vous assurer qu'il n'y a pas plusieurs Admin qui essaye de valider des commandes.
Normalement ce type de problemes on doit les resoudre avec "Locking Hints":
http://msdn.microsoft.com/fr-fr/library/aa213026%28SQL.80%29.aspx
Cordialement,