Problème Pagination
asmaa_dev
-
Rollin'babe !! -
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.
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.
A voir également:
- Problème Pagination
- Pagination powerpoint - Guide
- Sommaire avec pagination - Guide
- Le fichier de pagination est insuffisant pour terminer cette opération ✓ - Forum Matériel & Système
- Pagination word - Guide
- Pagination google doc à partir de la page 3 - Forum Google Docs
9 réponses
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.
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.
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.
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.
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
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
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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.
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.
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
%>
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
%>
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.
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.
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.
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.