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 :

[Débutante]Fonction pour écrire un champ vide


Sujet :

ASP

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut [Débutante]Fonction pour écrire un champ vide
    Bonjour à tous!

    Je voulais savoir s'il existait une fonction en ASP qui permettait d'écrire un champ vide si l'enregistrement n'existe pas?

    Dans mon exemple j'ai 3 tables :
    - 1 listant des progiciels
    - 1 listant les catégories de prix
    - 1 table de jointure mettant en relation le progiciel avec 1 ou plusieurs catégories de prix et son prix

    Sauf que tous les progiciels n'ont pas de prix rentrant dans toutes les catégories. Ce qui fait que certains progiciels se retrouvent avec 3 prix comme d'autres 2.

    Et donc, moi je voudrai rajouter à mon code, que si le progiciel n'a pas de prix pour cette catégorie et bien tu vas dans le champ suivant.

    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
    <!-- #include file="_connexion.asp"-->
     
    <% Sq2 = "SELECT tblProgiciel.IdProg, tblProgiciel.NomProg, tblPxCession.IdProg, tblPxCession.IdCession, tblCession.Affichage, tblCession.TypeFacturation, tblPxCession.PrixKeuros FROM tblProgiciel INNER JOIN (tblCession INNER JOIN tblPxCession ON tblCession.IdCession = tblPxCession.IdCession) ON tblProgiciel.IdProg = tblPxCession.IdProg ORDER BY tblProgiciel.NomProg, tblCession.Affichage"
    	Set oRs = Server.CreateObject("ADODB.Recordset")
    	oRs.open Sq2,conn,3,3,1 %>
     
     
    <table class="text">
      <tr bgcolor="#000000">
        <td colspan="5" align="center"><font color="#FFFFFF">Tarifs en K&euro;uros</font></td>
      <tr bgcolor="#FFB66C"><td width="260">Nom du progiciel</td>
      <td width="100">1 utilisateur</td>
      <td width="100">5 utilisateurs</td>
      <td width="100">10 utilisateurs</td>
      <td width="100">20 utilisateurs</td></tr>
    <tr>
    <%
    last=""
    while not oRs.EOF
    If last<>oRs("NomProg") then
    last=oRs("NomProg")
    Response.write "<tr><td>" %>
    <a href='detailsprog.asp?Id=<%=oRs("IdProg")%>'>
    <% Response.write (last) & "</a></td>"
    End if
    Response.write("<td>" & oRs("PrixKeuros") & "</td>")
    oRs.moveNext
    Wend
    Response.write "</tr>"
    %>
    <% Conn.close : Set Conn=nothing    %>
    </table>
    Merci pour votre aide!!!

  2. #2
    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,

    Je verrai bien cela avec deux recordsets imbriqués, le premier te renvoit seulement les references du progiciel, le second va chercher les différents prix

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    J'avais déjà testé ça mais pour ce code, en plus de me donner la liste, c'est pareil il décale les enregistrements, c'est-à-dire que le contenu ne correspond pas exactement à la colonne(je l'ai fait sous forme de tableau). Et pour certains progiciels, leurs prix ne s'affichent pas bizarrement...

    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
    <!-- #include file="_connexion.asp"-->
     
    <% Sql = "SELECT * FROM tblProgiciel ORDER BY NomProg"
    	Set Rs = Server.CreateObject("ADODB.Recordset")
    	Rs.open Sql,conn,3,3,1 %>
     
    <% Sql = "SELECT * FROM tblPxCession"
    	Set Px = Server.CreateObject("ADODB.Recordset")
    	Px.open Sql,conn,3,3,1 %>
    <table>
    <tr><th>Progiciel</th><th>1 utilisateur</th><th>5 utilisateurs</th><th>10 utilisateurs</th><th>20 utilisateurs</th><th>Par site</th><th>Nous consulter</th></tr>
    <%
    While not Rs.EOF
    Response.write "<tr><td>" & Rs("NomProg") & " </td>"
    	While (Rs("IdProg") = Px("IdProg"))
    		Response.write "<td>" & Px("PrixKeuros") & "</td>"
    	Px.Movenext
    	Wend 
    	Response.write "</tr>" %>
    <% Rs.Movenext
    Wend
    %>
    </table>
    <% Conn.close : Set Conn=nothing    %>
    Si vous pouvez m'aider, merci merci

  4. #4
    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
    En fait,

    ton second recordset doit etre ouvert, puis fermé pour chaque ligne du premier. Oui je sais ca n'optimise pas les performances, mais ca peut repondre a ton besoin, je l'ai deja fait. Lorsque tu construis la seconde instuction sql, tu ajoute un where sur le progiciel courant (du premier recordset)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while not oRs.EOF 
            Sql2 = "SELECT * FROM tblPxCession WHERE idProgiciel=" & oRs("IdProgiciel")
            oRs2.Open...
    'traitement : tu n'as que les prix qui existe pour 1 progiciel
            oRs2.Close
    oRs.Movenext
    Wend

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Alors j'ai fais comme tu m'as dis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <%
    while not Rs.EOF
    		Response.write "<tr><td>" & Rs("NomProg") & "</td>"
            Sql2 = "SELECT * FROM tblPxCession WHERE IdProg = " & Rs("IdProg")
            oRs2.Open Sql2, Conn,3,3,1 
    		Response.write "<td>" & oRs("PrixKeuros") & "</td>"
            oRs2.Close
    		Response.write "</tr>"
    Rs.Movenext
    Wend 
    %>
    Mais ça m'affiche ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Erreur d'exécution Microsoft VBScript erreur '800a01a8' 
    Objet requis: '' 
     
    /base/panorama/prix4.asp, ligne 26
    Alors qu'à cette ligne, il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oRs2.Open Sql2, Conn,3,3,1
    Suis perdue...

  6. #6
    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
    Il faut que tu le declare aussi cet objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set oRs2 = Server.CreateObject("ADODB.Recordset")

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Merci ça marche!

    Mais ça donne le même résultat que la première méthode que j'avais édité.
    Et comme certains progiciels n'ont qu'un seul prix, il se retrouve tout à gauche alors que son prix correspond à la colonne toute à droite.

    C'est pour ça que je pense qu'il faudrait un algo ou une fonction, si ça existe, de faire que si il n'y a pas d'enregistrement pour cette catégorie de prix, tu vas dans le champ suivant :

    Nom_|Prix1__|Prix2__|Prix3__|
    N1___|Prix1__|Prix2__|Prix3__|
    N2___|Prix3__|______|______|

    Et ce qu'il faudrait :

    Nom_|Prix1__|Prix2__|Prix3__|
    N1___|Prix1__|Prix2__|Prix3__|
    N2___|______|______|Prix3__|

    Alors je ne sais pas si ça existe.

    Merci encore de ton aide.

  8. #8
    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
    En effet je comprends ton soucis

    J'ai bien une solution radicale et pas si abérante, mais il faut un peu modifier les règles de gestion de ta base de données. si l'on considére que chaque progiciel posséde un prix dans chaque tranche d'utilisateur, mais que ce prix peut etre "-". Tu aurais alors

    Nom_|Prix1__|Prix2__|Prix3__|
    N1___|Prix1__|Prix2__|Prix3__|
    N2___|__--__ |Prix2_ |Prix3__ |

    Dans ce cas, comme tu as exactement le meme nombre de ligne "prix" pour chaque progiciel, ton tableau est facile a remplir. Mais ca ne resoud pas ton probleme, ca le contourne

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    J'y avais pensé aussi mais si j'applique cette méthode, la base ne sera pas utilisée de manière optimale.

    Et là, j'ai pensé à 3 boucles imbriquées, je vais tester aujourd'hui et je vais poster le résultat plus tard, que ça marche ou que ça marche pas, en tout cas merci pour ton aide

  10. #10
    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
    Ca n'entrave pas l'optimisation de ta base, et je pense que les traitements de ton application seront plus rapides

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Alors je teste un truc, mais je crois que l'imbrication ou la manière de penser les 3 boucles imbriquées sont un peu....mal pensé, t'en penses quoi?

    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
    <%
     
    		while not Rs.EOF
    			Response.write "<tr><td>" & Rs("NomProg") & "</td>"
    			Sql2 = "SELECT * FROM tblPxCession WHERE IdProg = " & Rs("IdProg")
    			Set oRs2 = Server.CreateObject("ADODB.Recordset")
            	oRs2.Open Sql2, Conn,3,3,1 
    				while not oRs2.EOF
    					Sq3 = "SELECT * FROM tblCession"
    					Set Ce = Server.CreateObject("ADODB.Recordset")
    					Ce.open Sq3,conn,3,3,1 
    					While not Ce.EOF
    						If Ce("IdCession") = oRs2("IdCession") Then
    						Response.write "<td>" & oRs2("PrixKeuros") & "</td>"
    					Else
    						Response.write "<td></td>"
    					End if
    					Ce.Movenext
    					Wend
    					Ce.Close
    				oRs2.Movenext
    				Wend
    			oRs2.Close
    		Response.write "</tr>"
    		Rs.Movenext
    		Wend 
    %>

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut
    Ces 3 boucles marchent super lorsqu'il n'y a qu'un seul prix mais lorsqu'il y en a plusieurs, c'est le bordel, aaaaaaaahhhhhhhhhh

  13. #13
    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
    Euh, la reponse précédente etait nulle.

    En fait, je pense que c'est la requete SQL qui pose probleme.
    La meilleur solution serait de t'aider de l'assistant d'Access pour afficher le resultat que tu souhaites.
    Peux-tu nous renseigner sur la structure de tes tables?
    A mon avis une seul requete et un seulrecordset devrait suffire.

    A+

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Je m'immice dans la conversion, mais petite question, car je ne suis pas sure.
    Tu as bien un champ qui te dis si c'est prix 1, 2 ou 3, non ?? (En fait la catégorie du prix si j'ai bien suivit) ??
    Si oui, tu fait une seule requete qui demande toutes tes infos (genre celle du début du sujet) et surtout sans "select *" qui est de l'anti optimisation de bdd. Ensuite, c'est quand tu construit ton tableau que dans chaque ligne tu fais une boucle genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sur case "prix_1" 
    if catégorie_prix = prix_1 then
    je remplis
    end if
    Sur case "prix_2" 
    if catégorie_prix = prix_2 then
    je remplis
    end if
    Sur case "prix_3" 
    if catégorie_prix = prix_3 then
    je remplis
    end if
    Comme ça, tu as une requête optimisée et tu as tes prix au bon endroit ...

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 30
    Points : 10
    Points
    10
    Par défaut [Résolu]
    Merci pour ton aide et aussi pour l'aide de tout le monde.

    Finalement, j'ai trouvé la solution.

    Je fais ma requête d'analyse croisée sous Access et ensuite je faisais une boucle du type

    For Each .... In rs.fields
    bla bla bla
    Next

    Et voilà....

    Je ne savais pas que c'était possible maintenant je le sais, si ça peut aider quelqu'un d'autre.

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

Discussions similaires

  1. Fonction pour retrouver un champ?
    Par CyberMen dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 12/05/2008, 15h44
  2. Réponses: 5
    Dernier message: 04/07/2007, 18h31
  3. [MySQL] Fonction pour nom des champs
    Par madevilts dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/05/2007, 18h45
  4. Réponses: 6
    Dernier message: 31/07/2006, 16h01
  5. [Débutant] Problème pour écrire dans un bouton
    Par Paulinho dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 06/01/2006, 11h45

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