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

Windows Forms Discussion :

SQL-Datagridview-Conditions dynamiques affichage


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut SQL-Datagridview-Conditions dynamiques affichage
    Bonjour à tous!
    Je suis pas expert en BDD et voici mon problème:
    J'ai une requête sql avec jointure sur 4 tables (dbo.scnsavecount, dbo.scnitem, dbo.scnitemparam, dbo.scenarii).

    Voici les tables:

    dbo.scenarii:

    Nom : scenarii.PNG
Affichages : 226
Taille : 11,5 Ko

    dbo.scnsavecount:
    La clé primaire composée est scnid && Filename.

    Nom : savecount.PNG
Affichages : 217
Taille : 25,0 Ko

    dbo.scnitem:

    Nom : scnitem.PNG
Affichages : 212
Taille : 11,3 Ko

    dbo.scnitemparam:

    Nom : scnitemparam.PNG
Affichages : 238
Taille : 12,4 Ko

    Voici le code avec la requête:


    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
     
     if (m_flagConnection)
                    {
     
                        string sQry = "SELECT dbo.scenarii.scnname AS Scnname," +
                              "                dbo.scnsavecount.scnid AS Scnid," +
                              "                dbo.scnitem.id AS Itemid," +
                              "                dbo.scnsavecount.filename AS FileName," +
                              "                dbo.scnsavecount.compteur AS Compteur," +
                              "                dbo.scnitemparam.paramtype AS ParamType," +
                              "                dbo.scnitemparam.paramstring AS ParamString, " +
                              "                'Status' AS Status " +
                              "         FROM dbo.scnsavecount " +
                              "         LEFT JOIN dbo.scnitem ON dbo.scnitem.scnid = dbo.scnsavecount.scnid " +
                              "         LEFT JOIN dbo.scnitemparam ON dbo.scnitemparam.itemid = dbo.scnitem.id " +
                              "         LEFT JOIN dbo.scenarii ON dbo.scenarii.scnid = dbo.scnitem.scnid " +
                              "         WHERE dbo.scnsavecount.filename LIKE '%~%' " +
                              "           AND ( " +
                              "                 (dbo.scnitemparam.paramtype = 'RUN' AND SUBSTRING(dbo.scnsavecount.filename,1,6)=SUBSTRING(dbo.scnitemparam.paramstring,1,6)) " +
                              "				  OR " +
                              "				    (dbo.scnitemparam.paramtype IS NULL AND dbo.scnitemparam.paramstring IS NULL) " +
                              "				  )";
                        try
                        {
                            cmd = new SqlCommand(sQry, cnn);
                            da = new SqlDataAdapter(cmd);
                            ds = new DataSet();
                            da.Fill(ds);
                            dataGridView1.AutoSize = false;
                            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                            dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.Fill);
                            dataGridView1.ScrollBars = ScrollBars.Vertical;
                            dataGridView1.DataSource = ds.Tables[0];
     
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show("Bad SQL Query ! ");
                        }
                    }

    Lorsque j'ai plusieurs RUN dans ParamType pour une même clé, je souhaiterais ne pas afficher les 3 lignes, mais les regrouper en une seule en concaténant les ParamString (voir stabilo jaune=> ici je voudrais une seule ligne avec dans ParamString "INVRPT_MV_e_GELIN.run;INVRPT_MV_e_GELIN_Euroedi.run;INVRPT_MV_e_Euroedi_Armor.run") , et afficher "Erreur" dans Status.
    Idem lorsque ParamType et Pramstring sont nuls (stylo rouge=>on les regroupe en une seule ligne, avec "Erreur" dans Status.

    Voici le résultat de ma requête (j'affiche tout dans un datagridview):


    Nom : Capture.PNG
Affichages : 214
Taille : 74,9 Ko

    La colonne itemid ne sera pas affichée dans le produit final.

    Je ne sais pas si l'on peut faire ça avec des CASE ou autre.
    Sans forcément rentrer dans mon cas personnel et me mâcher le travail, avez vous des pistes globales pour faire ce genre de choses ? Merci.

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    GROUP_CONCAT n'existe pas en SQL Server.... il faut se pencher sur STUFF et XML PATH
    De plus, ma requête doit fonctionner pour au moins SQL server 2008.

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wilfryjules Voir le message
    GROUP_CONCAT n'existe pas en SQL Server.... il faut se pencher sur STUFF et XML PATH
    De plus, ma requête doit fonctionner pour au moins SQL server 2008.
    On est en 2019...

    SQL Server 2008 R2 SP1 n'est plus supporté depuis 2013. Il serait peut-être temps de mettre à jour...

    "GROUP_CONCAT", non standard, est maintenant intégré au standard SQL sous le nom de "STRING_AGG".
    SQL Server (2017 et +) et PostgreSQL supportent tous deux deux cette fonction d’agrégation.
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

  4. #4
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Oui merci pour ces infos, mais ce n'est pas moi qui ai le tampon dans la boîte ni chez les clients !

    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
     
                     string sQry = "SELECT dbo.scenarii.scnname AS Scnname," +
        "                   dbo.scnsavecount.scnid AS Scnid," +
        "                   dbo.scnitem.id AS Itemid," +
        "                   dbo.scnsavecount.filename AS FileName," +
        "                   dbo.scnsavecount.compteur AS Compteur," +
        "                   dbo.scnitemparam.paramtype AS ParamType," +
        "                   STUFF((SELECT ';' + paramstring FROM dbo.scnitemparam FOR XML PATH ('')),1,1,'') AS ParamString," +
        "                   'Status' AS Status " +
        "            FROM dbo.scnsavecount " +
        "            LEFT JOIN dbo.scnitem ON dbo.scnitem.scnid = dbo.scnsavecount.scnid " +
        "            LEFT JOIN dbo.scnitemparam ON dbo.scnitemparam.itemid = dbo.scnitem.id " +
        "            LEFT JOIN dbo.scenarii ON dbo.scenarii.scnid = dbo.scnitem.scnid " +
        "            WHERE dbo.scnsavecount.filename LIKE '%~%' " +
        "            AND ( " +
        "                 (dbo.scnitemparam.paramtype = 'RUN' AND SUBSTRING(dbo.scnsavecount.filename,1,6)=SUBSTRING(dbo.scnitemparam.paramstring,1,6)) " +
        "				  OR " +
        "				    (dbo.scnitemparam.paramtype IS NULL AND dbo.scnitemparam.paramstring IS NULL) " +
        "				  ) " +
        "            GROUP BY Scnname, Scnid, FileName, Compteur, ParamType";
    J'essaye ce que je peux, mais maintenant j'ai le GROUP BY qui fait planter ma requête.... si je l'enlève la requête passe...

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    En même temps, quelle est l'utilité de ton group by ? Tu n'as pas de fonction d'aggrégation

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Si, justement, le STUFF SELECT XML PATH est une condition d'aggrégation

    J'ai voulu reproduire ça (attention il y a une erreur dans ce code, voir les réponses en dessous):
    https://stackoverflow.com/questions/...-in-sql-server

    Id Name
    1 aaa
    1 bbb
    1 ccc
    1 ddd
    1 eee

    Required output:

    Id abc
    1 aaa,bbb,ccc,ddd,eee

    Query:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID, 
        abc = STUFF(
                     (SELECT ',' + name FROM temp1 FOR XML PATH ('')), 1, 1, ''
                   ) 
    FROM temp1 GROUP BY id

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

Discussions similaires

  1. [MySQL] Intégrer 2 requêtes sql pour condition d'affichage
    Par L.A.. dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 05/08/2015, 17h47
  2. [9i][SQL Plus] Probleme d'affichage ?
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 30/10/2005, 09h46
  3. Comment traduire en SQL cette condition?
    Par LESOLEIL dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/08/2005, 16h31
  4. Réponses: 5
    Dernier message: 09/08/2005, 17h38
  5. [SQL*Plus] génération dynamique du fichier de spool
    Par lalystar dans le forum Oracle
    Réponses: 3
    Dernier message: 06/12/2004, 10h44

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