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

Boucles imbriquées


Sujet :

ASP

  1. #1
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut Boucles imbriquées
    Bonjour tout le monde,

    Je voudrai afficher dans un tableau des valeurs contenues dans une arborescence. Voici un exemple:

    Vegetal
    |
    |-- Legumes
    | |
    | |-- Verts
    | | |
    | | |-- haricots
    | | |-- poireaux
    | | |-- epinards
    | |
    | |-- Feculents
    | | |-- pomme de terre
    | | |-- riz
    |
    |
    |-- Fruits
    | |
    | |--
    |
    |
    |
    Le nb de niveaux n'est pas defini.
    Je pense à utiliser des boucles WHILE -- WEND.
    Qqn a-t-il déjà fait cela?

    Qqn a-t-il des suggestions afin de ne pas rendre le code trop lourd?

    Merci d'avance.
    "Winter is coming" (ma nouvelle page d'accueil)

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    si le nombre de niveaux n'est pas défini, le mieux c'est la récursivité.
    En général tu as un lien de filiation ou d'appartenance entre tes niveaux, et tu rapelles ta fonction d'affichage par exemple tant que ce lien existe.

    donc pas de boucle, mais test et rappel.
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Je ne comprend pas très bien.

    Tu aurais un petit exemple?
    :o

    Merci
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Points : 3 965
    Points
    3 965
    Par défaut
    vi
    je génère une arborescence fonctionnant en javascript extraite d'une base de données SQL server : le code javascript est généré par de l'ASP et c'est du récursif :

    mon code pour le javascript :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    		<script>
    		<% response.write ("//debut : "& now() & VbCrLf )
    		outputJavascript IdUser
    		response.write ("//fin : "& now() )%>
     
    		</script>
    et mon code ASP :
    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
     
    sub querylevel(parentobject,BG,BD,niveau, user_id)
        dim rsHits, queryString, gFldStr
     
     
        queryString = "SELECT     NMC_ID, NMC_LIBELLE,  NMC_NIVEAU, NMC_BG, NMC_BD, (NMC_BD-NMC_BG) as descendant, date_created FROM         FOLDER_NOMENCLATURE_NMC t1, FOLDER_NOMENCLATURE_user t2 " &_
        "WHERE t2.id_user = " & user_id &" and t2.id_folder = t1.NMC_ID" &_
        "  and NMC_BG>"&BG &" and NMC_BD<"& BD &"and   NMC_NIVEAU = "& niveau+1 &"ORDER by  NMC_LIBELLE asc"
     
     
        Set rsHits = Conn.Execute(queryString)
     
     
        do while not rsHits.EOF
    [...]
                          	 if rsHits("descendant") >1 then
                		querylevel  parentObject & "Sub", rsHits("NMC_BG") , rsHits("NMC_BD") ,rsHits("NMC_NIVEAU"), user_id 
            	end if
            rsHits.MoveNext
     
        loop
        rsHits.close
     
     
    end sub
    sub outputJavascript(user_id)
     
        dim rsHits, queryString, gFldStr
     
        queryString = "SELECT     NMC_ID, NMC_LIBELLE,  NMC_NIVEAU, NMC_BG, NMC_BD  FROM         FOLDER_NOMENCLATURE_NMC  WHERE    NMC_NIVEAU = 0 and  id_user = " & UserIDPere
     
        Set rsHits = Conn.Execute(queryString)
    [...]
     
       querylevel   "f", rsHits("NMC_BG") , rsHits("NMC_BD") ,rsHits("NMC_NIVEAU"), user_id
        rsHits.close
     
     
    end sub
    ici j'extrais la liste des reps accessibles par l'utilisateur à un niveau, et pour chaque reps, j'extrais la liste des reps accessibles par l'utilisateur au niveau suivant et ainsi de suite ....
    la récursivité, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
               	 if rsHits("descendant") >1 then
                		querylevel  parentObject & "Sub", rsHits("NMC_BG") , rsHits("NMC_BD") ,rsHits("NMC_NIVEAU"), user_id 
            	end if
    rappeler querylevel alors que l'on est au sein de la subroutine querylevel, c'est le principe : une fonction qui se rappelle elle même

    bon c'est un exemple pas très parlant, mais je l'ai sous la main...

    et t'inquiète, pour avoir appris la prog PERL sous Unix, c'est aussi la méthode recommandée par exemple pour afficher l'arbo des fichiers du système exactement sous le format que tu décris.
    Émotion
    Infantilisation
    Culpabilisation

    Christophe Alévèque - 18 Mars 2021

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    OK, merci bien.

    Je vais me pencher là-dessus.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Fredoche? Toutes les requetes que tu fais sont faites sur la même table?

    Je vois que tu utilise le mm recordset rsHits dans tes deux procedures. Meme si elles sont déclarées dans les procedure, ça ne pose pas de pb?

    En plus il n'est pas fermé qd tu rapelles ta procédure. C'est étonnant comme structure.

    Comment determiner la parentée?
    "Winter is coming" (ma nouvelle page d'accueil)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    367
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 367
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par Immobilis
    Comment determiner la parentée?
    Avec une colonne supplémnetaire :

    CAT_ID | LIB_CAT | PARENT_ID
    1 VEGETAL 0
    2 LEGUME 1

  8. #8
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Il faut donc 1 colone par parent?
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    367
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 367
    Points : 414
    Points
    414
    Par défaut
    Non, ta table possède une colonne supplémentaire parent_id. Donc sur chaque element, tu peux savoir quel est son parent. Le légume a pour parent 1, qui est végétal. Si un element n'a pas de parent, parent_id vaut 0.

    Tu peux aussi ajouter une autre colonne, qui sert de flag (0 ou 1) pour savoir si un element a des descendants

  10. #10
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut


    Ca marche du tonnerre! Merci bien.

    Avec simplement:
    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
     
    <%
    function createtree(parent_id)
    	Set rs = server.CreateObject("ADODB.recordset")
    		rs.open "SELECT * FROM risk WHERE Flag_ParentID = " & parent_id, strProvider, 1, 3
    		response.Write("<blockquote>")
    			WHILE NOT rs.EOF
    				response.Write(rs("Flag_Name") & "<br>")
    				call createtree(rs("Flag_ID"))
    				rs.movenext
    			WEND			
    		response.Write("</blockquote>")
    		rs.close
    	Set rs = Nothing
    end function
    %>
    J'obtiens mes valeurs superbien classées.

    Merci encore.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Immobilis


    Ca marche du tonnerre! Merci bien.

    Avec simplement:
    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
     
    <%
    function createtree(parent_id)
    	Set rs = server.CreateObject("ADODB.recordset")
    		rs.open "SELECT * FROM risk WHERE Flag_ParentID = " & parent_id, strProvider, 1, 3
    		response.Write("<blockquote>")
    			WHILE NOT rs.EOF
    				response.Write(rs("Flag_Name") & "<br>")
    				call createtree(rs("Flag_ID"))
    				rs.movenext
    			WEND			
    		response.Write("</blockquote>")
    		rs.close
    	Set rs = Nothing
    end function
    %>
    J'obtiens mes valeurs superbien classées.

    Merci encore.

    A+
    Salut,

    J'ai essayé ton code qui me convenait, mais il me fait une erreur pourrais m'en dire un peu plus ?

    Voici l'erreur qu'il me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Type d'erreur :
    (0x80020009)
    Une exception s'est produite. 
    /ssi/function.asp, line 14
    Peux-tu me dire comment et fait ta db ou autres !

    Merci à toi !

  12. #12
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Y'a quoi d'écrit à ta ligne 14 de ta page? Parce que l'erreur n'est peut-être pas dans le fonction.

    Pour ce qui est de ma table, en voici une petite image


    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  13. #13
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Voila le code de ma fonction

    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
    function createtree(parent_id)
    	Set var_rs = server.CreateObject("ADODB.recordset") 
    		var_rs.open "SELECT * FROM tCategories WHERE cIdParent=" & parent_id, var_objConn, 1, 3 
    		'response.write("SELECT * FROM tCategories WHERE cIdParent=" & parent_id)
    		'response.write("<br>")
    		'response.write(NOT var_rs.EOF)
    		'response.end()
    		response.Write("<blockquote>") 
    			WHILE NOT var_rs.EOF
    				response.Write(var_rs("cNomCat") & "<br>") 
    				createtree(var_rs("cIdCat"))
    				var_rs.movenext
    			WEND          
    		response.Write("</blockquote>") 
     
    		var_rs.close 
    	Set var_rs = Nothing 
    end function
    Je ne comprend vraiment pas !

  14. #14
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Oui, mais il n'y a que ça dans ta page? Elle est où la ligne 14? D'après ce que tu montres il s'agit de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    response.Write("</blockquote>")
    Mais là y'a pas d'erreur

    ...
    "Winter is coming" (ma nouvelle page d'accueil)

  15. #15
    Membre à l'essai
    Inscrit en
    Septembre 2004
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 24
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Immobilis
    Parce que l'erreur n'est peut-être pas dans le fonction.
    Suite à se petit bout de texte j'ai essayé de faire cela dans un fichier complètement à coté.
    Et il manquait dans cet fonction
    Dim var_rs
    Même que c'est déclarer là ou je fais appel à la fonction !

    La ligne 14 était

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_rs.open "SELECT * FROM tCategories WHERE cIdParent=" & parent_id, var_objConn, 1, 3
    Ben voilà pour moi c'est ok et ton petit bout de code est top.

    Merci

  16. #16
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Merci.

    "Winter is coming" (ma nouvelle page d'accueil)

  17. #17
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Je te met mm ma derniere version qui n'utilise pas les <blockquote>, car ça laisse trop d'espace entre les lignes.
    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
    function createtree(parent_id,Arr_IDs,ByVal level)
    	level = level + 1
    	Dim rs 'recordset
    	Dim ischecked 'boolean
    	Dim i 'counter
    	Set rs = server.CreateObject("ADODB.recordset")
    		rs.open "SELECT * FROM risk WHERE Flag_ParentID = " & parent_id & " ORDER BY Flag_Name ASC", strProvider, 1, 3
    				WHILE NOT rs.EOF
    				response.Write("<p style='margin-left: " & level * 50 & "px; margin-top: 3px; margin-bottom: 3px'>"  + Chr(13) + Chr(10))
    				ischecked = false
    					IF NOT rs("Flag_HasChild") THEN
    						FOR i = 0 to UBOUND(Arr_IDs)
    							IF rs("Flag_ID") = Cint(Arr_IDs(i)) THEN
    								response.Write("<input type='checkbox' name='checkbox' value='" & rs("Flag_ID") & "' checked>&nbsp;<label>" & rs("Flag_Name") & "</label><br>"  + Chr(13) + Chr(10))
    								ischecked = true
    								EXIT FOR
    							END IF
    						NEXT
    						IF NOT ischecked THEN
    							response.Write("<input type='checkbox' name='checkbox' value='" & rs("Flag_ID") & "'>&nbsp;<label>" & rs("Flag_Name") & "</label><br>"  + Chr(13) + Chr(10))
    						END IF
    					ELSE
    						response.Write(rs("Flag_Name") & "<br>"  + Chr(13) + Chr(10))
    						call createtree(rs("Flag_ID"),Arr_IDs,level)
    					END IF
    					rs.movenext
    				WEND
    		rs.close
    	Set rs = Nothing
    end function
    Le "Arr_IDs" est un tableau créé à partir de nombres séparés par ", " récupérés dans un champ.

    Je te laisse décortiquer.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  18. #18
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    J'essaye de trouver le script inverse qui me recréé l'arborescence pour un dernier enfant selectionné. Si qqn a une idée, je suis un peu bloqué dans une boucle "while".

    Merci

    "Winter is coming" (ma nouvelle page d'accueil)

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    367
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 367
    Points : 414
    Points
    414
    Par défaut
    Salut Immobilis,

    tu connais l'id de l'enfant, donc tu peux par exemple appeler une fonction Get_parent(idenfant) qui te retourne l'id du parent, avant d'ouvrir ton second recordset et derouler le parent

  20. #20
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Ouais, mais qd il faut remonter pp niveaux, il ne faut pas s'arrêter avant d'avoir atteind le dernier ailleul.

    Et ça peut faire pas mal de générations

    Pour le moment je creuse pour faire en sorte de n'afficher que les branches dans lesquelles un enfant est selectionné.

    "Winter is coming" (ma nouvelle page d'accueil)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Optimisation]Détection de collisions, boucles imbriquées
    Par Rafy dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 05/03/2006, 18h42
  2. Problème de boucles imbriquées
    Par Gnux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 09/12/2005, 20h26
  3. boucle imbriquée
    Par zhoom dans le forum C
    Réponses: 4
    Dernier message: 07/11/2005, 13h10
  4. [Débutant]Boucle imbriquée avec des bornes différentes
    Par Hayato dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 29/08/2005, 16h23
  5. [XSL]boucle imbriquée avec condition
    Par kor dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/01/2005, 14h19

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