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

ASP.NET MVC Discussion :

Question sur les requêtes SQL [Débutant]


Sujet :

ASP.NET MVC

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut Question sur les requêtes SQL
    Bonjour,

    Pour le développement de mon appli, j'aurais besoin d'un renseignement, comment utiliser ce genre de requête avec MVC3 :
    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
     
    select
    CD_CR,
    LB_CR,
    CD_APPLI,
    LB_APPLI,
    case
    when (CD_APPLI = 'ESPAS' and exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT = 'KO'))
    then 'KO'
    when (CD_APPLI = 'ESPAS' and not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT in('KO','NEXEC')))
    then 'OK'
    when CD_APPLI = 'ESPAS' and (not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='KO'))
    and (exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='NEXEC'))
    then 'EN COURS'
    else NULL
    end STATUT
    from
    dbo.REF_CR,
    dbo.REF_APPLI
    order by CD_CR,ORDRE_APPLI
    Cette requête sera surement réutilisée dans mon code mais le truc, c'est que j'étais habitué aux requêtes du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var query = (from a in db.Appli
                                 select new Applis { CR = a.CR, ESPAS = (int)a.ESPAS, BO = (int)a.BO, PNB = (int)a.PNB }).ToList();
    Je me demande donc comment transformer la première pour pouvoir l'utiliser avec ASP.NET MVC3 de la même façon que la deuxième.
    Le plus gros problème c'est le switch avec les :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    when (CD_APPLI = 'ESPAS' and exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT = 'KO'))
    then 'KO'
    Je ne vois pas comment faire un switch dans mes requêtes...

    Est-ce que c'est possible ?

    Merci d'avance pour vos réponses.

    PS : Désolé de poster autant de sujets

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bon j'ai essayé d'avancer sur le sujet et voici ce que j'ai maintenant :

    Voilà mon action Index qui récupère le résultat de la requête exécutée dans la méthode située un peu plus bas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            public ActionResult Index()
            {
                var items = GetIndex();
     
                return View(items);
            }
    La méthode :

    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
     
            private List<DataRow> GetIndex()
            {
                List<DataRow> liste = null;
                string query = "select CD_CR, LB_CR, CD_APPLI, LB_APPLI, case when (CD_APPLI = 'ESPAS' and exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT = 'KO')) then 'KO' when (CD_APPLI = 'ESPAS' and not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT in('KO','NEXEC'))) then 'OK' when CD_APPLI = 'ESPAS' and (not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='KO')) and (exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='NEXEC')) then 'EN COURS' else NULL end STATUT from dbo.REF_CR, dbo.REF_APPLI order by CD_CR,ORDRE_APPLI";
                string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";
                using (SqlConnection conn = new SqlConnection(connString))
                {
                     using (SqlCommand objCommand = new SqlCommand(query, conn))
                    {
                        objCommand.CommandType = CommandType.Text;
                        DataTable dt = new DataTable();
                        SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                        conn.Open();
                        adp.Fill(dt);
                        if (dt != null)
                        {
                            liste = dt.AsEnumerable().ToList();
                        }
                    }
                }
                return liste;
             }
    Déjà je ne sais pas si ce que j'ai fait et correct et de plus, je ne vois pas comment afficher mon résultat dans ma vue sous la forme d'un tableau...

    Avez-vous une idée ?

    Merci pour votre aide.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bon bah j'ai réussi xD J'arrive bien à exécuter ma petite requête pure SQL.

    Voici mon code, tout d'abord le contrôleur sélectionnant les champs qui m'intéressent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            public ActionResult Index()
            {
                var items = GetIndex();
     
                var newItems = (from i in items
                                select new Suivi 
                                { CD_CR = i.Field<String>("CD_CR"), LB_CR = i.Field<String>("LB_CR"), CD_APPLI = i.Field<String>("CD_APPLI"), LB_APPLI = i.Field<String>("LB_APPLI"), STATUT = i.Field<String>("STATUT") }).ToList();
                return View(newItems);
            }
    Ensuite, la méthode GetIndex s'occupant d'effectuer la requête pure SQL et la connexion à la BDD :
    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
     
    private List<DataRow> GetIndex()
            {
                List<DataRow> liste = null;
                string query = "select CD_CR, LB_CR, CD_APPLI, LB_APPLI, case when (CD_APPLI = 'ESPAS' and exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT = 'KO')) then 'KO' when (CD_APPLI = 'ESPAS' and not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT in('KO','NEXEC'))) then 'OK' when CD_APPLI = 'ESPAS' and (not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='KO')) and (exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='NEXEC')) then 'EN COURS' else NULL end STATUT from dbo.REF_CR, dbo.REF_APPLI order by CD_CR,ORDRE_APPLI";
                string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";
                using (SqlConnection conn = new SqlConnection(connString))
                {
                     using (SqlCommand objCommand = new SqlCommand(query, conn))
                    {
                        objCommand.CommandType = CommandType.Text;
                        DataTable dt = new DataTable();
                        SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                        conn.Open();
                        adp.Fill(dt);
                        if (dt != null)
                        {
                            liste = dt.AsEnumerable().ToList();
                        }
                    }
                }
                return liste;
             }
    Mon modèle Suivi :
    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
     
    namespace SUIVI_DWH.Models
    {
        public class Suivi
        {
            public string CD_APPLI { get; set; }
            public string LB_APPLI { get; set; }
            public int ORDRE_APPLI { get; set; }
            public string CD_CR { get; set; }
            public string LB_CR { get; set; }
            public string CNX_STRING_NEO { get; set; }
            public string CNX_STRING_ESPA { get; set; }
            public string LB_JOB { get; set; }
            public string CD_TRT_SSIS { get; set; }
            public string CD_TRT { get; set; }
            public string CD_TYP_TRT { get; set; }
            public int ORDRE_JOB { get; set; }
            public int IDLOG { get; set; }
            public string CD_JOB { get; set; }
            public string DT_DEB { get; set; }
            public string DT_FIN { get; set; }
            public string STATUT { get; set; }
            public Int64 PERIODE { get; set; }
            public string LB_TRT { get; set; }
            public int ORDRE_TRT { get; set; }
            public string LB_TYP_TRT { get; set; }
        }
    }
    Et ensuite ma vue :
    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
     
    @model IEnumerable<SUIVI_DWH.Models.Suivi>
    @using SUIVI_DWH.Helpers
    @{
        ViewBag.Title = "Index";
    }
    <h2>
        Index</h2>
    <table>
        <tr>
            <th>
                CR
            </th>
            <th>
                Libellé CR
            </th>
            <th>
                Appli
            </th>
            <th>
                Libellé Appli
            </th>
            <th>
                STATUT
            </th>
        </tr>
        @foreach (var newItems in Model)
        {
            <tr>
                <td>
                    @newItems.CD_CR
                </td>
                <td>
                    @newItems.LB_CR
                </td>
                <td>
                    @newItems.CD_APPLI
                </td>
                <td>
                    @newItems.LB_APPLI
                </td>
                <td>
                    @newItems.STATUT
                </td>
            </tr>
        }
    </table>
    Voili voilou, ça m'affiche les résultats attendu :




    C'est bien joli tout ça mais bon quand un problème se finit un autre arrive au galop.
    Voilà ce que j'aimerais faire, mes résultats dans ma colonne "Libellé Appli", je voudrais qu'ils deviennent eux-même mes colonnes et que les résultats de la colonne "STATUT" se retrouve aux colonnes correspondantes.
    Pour être plus clair voici ce que je souhaite avoir par rapport au tableau précédent :



    Voilà le résultat attendu, je ne peux pas créer de champs dans ma table du nom de chaque application (ESPAS, BO, ...) où se trouverait le STATUT, ce serait plus simple mais je peux pas :/

    D'autant plus que je souhaiterais qu'à chaque fois qu'une nouvelle application apparaît dans mon champ Libellé CR (LB_CR dans ma base), une nouvelle colonne apparaisse dont le nom est la nouvelle application et son statut s'y intègre directement.

    Est-ce que vous voyez comment procéder ? Ca me semble assez chaud à réaliser non ?

    En tout cas, merci d'avance pour votre aide.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bon je vais faire mon premier quadruple post de ma vie mais bon j'ai besoin de vous montrer où j'en suis car j'en ai toujours pas fini avec cette histoire de tableaux.

    Actuellement j'ai effectué quelques modifications et rajouts dans mon code me permettant d'obtenir un tableau de ce type :



    Comme vous pouvez le voir ça se rapproche de ce que je veux mais bon y a ce problème de répététion, il me remet la CR sur 2 lignes où les autres cellules sont vides.

    Voilà ce que j'ai modifié et rajouté dans mon contrôleur :
    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
     
    public ActionResult Index()
            {
                var queries = new query();
                var items = GetIndex();
                var items2 = GetAppli();
     
                queries.Query1 = (from i in items
                                select new Suivi 
                                { CD_CR = i.Field<String>("CD_CR"), LB_CR = i.Field<String>("LB_CR"), CD_APPLI = i.Field<String>("CD_APPLI"), LB_APPLI = i.Field<String>("LB_APPLI"), STATUT = i.Field<String>("STATUT") }).ToList();
     
                queries.Query2 = (from i in items2
                                select new Suivi {LB_APPLI = i.Field<String>("LB_APPLI")}).ToList();
     
     
                return View(queries);
            }
     
            private List<DataRow> GetIndex()
            {
                List<DataRow> liste = null;
                string query = "select CD_CR, LB_CR, CD_APPLI, LB_APPLI,"
                + "case when (CD_APPLI = 'ESPAS' and exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT = 'KO')) then 'KO' when (CD_APPLI = 'ESPAS' and not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT in('KO','NEXEC'))) then 'OK' when CD_APPLI = 'ESPAS' and (not exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='KO')) and (exists (select 1 from dbo.LOGS l where l.PERIODE =(select MAX(PERIODE) from dbo.LOGS) and l.STATUT ='NEXEC')) then 'EN COURS' else NULL end STATUT from dbo.REF_CR, dbo.REF_APPLI order by CD_CR,ORDRE_APPLI";
                string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";
                using (SqlConnection conn = new SqlConnection(connString))
                {
                     using (SqlCommand objCommand = new SqlCommand(query, conn))
                    {
                        objCommand.CommandType = CommandType.Text;
                        DataTable dt = new DataTable();
                        SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                        conn.Open();
                        adp.Fill(dt);
                        if (dt != null)
                        {
                            liste = dt.AsEnumerable().ToList();
                        }
                    }
                }
                return liste;
             }
     
            private List<DataRow> GetAppli()
            {
                List<DataRow> liste = null;
                string query = "select distinct LB_APPLI, ORDRE_APPLI from dbo.REF_APPLI order by ORDRE_APPLI";
                string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";
                using (SqlConnection conn = new SqlConnection(connString))
                {
                    using (SqlCommand objCommand = new SqlCommand(query, conn))
                    {
                        objCommand.CommandType = CommandType.Text;
                        DataTable dt = new DataTable();
                        SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                        conn.Open();
                        adp.Fill(dt);
                        if (dt != null)
                        {
                            liste = dt.AsEnumerable().ToList();
                        }
                    }
                }
                return liste;
            }
    Je me suis créé pour renvoyer le résultat de chacunes de mes requêtes un nouveau model :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    namespace SUIVI_DWH.Models
    {
        public class query
        {
            public List<SUIVI_DWH.Models.Suivi> Query1 { get; set; }
            public List<SUIVI_DWH.Models.Suivi> Query2 { get; set; }
     
        }
    }
    Et ma vue auquel j'ai rajouté le code me permettant de récupérer les noms des applications et de les mettre en tant que colonne avec à l'intérieur le statut leur correspondant () :
    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
     
    @model SUIVI_DWH.Models.query
    @using SUIVI_DWH.Helpers
    @{
        ViewBag.Title = "Index";
    }
    <h2>
        Index</h2>
    <table>
        <tr>
            <th>
                CR
            </th>
            <th>
                Libellé CR
            </th>
            @foreach (var query2 in Model.Query2)
            {
                <th>
                    @query2.LB_APPLI
                </th>
     
            }
        </tr>
        @foreach (var query1 in Model.Query1)
        {
            <tr>
                <td>
                    @query1.CD_CR
                </td>
                <td>
                    @query1.LB_CR
                </td>
                @foreach (var query2 in Model.Query2)
                {
                    if (query1.LB_APPLI.Equals(query2.LB_APPLI)) //Par ici ?
                    {
     
                    <td>
                        @query1.STATUT
                    </td>
                    }
                }
            </tr>
        }
    </table>
    Voilà pour ce qui est de mon code, maintenant je souhaiterais supprimer cette répétition, pour moi, il faudrait, là où se trouve le commentaire "Par ici ?", définir une condition du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Si la CR de cette ligne est égale à celle de la ligne précédente alors ne rien faire,
    Sinon remplir la cellule avec le statut.
    Mais je ne vois pas comment récupérer la valeur CR de la ligne précédente...
    Ce que je veux faire est-il la meilleure solution ?
    Et sinon, quelle serait la meilleure solution à adopter ?

    Merci d'avances pour vos réponses et encore désolé des 4 posts à la suite

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Informatique en Alternance
    Inscrit en
    Mai 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Informatique en Alternance
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2012
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bon pour ceux que ça intéresse (aussi peu nombreux soient-ils x) ), j'ai réussi à résoudre mon soucis de la manière la plus simple possible en espérant que ma solution fonctionne dans la continuité de mon projet.

    Les modifications apportées sont situées dans ma vue, tout en haut de celle-ci, je créé une variable globale de type string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @{
        string VarCR = null;
    }
    Et ensuite, j'y vais à coup de If :
    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
     
        @foreach (var query1 in Model.Query1)
        {
            <tr>
                @if (query1.CD_CR.Equals(VarCR))
                {
     
                }
                else
                {
                    <td>
                        @query1.CD_CR
                    </td>
                    <td>
                        @query1.LB_CR
                    </td>
                }
                @foreach (var query2 in Model.Query2)
                {
                    if (query1.LB_APPLI.Equals(query2.LB_APPLI))
                    {
                        if (query1.CD_CR.Equals(VarCR))
                        {
     
                        }
                        else
                        {
                    <td>
                        @query1.STATUT
                    </td>
                        }
     
     
                    }
                }
            </tr>
                VarCR = query1.CD_CR;
        }
    </table>
    J'ai donc mes conditions qui me font en gros, si le CD_CR actuel est égal au CD_CR précédent (donc au contenu de ma variable VarCR que j'affecte bien à la fin de mon foreach sinon ça ne marche évidemment pas), je n'affiche rien sinon j'affiche ce qui va bien.

    Bon bah j'en ai normalement fini avec ce topic, je le passe donc en Résolu

    Cia"

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

Discussions similaires

  1. [AC-2002] Question sur les requetes SQL
    Par Jean-Luc80 dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/09/2009, 13h02
  2. [MySQL] [POO] Sécurité sur les requêtes SQL
    Par Sh4dow49 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/10/2008, 10h51
  3. Question sur les requêtes hiérarchiques
    Par casawi dans le forum SQL
    Réponses: 3
    Dernier message: 05/08/2008, 14h54
  4. Questions sur les rêquetes sql oracle?
    Par naima2005 dans le forum SQL
    Réponses: 6
    Dernier message: 24/12/2007, 13h57
  5. Question sur les requêtes paramétrées
    Par lutecefalco dans le forum VB.NET
    Réponses: 3
    Dernier message: 04/12/2007, 10h13

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