Partage
  • Partager sur Facebook
  • Partager sur Twitter

Soustraction et multiplication SQL server

Sujet résolu
    22 novembre 2020 à 14:46:14

    Bonjour, 

    Cela fait plusieurs jours, voir semaines que je cherche comment faire une multiplication et une soustraction entre des colonnes d'une table sur SQL Server (Visual Studio 2019). 

    En bidouillant, j'ai vu qu'en créant un déclencheur pour faire une soustraction cela fonctionnait, mais quand j'ai rajouté la multiplication plus rien.. on dirait qu'il y avait un conflit entre les deux.

    Je doute que ce soit la bonne méthode pour faire ces opérations.

    Si quelqu'un pouvait m'aider, je suis débutant en C# & Sql server sur visual studio Merci ! 

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2020 à 17:46:52

      Bonjour,

      Du code et des exemples de données, avant/après, seraient appréciés ... enfin si tu veux de l'aide...

      Là, dit comme ça, je ne vois pas le rapport avec les déclencheurs...

      -
      Edité par Benzouye 22 novembre 2020 à 17:47:53

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        22 novembre 2020 à 18:02:56

        En effet, j'ai oublié désolé.

        En faite j'ai créé des déclencheurs pour faire la soustraction et la multiplication mais les deux ensembles il y a un conflit.

        Dans ma table il y a les informations suivantes : 

        - id_stocks

        - id_produits

        - PU

        - Nb_entree

        - Nb sortie

        - HT

        - Total stock 

        voici les deux déclencheurs : 

        CREATE TRIGGER [dbo].[Multiplication]
        	ON [dbo].[T_Stocks]
        	FOR UPDATE
        	AS
        	BEGIN
        		UPDATE dbo.T_Stocks 
        		SET T_Stocks.HT = T_Stocks.Nb_entree * T_Stocks.PU
        		FROM T_Stocks
        	END
        
        	GO
        
        
        CREATE TRIGGER [dbo].[Soustraction]
        	ON [dbo].[T_Stocks]
        	FOR UPDATE
        	AS
        	BEGIN
        		UPDATE dbo.T_Stocks 
        		SET T_Stocks.Total_stock = T_Stocks.Nb_entree - T_Stocks.Nb_sortie
        		FROM T_Stocks
        	END



        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2020 à 23:27:48

          Je ne comprends même pas que tu ais pu créer le premier trigger... tu crées une boucle infinie avec un UPDATE dans un UPDATE...

          Peux-tu expliquer la structure de cette table, comment tu l'alimentes et ce que tu cherches à faire exactement ?

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            23 novembre 2020 à 9:41:56

            Sur cette table je souhaite faire une soustraction entre Nb_entree et Nb_sortie et que la donnée se stock dans total_stock.

            Ensuite je souhaite pouvoir faire une multiplication entre PU et Nb_entree et que la donnée se stock dans HT. 

            Pour cela, je donne moi même une donnée à Nb_entree et Nb_sortie pareil pour PU.

            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2020 à 12:43:02

              En toute rigueur on ne stocke pas le résultat d'un calcul en base si l'on peut faire se calcul au besoin ...

              Je supprimerai donc les colonnes que servent à stocker les calculs ( HT et total_stock ) et ferais les deux calculs lors du SELECT, voire directement dans l'application lors de l'affichage ...

              Ensuite, la structure de ta gestion de stock n'est pas très pertinente ...

              Dans une logique d'application de gestion de stocks, tu devrais avoir une table "mouvement" dans laquelle tu stockes les mouvements de manière individuelle (une ligne par mouvement, quantité positive pour les entrées et négative pour les sorties).

              CREATE TABLE produit (
                  id_produit INT UNSIGNED NOT NULL,
                  designation VARCH( 100 ) NOT NULL,
                  ...
                  PRIMARY KEY ( id_produit )
              );
              
              CREATE TABLE mouvement (
                  id_mouvement INT UNSIGNED NOT NULL,
                  id_produit INT UNSIGNED NOT NULL,
                  quantite DECIMAL( 6, 2 ),
                  prix DECIMAL( 6, 2 ),
                  PRIMARY KEY ( id_mouvement ),
                  FOREIGN KEY ( id_produit ) REFERENCES produit ( id_produit )
              );

              Et faire les calculs de stocks avec un SELECT chaque fois que besoin ...

              SELECT
                  M.id_produit,
                  P.designation,
                  SUM( M.quantite ) AS stock,
                  SUM( M.quantite * M.prix ) AS valeur
              FROM
                  mouvement M
                      INNER JOIN produit P
                          ON M.id_produit = P.id_produit
              GROUP BY M.id_produit
              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                23 novembre 2020 à 15:36:54

                Merci beaucoup pour ton aide. malheureusement lorsque j'ajoute un SELECT j'obtiens une erreur :

                SQL70001 : Cette instruction n'est pas reconnue dans ce contexte. (Ligne 12)

                Je pense que je mets pas la requête au bon endroit...

                Autre petite question, pour que la soustraction s'effectue pour chaque ligne créée je vais devoir créer une boucle "IF"  dans le contrôleur de la table ?

                CREATE TABLE [dbo].[T_Mouvements] (
                    [Id_mouvements] INT        IDENTITY (1, 1) NOT NULL,
                    [Id_produits]   INT        NULL,
                    [Quantite]      INT        NULL,
                    [Prix_HT]       FLOAT (53) NULL,
                    PRIMARY KEY CLUSTERED ([Id_mouvements] ASC),
                    CONSTRAINT [FK_T_Mouvements_ToT_Produits] FOREIGN KEY ([Id_produits]) REFERENCES [dbo].[T_Produits] ([Id_produits])
                );
                
                GO
                
                SELECT
                    M.Id_produits,
                    P.Nom,
                    SUM( M.Quantite ) AS stock,
                    SUM( M.Quantite * M.Prix_HT ) AS valeur
                FROM
                    T_Mouvements M
                        INNER JOIN T_Produits P
                            ON M.Id_produits = P.Id_produits
                GROUP BY M.Id_produits



                • Partager sur Facebook
                • Partager sur Twitter
                  23 novembre 2020 à 16:31:23

                  Je ne connais suffisamment pas SQL Server pour te répondre sur l'erreur 70001 ... Une petite recherche sur le net pourra t'aider sur la syntaxe avec plusieurs commandes ...

                  Mais si tu exécutes chaque requête (CREATE TABLE et SELECT) séparément cela devrait résoudre le problème non ?

                  Btixmes a écrit:

                  pour que la soustraction s'effectue pour chaque ligne créée je vais devoir créer une boucle "IF"  dans le contrôleur de la table

                  Je ne comprends pas la question ... Avec la solution proposée tu n'as pas de soustraction à faire ...

                  Si tu veux compter le nombre d'entrées et le nombre de sorties, un CASE fera l'affaire :

                  SELECT
                      M.id_produit,
                      P.designation,
                  	SUM( CASE WHEN M.quantite > 0 THEN 1 ELSE 0 END ) AS nb_entrees,
                  	SUM( CASE WHEN M.quantite < 0 THEN 1 ELSE 0 END ) AS nb_sorties,
                      SUM( M.quantite ) AS stock,
                      SUM( M.quantite * M.prix ) AS valeur
                  FROM
                      mouvement M
                          INNER JOIN produit P
                              ON M.id_produit = P.id_produit
                  GROUP BY M.id_produit, P.designation
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    23 novembre 2020 à 16:37:35

                    Justement il ne prend pas en compte ma requête avec le SELECT, il affiche juste sur le résultat dans une fenêtre et ça s'arrête là.. 

                    D'accord merci beaucoup ! 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 novembre 2020 à 17:35:16

                      Tu voudrais que ça fasse quoi de plus que t'afficher le tableau avec les valeurs dans SQL Server ? c'est le rôle du SELECT

                      Tu peux créer une vue éventuellement pour avoir une "table" du résultat dans ta base

                      CREATE VIEW Table_Calcul
                      AS
                      SELECT
                          M.id_produit,
                          P.designation,
                          SUM( CASE WHEN M.quantite > 0 THEN 1 ELSE 0 END ) AS nb_entrees,
                          SUM( CASE WHEN M.quantite < 0 THEN 1 ELSE 0 END ) AS nb_sorties,
                          SUM( M.quantite ) AS stock,
                          SUM( M.quantite * M.prix ) AS valeur
                      FROM
                          mouvement M
                              INNER JOIN produit P
                                  ON M.id_produit = P.id_produit
                      GROUP BY M.id_produit, P.designation;


                      Après tu pourras directement faire une requête sur cette vue (par exemple):

                      SELECT
                          id_produit,
                          designation,
                          nb_entrees,
                          nb_sorties,
                          stock,
                          valeur
                      FROM
                          Table_Calcul
                      WHERE
                          id_produit=12



                      • Partager sur Facebook
                      • Partager sur Twitter

                      Soustraction et multiplication SQL server

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown