[HS] besoin d'aide pour requete MS-SQL

Le
free
Bonjour

Voila, j'ai 2 fenetres qui sont désynchronisées.
L'une affiche le résultat d'un select (liste de lignes) dans une table.
L'autre affiche le contenu d'une ligne.

Pour passer de la liste à la ligne, je n'ai pas de problème , ma ligne
contenant la clé primaire de la fiche que je veut afficher.

Maintenant, je suis sur la fiche, et j'aimerais bien implémenter un bouton
suivant/précédent

En gros "trouver la clé primaire précédente ou suivante, dans la requete
d'origine"
Je ne peux pas utiliser le tableau pour 2 raisons :
- la requete peut être réexécutée, avec des criteres différentes
- le tableau est une table fichier, je n'ai accès qu'aux lignes qui sont
affichées

Donc je me retourne vers SQL.
pas de rowid chez MS, uniquement un row_number qui permet de mettre un rang
sur les lignes.

ma requete de base : select x from y order by z
=> select row_number() over(order by a),x from y order by z

ca ajoute un numéro incrémental trié sur "a"
pour avoir un numéro dans l'ordre de la requete :
=> select row_number() over(order by z),x from y order by z

Donc il est possible :
1/ de récupérer le rowid correspondant à ma fiche
mon_rowid=
select rownum from
(select row_number() over(order by z),x from y order by z )
where cle_primaire=ma_fiche

2/ de récupérer la clé primaire du rowid suivant
select cle_primaire from
(select row_number() over(order by z),x from y order by z )
where rowid=mon_rowid+1

J'ai donc une solution à mon problème, mais qui me semble (tres) couteuse
car la requete est effecutée 2 fois.

y a t'il moyen d'implémenter ca en une seule fois ??

En plus, ca me choque un peu de devoir faire toute la requete par exemple si
on cherche le deuxième élément.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Firetox
Le #21632711
Bonjour,

le plus simple seait que SQLServer puisse avoir le LIMIT de mySQL
cela est possible en SQLServeur
dans MSSQL4WD tu peux faire des requete sur SQLserver du type :

select * from maTable LIMIT 4,10

pour avoir les 10 ligne commencant a partir de la quatrieme
ce qui permet de faire une navigation par ligne ou par page (ce qu'utilise
SQLManagerX)

donc si tu veux le code telecharge MSSQL4WD et voir dans mySQLExec ce qui
est fait pour avoir le limit
(il y a deux methodes MySQLExec et mySQLTraitementOrderBy )

tu peux les prendre et en faire 2 methode qui te transforme les Select que
tu fait avec limit pour avoir le select correcte sur SQLserver

cordialment


"free" news:4bd5a43c$0$16949$
Bonjour

Voila, j'ai 2 fenetres qui sont désynchronisées.
L'une affiche le résultat d'un select (liste de lignes) dans une table.
L'autre affiche le contenu d'une ligne.

Pour passer de la liste à la ligne, je n'ai pas de problème , ma ligne
contenant la clé primaire de la fiche que je veut afficher.

Maintenant, je suis sur la fiche, et j'aimerais bien implémenter un bouton
suivant/précédent

En gros "trouver la clé primaire précédente ou suivante, dans la requete
d'origine"
Je ne peux pas utiliser le tableau pour 2 raisons :
- la requete peut être réexécutée, avec des criteres différentes
- le tableau est une table fichier, je n'ai accès qu'aux lignes qui sont
affichées

Donc je me retourne vers SQL.
pas de rowid chez MS, uniquement un row_number qui permet de mettre un
rang sur les lignes.

ma requete de base : select x from y order by z
=> select row_number() over(order by a),x from y order by z

ca ajoute un numéro incrémental trié sur "a"
pour avoir un numéro dans l'ordre de la requete :
=> select row_number() over(order by z),x from y order by z

Donc il est possible :
1/ de récupérer le rowid correspondant à ma fiche
mon_rowid > select rownum from
(select row_number() over(order by z),x from y order by z )
where cle_primaire=ma_fiche

2/ de récupérer la clé primaire du rowid suivant
select cle_primaire from
(select row_number() over(order by z),x from y order by z )
where rowid=mon_rowid+1

J'ai donc une solution à mon problème, mais qui me semble (tres) couteuse
car la requete est effecutée 2 fois.

y a t'il moyen d'implémenter ca en une seule fois ??

En plus, ca me choque un peu de devoir faire toute la requete par exemple
si on cherche le deuxième élément.


Publicité
Poster une réponse
Anonyme