Problème Pagination

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

  • Votes
  • Date
  • Date décroissante
  1. 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.
    1. 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.
      1. 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
        %>
        1. 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.
          1. 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.
            1. 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.
              1. 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
                1. 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.
                  1. 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.