IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Mettre le résultat d'une soustraction dans une colonne


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut Mettre le résultat d'une soustraction dans une colonne
    Bonjour,
    J'ai un petit problème je ne vois pas comment je peux faire pour mettre le résultat d'une soustraction dee 2colones qui appartienne à une tableA dans une tableB sachant que je suis dans une boucle for.

    j'espère que je suis clair sinon demander moi plus d'information
    merci d'avance

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par mikoukoumi Voir le message
    sachant que je suis dans une boucle for.
    Que veux-tu dire par là ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE table_b
    INNER JOIN table_a ON condition_de_jointure
    SET table_b.colonne_resultat = table_a.une_colonne - table_a.une_autre_colonne
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    une boucle for (i=0;i>valeurmaxdemontableau;i ++)
    ce qui veux dire que chaque ligne de mon tableau doit utiliser ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     UPDATE table_b
    INNER JOIN table_a ON condition_de_jointure
    SET table_b.colonne_resultat = table_a.une_colonne - table_a.une_autre_colonne
    pour changer la valeur de toute ma colonne de ma vue

    c'est que je fais des requêtes sql sous Microsoft Visual Studio 2008 en C#(Csharp)
    donc sa me facilite pas la tâches ^^
    En plus de cela c'est des requêtes sql que je fais en c# pour sql serveur 2005
    sa fais une semaine que j'ai commencé le c# donc pas trop facile
    j'ai essayé d'être le plus claire possible

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par mikoukoumi Voir le message
    une boucle for (i=0;i>valeurmaxdemontableau;i ++)
    ce qui veux dire que chaque ligne de mon tableau doit utiliser ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     UPDATE table_b
    INNER JOIN table_a ON condition_de_jointure
    SET table_b.colonne_resultat = table_a.une_colonne - table_a.une_autre_colonne
    pour changer la valeur de toute ma colonne de ma vue
    Avec ma requête, tu ne devrais pas avoir besoin de la boucle et donc de lancer X fois une requête à l'aide de cette boucle.
    Le SQL travaille de façon ensembliste. Ma requête signifie :
    "Mets à jour la table_b, jointe à la table_a sur une certaine condition de jointure (condition d'égalité de valeurs entre une colonne de table_a et une colonne de table_b), en affectant à la colonne_resultat de la table_b la valeur d'une colonne de la table_a moins la valeur d'une autre colonne de la table a."
    La condition de jointure permet de ne mettre à jour que les lignes en correspondance entre les deux tables. Si cette présélection n'est pas suffisante, tu peus restreindre les données à mettre à jour en ajoutant une clause WHERE.

    Donne un exemple plus précis de ce que tu souhaites faire avec la structure des tables impliquées, ce sera plus facile de t'aider.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    mettre à jour une colonne Qté qui fait partie de ma vue

    J'obtiens la colonne Qté en soustrayant Quantité-Quantitélivré (deux colonnes qui se trouve dans la table LignesAchatCommande)
    Je suis en stage en entreprise et mon but et d'optimisé le code pour que la requête prenne le moins de temps possible.(car 23min la requêtes sous oracle)

    Il me conseil l'utilisation d'une boucle for(car il y a plusieurs milliers de lignes)
    si tu a un conseil pour optimiser le temps d'exécution je suis a ton écoute
    merci d'avance de ta patience.
    ^^

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    23 minutes sous Oracle, même avec plusieurs milliers de lignes, il y a clairement un problème quelque part !
    - la table est-elle correctement indexée ?
    - le serveur est-il bien dimensionné ?


    Structure de la ou des tables ?
    Quelle requête est faite ?

    Il me conseil
    Qui ?

    Tu as posté ton message dans le forum MySQL.
    Suite à ceci, je l'ai déplacé dans le forum SQL Server :
    En plus de cela c'est des requêtes sql que je fais en c# pour sql serveur 2005
    Maintenant, tu dis que tu es sous Oracle :
    23min la requêtes sous oracle
    Il faudrait savoir !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    quand je dit il c'est mon tuteur de stage

    Je fais sa avec sql serveur mais je doit comparer avec oracle et je doit savoir pourquoi la requêtes met autant de temps sous oracle(certes le serveur n'est pas dimensionné mais quand même sa fais une peu long je trouve ).Sous sql serveur la requête prend 3min.

    Le problème c'est qu'il faut d'abord que mon code marche, pour le moment je fais sous sql serveur
    regarde mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace Csharpview
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                try
                {
                    // Chaîne de connexion
                    string strConnect = "database=Maintimedia;server=monserveur;User ID=xx;pwd=xx";
     
                    // Objet sql de connection (chaîne)
                    SqlConnection connection = new SqlConnection(strConnect);
     
                    // Ouverture de la connexion sql serveur
                    connection.Open();
     
                    // Créer une requête sql
     
                    string strCommand = "SELECT DISTINCT Articles.Code, Articles.Designation,0 as Qte FROM Articles CROSS JOIN LignesAchatCommande CROSS JOIN AchatCommandes AS ref WHERE LignesAchatCommande.Article = Articles.Article AND ref.Soldee=0";
     
                    //SqlCommand command = new SqlCommand(strCommand, connection);
     
                    //Créer un DataTable
                     DataTable dataTable= new DataTable();
     
     
                    //Créer un DataAdapter
                    SqlDataAdapter dataAdapter = new SqlDataAdapter(strCommand, strConnect);
                    //SqlCommand cmd = new SqlCommand();
                    //cmd.ExecuteScalar();
     
                     for (int i = 0; i <=dernièreligne; i++ )   //Boucle dans lequel j'aimerais changer ligne par ligne ma colonne Qte                           
    			{
                    dataTable.Rows  ;//mon tuteur ma dit d'utiliser ca mais je ne vois pas se que je peut mettre après
     
                    //je pense que  le code pr changer chaque ligne de la colonne Qte doit se mettre ici
     
     
                    //Remplis(fill) le DataTable avec le DataAdapter
                    dataAdapter.Fill(dataTable);
     
     
     
     
                    //remplir le datagridview avec un dataset
                    dataGridView1.DataSource = dataTable;
     
                    //Fermeture de la connexion sql serveur
                    connection.Close();
                }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.ToString());
                 }
                 }
            }
    }
    oubli oracle désolé je me suis mal exprimé
    si tu vois des erreurs de codes merci de me les signaler
    merci d'avance encore de ta patience

    ps: je suis novice encore et je demande qu'à apprendre, je te suis très reconnaissant

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Je pense que vous vous trompez dans votre façon d'écrire la requête.
    CROSS JOIN effectue un produit cartésien de deux tables.
    Si donc nous avons une table A qui contient deux lignes, et une table B qui en contient 3, par le produit cartésien nous obtiendrons 6 lignes, sans vérifier que les valeurs de clé de l'une se trouvent dans l'autre.

    Je pense plutôt que votre requête devrait ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT DISTINCT Articles.Code
    		, Articles.Designation
    		,0 as Qte
    FROM		dbo.Articles AS A
    INNER JOIN	dbo.LignesAchatCommande AS LAC
    			ON LAC.Article = A.Article
    INNER JOIN	dbo.AchatCommandes AS AC
    			ON AC.AchatCommande = LAC.AchatCommande
    WHERE		AC.Soldee = 0
    Je doute même de l'utilité du DISTINCT, qui est un opérateur coûteux, après que vous ayez spécifié les INNER JOIN.
    La jointure entre AchatCommandes et ListeAchatCommande est une supposition : je l'ai fait sur AchatCommande, qui n'exsite probablement pas.

    Lisez d'abord le cours sur les jointures de SQLPro.
    Je pense que vous y verrez plus clair ensuite.

    Notez que pour de meilleures performances, les colonnes qui participent au prédicat de jointure doivent être indexées.

    J'ai un petit problème ... sachant que je suis dans une boucle for.
    Tout le problème vient de là : SQL n'est pas un langage conçu pour traiter les données ligne-à-ligne, mais pour les traiter dans leur ensemble, comme vous l'a dit CinePhil.
    Dès lors comparez les performances de requêtes ensemblistes sur les deux SGBDR est plus correct

    @++

  9. #9
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    merci pour cette réponse claire je vais lire le cours ^^ et je pense que sa devrais passer

  10. #10
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    j'ai essayer de mettre la requête que tu as faite dans sql serveur 2005
    et il m'a mis des erreurs

    Msg*4104, Niveau*16, État*1, Ligne*1
    L'identificateur en plusieurs parties "Articles.Code" ne peut pas être lié.
    Msg*4104, Niveau*16, État*1, Ligne*1
    L'identificateur en plusieurs parties "Articles.Designation" ne peut pas être lié.

    si tu as une piste à quoi se serais lié

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Articles.Designation,0 AS Qte FROM dbo.Articles AS A 
    INNER JOIN	dbo.LignesAchatCommande AS LAC 
    ON LAC.Article = A.Article
    INNER JOIN dbo.AchatCommandes AS AC 
    ON AC.AchatCommande = LAC.AchatCommande 
    WHERE	AC.Soldee = 0

  11. #11
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je ne connais pas SQL Server mais j'interprête les messages d'erreurs par le fait que tu n'as pas utilisé l'alias de la table Articles (A) dans le SELECT.

    Remplace Articles.Designation et Articles.Code par A.Designation et A.Code.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Membre éprouvé Avatar de mikoukoumi
    Homme Profil pro
    Développeur .net
    Inscrit en
    Mai 2010
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur .net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 151
    Par défaut
    réponse rapide et sa marche vraiment trop calé sur le sujet ^^
    merci beaucoup de ta patience^^

    je met la requête sql si sa peut servir d'exemple à d'autres personnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.Code, A.Designation,0 AS Qte FROM dbo.Articles AS A 
    INNER JOIN	dbo.LignesAchatCommande 
    AS LAC ON LAC.Article = A.Article 
    INNER JOIN dbo.AchatCommandes 
    AS AC ON AC.AchatCommande = LAC.AchatCommande 
    WHERE	AC.Soldee = 0

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT 1.0] Mettre le résultat de l'appel d'une fonction dans une variable
    Par Giovanny Temgoua dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 16/01/2012, 18h47
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 20h05
  3. Réponses: 4
    Dernier message: 02/07/2008, 12h32
  4. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 27/08/2007, 00h04
  5. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo