Problème Pagination

asmaa_dev -  
 Rollin'babe !! -
Bonjour,
Je fais la recherche entre un tableau et une base donnée pour chaque mot.
exemple:
On va supposer que la connexion est déjà ouvert.
For c=1 to ubound(Tab)
if tab(c)<>" " then
sql="select * from table where champ='"&Tab(c)&"' "
set rsr=server.createobject("ADODB.Recordset")
rsr.open sql,Ma_connexion,3,3
end if
next
Puisque recordCount retourne 1 alors c impossible de faire la pagination.
Si qq a une proposition qui permet de résoudre ce problème.

Merci.
Configuration: Windows XP
Internet Explorer 6.0

9 réponses

  1. Rollin'babe !!
     
    Bjour,

    Si j'ai compris le problème :

    - Pour effectuer une pagination correcte, il faut ouvrir un seul curseur SQ et pas une boucle de SELECT.

    Votre problème n'est pas simple à résoudre car il faut construire dynamiquement alors autant de clause LIKE associées à votre curseur que de mots clefs contenus dans votre tableau.

    Pas facile - je vais y réfléchir pour ma part.
    0
  2. Rollin'babe !!
     
    Re,

    Je ne connais pas le langage que vous utilisez mais voila ma solution pour crée votre curseur dynamiquement :

    sql="select * from table where champ=";
    clsOr = " OR champ=";

    For c=1 to (ubound(Tab) - 1) ==> parcours tableau -> Taille(tableau) - 1
    if tab(c)<>" " then ==> si entrée non vide
    sql=sql . "'"&Tab(c)&"'" . clsOr; ==> concaténation clause "where" ('.' signifie Concat en gros... selon votre langage)
    end if
    next
    if tab(ubound(Tab)) <> " " ==> dernière entrée tableau
    sql=sql & "'"&Tab(c)&"'";
    end if

    set rsr=server.createobject("ADODB.Recordset")
    rsr.open sql,Ma_connexion,3,3

    Il vous reste plus qu'à parcours votre curseur et utiliser les méthodes standards de pagination.

    Cordialement.
    0
  3. Rollin'babe !!
     
    Re,

    Avec une chtite correction :

    sql="select * from table where champ=";
    clsOr = " OR champ=";

    For c=1 to (ubound(Tab) - 1) ==> parcours tableau -> Taille(tableau) - 1
    if tab(c)<>" " then ==> si entrée non vide
    sql=sql . "'"&Tab(c)&"'" . clsOr; ==> concaténation clause "where" ('.' signifie Concat en gros... selon votre langage)
    end if
    next
    if tab(ubound(Tab)) <> " " ==> dernière entrée tableau
    sql=sql . "'"&Tab(c)&"'"; ==> finalisation de l'ordre SQL
    end if

    ==> votre ordre SQL est maintenant créée - il est du type :

    SELECT * FROM TABLE
    WHERE CHAMPS = "TOTO"
    OR CHAMPS = "TATA"
    OR CHAMPS = "TUTU"
    etc...... --> fin tableau

    Et on ouvre le curseur.

    set rsr=server.createobject("ADODB.Recordset")
    rsr.open sql,Ma_connexion,3,3
    0
  4. asmaa_dev
     
    Bonjour,
    Ce que je fais pour dépanner ce problème.Si que je parcours le tableau et je fais l'enregistrement dans une table temporaire et j'ai sur cette dérniere pour faire la pagination et ça marche bien.
    Merci.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Rollin'babe !!
     
    Re,

    J'ai pas bien compris ce que vous venez de dire mais bon - vous devez être fatigué aujourd'hui.

    Dans tous les cas : il faut éviter de faire 200 SELECT avec 200 appels de server.createobject("ADODB.Recordset") -->
    Ça bouffe de la mémoire pour rien, c'est inutile et c'est lent si vous traitez des grosses tables.

    Ma solution est préférable :

    --> Vous créez progressivement votre ordre SELECT sous la forme d'une chaine en parcourant votre tableau - c'est trés rapide et ca consomme rien
    --> Puis vous appelez UNE seule fois server.createobject("ADODB.Recordset") pour créer votre curseur.
    --> On ouvre le curseur et et on le parcours peperre....

    Salutations.
    0
  7. Rollin'babe !!
     
    Re,

    J'ai oublié ceci - important :

    - Votre solution remplit une seule fois un tableau qui servira pour la pagination avec des valeurs prise à un instant "t".
    - Or, entre deux paginations, d'autres utilisateurs vont faire des INSERT, DES UPDATE et DES DELETE sur votre table...
    - Donc à la 3eme, 4eme pagination, vos données stockées ne seront plus actualisées et seront fausses..
    - Ça va créer énormément de problèmes par la suite car vous allez autoriser l'utilisateur à effectuer des mises à jour sur des entrées de la table qui seront complément fausses - voir inexistantes et là vous ne vous en sortirez plus - aucune solution.

    Bonne soirée.
    0
  8. Rollin'babe !!
     
    Solution simple et propre de pagination !!.

    En langage ASP même si je n'en ai jamais fait - excusez mes erreurs de syntaxe.

    Voilà mes sources : http://www.asp-php.net/archives.php?numsg=46763

    ___________________________________________________________________________________

    En supposant que le fichier connexion.asp contient les ordres de connexion :


    connexion.asp ==>
    ..........................etc.........................................
    ' Création et ouverture connexion
    Set Ma_connexion = CreateObject("ADODB.Connection")
    Ma_connexion.Open "nom_de_ma_connexion"
    ..........................etc........................................
    ___________________________________________________________________________________

    Votre page HTML de pagination avec des liens href pour incrémenter/décrémenter les pages ==>


    <!-- #include file="connexion.asp"-->
    <HTML><BODY>

    <%
    sql="select * from table where champ=" ' initialisation de la chaine sql SELECT
    clsOr = " OR champ="

    ' Construction ordre SQL

    For c=1 to (ubound(Tab) - 1) ' parcours tableau jusqu'à (Taille(tableau) - 1)
    if tab(c)<>" " then ' si entrée tableau non vide
    sql=sql & "'"&Tab(c)&"'" & clsOr ' concaténation clause "where"
    end if
    next

    if tab(ubound(Tab)) <> " " ' dernière entrée du tableau ??
    sql=sql & "'"&Tab(c)&"'" ' finalisation de l'ordre SQL
    end if

    ' La pagination par parcours du curseur sql

    set rsr=server.createobject("ADODB.Recordset") ' instanciation objet curseur sql
    rsr.open sql,Ma_connexion,3,3 ' ouverture curseur

    Nmax = 10 ' nombre max de lignes par page
    Ncur = 0 ' n° de la fiche courante
    Ndeb = 0 ' fiche demandée pour la pagination avant/après

    if request.queryString("num")<>"" then ' si nième fiche accédée
    Ndeb = Cint(request.queryString("num")) ' initialisation numéro de la fiche courante à afficher

    ' tant qu'il y a des fiches
    while not rsr.eof and Ncur<Nmax+Ndeb
    ' si elle est à afficher
    if Ncur >= Ndeb then
    ' affiche un enregistrement dans la page HTML
    response.write rsr("champ1") & "<br>" & rsr("champ2") & "<br>" & ...etc.....
    end if
    ' fiche suivante
    rsr.movenext
    ' une de plus
    Ncur = Ncur + 1
    wend
    %>

    <br>
    <table cellpadding=3><tr>
    <% ' Navigation
    ' Des fiches avant ?
    if Ndeb > 0 then%>
    <td>
    <A href="?num=<%=Ndeb-Nmax%>">Retour</A>
    </td>
    <%end if
    ' Des fiches après ?
    if not rsr.eof then%>
    <td>
    <A href="?num=<%=Ncur%>">Suite</A>
    </td>
    <%end if

    ' fermeture du curseur
    rsr.close : set rsr=nothing%>
    </tr></table>

    </BODY></HTML>
    <% ' Fermeture connexion
    Ma_connexion.close : Set Ma_connexion=nothing
    %>
    0
  9. Rollin'babe !!
     
    Re,

    Ouais bon - en revoyant le code du gars - ca pagine p'tet pas vraiment son truc mais l'idée est là.
    En fait il faut repositionner correctement le curseur SQL à chaque pagination.

    Je vais revoir tout ca et je vous donne une autre solution demain matin.

    (:>) "j'apprends ASP doucement.."

    Rollin'babe.
    0
  10. Rollin'babe !!
     
    Re,

    Autant pour moi - l'algorithme de pagination est correct et le principe de positionnement du curseur est tout con
    puisqu'il n'y a pas vraiment de repositionnement du curseur - on ouvre à chaque fois le curseur avec l'ordre SELECT en entier mais on affiche seulement à l'écran les 10 lignes courantes en 'sautant' les enregistrements non concernés par l'affichage - c'est une pagination un peu lourde mais qui tient très bien la route.

    En tout cas - si ta table devient 'lourde' un jour (milliers d'enregistrements) - c'est cette méthode standard de pagination
    qui doit être appliquée et pas celle que tu a développée en utilisant ton tableau intérmediaire
    (voir mes Post précédents).

    En espérant t'avoir été utile.

    Cordialement.
    0