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 Discussion :

Requête pour forum


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de naima2005
    Inscrit en
    Février 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 340
    Par défaut Requête pour forum
    Bonsoir à tous,

    J'essaye dans mon programme d'afficher un forum et ses sous forums au dessous comme cela:

    Forum 1
    Sous Forum11
    Sous Forum12

    Forum2
    Sous Forum21
    Sous Forum22


    Dans ma base de données,j'ai 2 tables principales

    table Forums(ForumID,Title,Description)
    table ForumSubForum(ParentForumID,SubForumID)

    Sachant que tous mes forums ainsi que mes sous forums sont enregistrer dans la table Forums(clé ForumID) et pour savoir que mon Forum1 est un forum parent il faut le trouve dans la table ForumSubForum avec cette condition Forums.ForumID=ForumSubForum.ParentForumID et pour savoir que Sous Forum11 et Sous Forum12 sont des sous forums il faut que cette condition se verifie Forums.ForumID=ForumSubForum.SubForumID.

    Donc j'ai crée 2 requettes principales

    req1 = requete pour connaitre les forums parents


    select distinct Forums.ForumID,Forums.Title,Forums.Description from Forums Join ForumSubForum where Forums.ForumID=ForumSubForum.ParentForumID;

    req2 = requete pour connaitre les forums fils


    select distinct ForumSubForum.SubForumID from Forums Join ForumSubForum where ForumSubForum.SubForumID=Forums.ForumID;

    Qu'elle est la requête qui me permet de faire se traitement à partir de ces 2 requetes cad afficher mes forums et sous forums relies comme dans le lien
    http://www.developpez.net/forums/ (classement des forums)

    Merci d'avances

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Par défaut
    Je ne comprends pas trop ce qui ne va pas...
    1. Tu listes les forums parents :
      Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      SELECT * 
        FROM Forums fo 
       WHERE NOT EXISTS (
           SELECT 1 
             FROM ForumSubForum fsf 
            WHERE fsf.SubForumID = fo.ForumID 
       );
    2. Tu listes les forums enfants pour chaque parent (le ForumID) :
      Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      SELECT *
        FROM ForumSubForum fsf 
       WHERE fsf.ParentForumID = ?
      ;
    Le "?" étant un paramètre à passer à ta requête.

    Après, pour ne pas multiplier les requêtes sur la base, je ne sais pas si ce n'est pas plus judicieux de tout charger dans un DataSet et de faire le traitement dans ton code C#.

  3. #3
    Membre éclairé Avatar de naima2005
    Inscrit en
    Février 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 340
    Par défaut
    Merci pour votre réponse.

    J'ai essayé la requêtte que tu m'a donnée mais j'ai des problèmes d'execution.

    Voici mon Code :

    Code C#

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    protected void Page_Load(object sender, System.EventArgs e)
    		{
             
                DataSet ds = new DataSet();
                
    
                ds.Tables.Add("ForumGroups"); 
                ds.Tables.Add("Forums");
                ds.Tables.Add("ForumSubforums");
    
                
    
                DbDataAdapter da = providerFactory.CreateDataAdapter();
                
    
                da.SelectCommand = this.cmd;
                
    
    
    
                this.cn.Open();
                this.cmd.CommandText = "SELECT DISTINCT ForumGroups.GroupID, ForumGroups.GroupName FROM ForumGroups INNER JOIN Forums ON ForumGroups.GroupID=Forums.GroupID";
                da.Fill(ds.Tables[0]);
    
               
    
                string strSQLAllowedForums = "SELECT ForumGroupPermissions.ForumID FROM " +
                    "ForumUsersInGroup INNER JOIN ForumGroupPermissions ON ForumUsersInGroup.GroupID = ForumGroupPermissions.GroupID " +
                    "WHERE ForumUsersInGroup.UserID=? AND ForumGroupPermissions.AllowReading=?"; //query select allowed forums
    
                this.cmd.CommandText =
                    "SELECT Forums.ForumID, Forums.Title, Forums.Description, Count(ForumTopics.TopicID) AS Topics, Forums.GroupID, MAX(ForumTopics.LastMessageID) as LatestMessageID " +
                    "FROM (Forums LEFT OUTER JOIN ForumTopics ON Forums.ForumID=ForumTopics.ForumID) " +
                    "LEFT OUTER JOIN ForumMessages ON ForumTopics.LastMessageID = ForumMessages.MessageID " +
                    "WHERE Forums.ForumID NOT IN (SELECT SubForumID FROM ForumSubforums)" + //not a subforum
                    //"where ForumSubforums ON Forums.ForumID = ForumSubforums.ParentForumID" +
                    "AND (Forums.ForumID NOT IN (SELECT ForumID FROM ForumGroupPermissions WHERE AllowReading=?) OR Forums.ForumID IN (" + strSQLAllowedForums + ")) " + //not a private forum
                    "GROUP BY Forums.ForumID, Forums.Title, Forums.Description, Forums.GroupID, Forums.OrderByNumber " +
                    "ORDER BY Forums.OrderByNumber";
    
                Utils.DB.FillCommandParamaters(ref cmd, true, CurrentUserID, true);
                
                da.Fill(ds.Tables[1]);
    
                string ch = "SELECT ForumID, Title, Description, Premoderated, GroupID, MembersOnly, OrderByNumber FROM Forums WHERE (NOT EXISTS (SELECT 1 AS Expr1 FROM ForumSubforums WHERE (SubForumID = Forums.ForumID)))";
                //int i=int.Parse(ch);
    
                this.cmd.CommandText = "SELECT ForumSubforums.SubForumID, Forums.ForumID FROM ForumSubforums INNER JOIN Forums ON ForumSubforums.ParentForumID = Forums.ForumID";
               
    
                Utils.DB.FillCommandParamaters(ref cmd, true, CurrentUserID, true);
    
                da.Fill(ds.Tables[2]);
                this.cn.Close();
                
    
                ds.Relations.Add(new DataRelation("ForumGroupsForums", ds.Tables[0].Columns["GroupID"], ds.Tables[1].Columns["GroupID"]));
                ds.Relations.Add(new DataRelation("ForumSubForums", ds.Tables[1].Columns["ForumID"], ds.Tables[2].Columns["ForumID"]));
    
    
                this.rptGroupsList.DataSource = ds.Tables[0];
                this.rptGroupsList.DataBind();
    
                this.Repeater1.DataSource = ds.Tables[2];
                this.Repeater1.DataBind();
                
    
                rptGroupsList.Visible = (rptGroupsList.Items.Count != 0);
                lblNoForums.Visible = (rptGroupsList.Items.Count == 0);
    
                Repeater1.Visible = (rptGroupsList.Items.Count != 0);
                lblNoForums.Visible = (rptGroupsList.Items.Count == 0);
    
                this.Title = forumTitle;
    		}
    
    		protected void rptGroupsList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
    		{
                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    Repeater nestedRepeater = e.Item.FindControl("rptForumsList") as Repeater;
                    DataRowView dv = e.Item.DataItem as DataRowView;
                    nestedRepeater.DataSource = dv.CreateChildView("ForumGroupsForums");
                    nestedRepeater.DataBind();
                }
    		}
            protected void rptForumsList_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
            {
                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                {
                    Repeater Repeater = e.Item.FindControl("rptForumsList") as Repeater;
                    DataRowView dv = e.Item.DataItem as DataRowView;
                    Repeater.DataSource = dv.CreateChildView("ForumSubForums");
                    Repeater.DataBind();
                }
            }
    Code asp.net

    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
    <asp:Repeater ID="rptGroupsList" Runat="server" EnableViewState="False" OnItemDataBound="rptGroupsList_ItemDataBound">
    			<HeaderTemplate>
    				<table style="width:100%;" cellspacing="0">
    				<tr>
    					<th> </th>
    					<th style="width:70%;">
    						<asp:Label ID="lblForums" runat="server" EnableViewState="False" meta:resourcekey="lblForumsResource1" CssClass="titre1">Forums</asp:Label></th>
    					<th><asp:Label ID="lblThreads" runat="server" EnableViewState="False" meta:resourcekey="lblThreadsResource1" CssClass="titre1">Threads</asp:Label></th>
    					<th><asp:Label ID="lblLatestPost" runat="server" EnableViewState="False" meta:resourcekey="lblLatestPostResource1" CssClass="titre1">Latest post</asp:Label></th>
    				</tr>
    			</HeaderTemplate>
    			<ItemTemplate>
    				<tr>
    					<td style="background-color:#ebebeb" colspan="4"><h3><%# Eval("GroupName") %></h3></td>
    				</tr>
    				<asp:repeater id="rptForumsList" runat="server" EnableViewState="False" OnItemDataBound="rptForumsList_ItemDataBound">
    					<ItemTemplate>
     
    					<asp:Repeater ID="Repeater1" runat="server">
        <headertemplate>
              <table border="1">
                <tr>
                  <td><b>Title</b></td>
                  <td><b>Description</b></td>
                  <td><b>forumid</b></td>
                </tr>
            </headertemplate>
     
        <itemtemplate>
              <tr>
                <td> <%# Eval("Title") %> </td>
                <td> <%# Eval("ForumID") %> </td>
                <td> <%# Eval("Description") %> </td>
              </tr>
            </itemtemplate>
     
        </asp:Repeater>
    						<tr>
    							<td align="center"><img alt="" src="images/forum.gif"></td>
    							<td><h2>
    							    <a href='<%# aspnetforum.Utils.GetForumURL(Eval("ForumID"), Eval("Title")) %>'><%# Eval("Title") %></a>
    								</h2>
    								<%# Eval("Description") %>
    							</td>
       <td>
    <%# Eval("Topics") %></td>
    							<td>
    <%# GetMsgInfoByID(Eval("LatestMessageID")) %></td>
    						</tr>
    					</ItemTemplate>		
    				</asp:repeater>
    			</ItemTemplate>
    			<FooterTemplate>
    				</table>
    			</FooterTemplate>
    		</asp:Repeater>
    Pour l'erreur il est au niveau

    Cette contrainte ne peut pas être activée, car toutes les valeurs n'ont pas de valeurs parentes correspondantes.

    la ligne ds.Relations.Add(new DataRelation("ForumSubForums", ds.Tables[1].Columns["ForumID"], ds.Tables[2].Columns["ForumID"]));

    Merci d'avances

  4. #4
    Membre éclairé Avatar de naima2005
    Inscrit en
    Février 2006
    Messages
    340
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Février 2006
    Messages : 340
    Par défaut
    Pour les 2 requettes que tu m'a donnée pour les concaténés c'est à dire pour récuperer le @param.

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 50
    Par défaut
    J vai essayer d'expliquer la solution proposé par alband85de ma façon car elle est correcte:

    1- comme il dit Tu listes les forums parents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
      FROM Forums, ForumSubForum  
     WHERE Forums.ForumID = ForumSubForum.ParentForumID
    Donc le résultat sera l'ensemble des Forum Parent ok.

    2- Tu listes les forums enfants pour chaque parent (le ForumID) :
    d'une autre manière tu parcoure le résultat du premier requête ligne par ligne (avec SQLDATAREADER) et tu affiche le Forum Parent puis tu utilise sont ID pour exécuté la deuxième 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
    //ici la première requête
    SqlDataReader reader = ...
    // l'exécution de la requête 1
     
    while(reader.Read())
    {
    //afficher le Forum Parent
    SELECT * 
      FROM Forums, ForumSubForum  
     WHERE  ForumSubForum.ParentForumID = reader[ForumID].ToString() AND  Forums.ForumID = ForumSubForum.SubForumID
    //Afficher le résultat du cette requête qui sera l'ensemble des Forum Enfant
    }
    reader.close();

Discussions similaires

  1. Requête pour inverser l'ordre d'un titre de sujet (forum)
    Par Sperafico dans le forum Langage SQL
    Réponses: 15
    Dernier message: 01/09/2011, 11h36
  2. Requête pour remplacer caractères dans une table
    Par elliott1961 dans le forum Installation
    Réponses: 5
    Dernier message: 16/01/2006, 01h47
  3. requête pour exclure les doublons.
    Par sam01 dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2005, 19h10
  4. [phpBB] Questions pour forum phpBB ...
    Par baltimore dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 14
    Dernier message: 22/11/2005, 13h50

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