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

Développement SQL Server Discussion :

Liste de cinq lignes avec saut de page => outils pour connaitre le nombre de pages ?


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut Liste de cinq lignes avec saut de page => outils pour connaitre le nombre de pages ?
    Bonjour à tous,

    Je fais face à un problème d'outils. J'ai une base SQL Server avec une table contenant ces données :

    - ID
    - Texte : Titre de la ligne
    - Booléen : Saut de page
    - Entier : Valeur

    Cette table correspond à des lignes que j'affiche sur des pages à la suite. Une page n'affiche au maximum que 5 lignes. Dès qu'on affiche une ligne dont le booléen Saut de page est vrai, alors on rempli le reste de la page par des lignes vides et on passe à la page suivante.

    Voici un schéma rapide et grossier de la situation :


    Ma question :
    - Je voudrais créer une requête qui, en une seule opération, me donne le nombre de page totale, en fonction des sauts de pages sachant qu'il y a au maximum 5 lignes par page. Dans le cas du schéma, la réponse serait 4 pages.
    - Je voudrais une requête qui, quand je donne un numéro de page, me renvoie uniquement les lignes concernées. Par exemple si je donne à cette requête la valeur 3 en entrée (page 3), je voudrais obtenir 3 lignes à afficher.

    C'est un problème qui semble simple, mais je suis à court d'outil je pense pour le résoudre. Il doit y avoir une fonction que je ne connais pas et qui permet de faire ceci... j'ai bien sûr cherché auparavant

    Merci d'avance.
    Vive Visual Studio.net !!!

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 544
    Points
    52 544
    Billets dans le blog
    5
    Par défaut
    Il faut que vous utilisiez la fonction de fenêtrages ROW_NUMBER pour calculer des pages avec le nombre de lignes que vous voulez en faisant une jointure externe avec une table d'énumération.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Avec la présence de sauts de pages supplémentaires, je pense qu'il va falloir passer par une CTE récursive pour construire la pagination au fur et à mesure.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Merci pour vos réponses. Auriez-vous des exemples de codes qui fonctionneraient dans mon cas ?
    Vive Visual Studio.net !!!

  5. #5
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Une façon de faire très sommaire - et probablement très peu efficace dès que vous aurez beaucoup d'éléments à traiter, comme toute requête récursive- serait une chose du genre (code non testé, il doit rester des erreurs, l'idée y est) :

    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
     
    WITH init AS
    (
    	SELECT id
    		  ,texte
    		  ,booleen
    		  ,valeur
    		  ,row_number() as rang
    	  FROM table
    	ORDER BY valeur -- ? L'ordre n'a pas été déterminé
    ),
    recurs AS
    (
    	SELECT id, texte, booleen, valeur, rang, 1 AS page, 1 AS rang_page
    	  FROM init
    	 WHERE rang = 1
    	UNION ALL
    	SELECT i.id, i.texte, i.booleen, i.valeur, i.rang
    		  ,CASE WHEN ( r.booleen = 1 OR r.rang_page = 5) THEN r.page+1 
    				ELSE r.page
    				END AS page
    		  ,CASE WHEN ( r.booleen = 1 OR r.rang_page = 5) THEN 1 
    				ELSE r.rang_page + 1
    				END AS page
    	  FROM recurs r
    			INNER JOIN init i
    				ON i.rang = r.rang + 1
    )
    SELECT *
      FROM recurs
    EDIT : j'oubliais qu'il faudrait pour bien faire ajouter un MAXRECURSION N, avec N le nombre d'éléments de la table de départ (ou 0 si on a pas peur !).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    OK merci. En effet je risque d'avoir des milliers de lignes à traiter... y a t-il une autre méthode pour les gros traitements ?
    Vive Visual Studio.net !!!

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 544
    Points
    52 544
    Billets dans le blog
    5
    Par défaut
    Celle que je vous ais donné !

    SI vous voulez plus d'aide, merci de respecter la charte de postage

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Salut à tous,

    J'ai donc cherché du côté de ROW_NUMBER. Je ne vois pas trop ce que tu veux dire par "jointure externe avec une table d'énumération". Ma requête est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select top 30 id,jour,DernierVolPage,ROW_NUMBER() OVER (ORDER BY id) AS row from vols_avion where id_user='1674'
    Avec DernierVolPage qui correspond au saut de page.

    Celle-ci renvoie :

    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
    141032	2006-10-07 00:00:00.000	NULL	1
    141033	2006-10-14 00:00:00.000	NULL	2
    141034	2006-10-21 00:00:00.000	NULL	3
    141035	2006-10-28 00:00:00.000	NULL	4
    141036	2006-11-04 00:00:00.000	NULL	5
    141037	2006-11-25 00:00:00.000	1	6
    141038	2006-12-02 00:00:00.000	NULL	7
    141039	2006-12-09 00:00:00.000	NULL	8
    141040	2006-12-16 00:00:00.000	NULL	9
    141041	2006-12-30 00:00:00.000	NULL	10
    141042	2007-01-06 00:00:00.000	NULL	11
    141043	2007-01-20 00:00:00.000	1	12
    141044	2007-01-27 00:00:00.000	NULL	13
    141045	2007-02-10 00:00:00.000	NULL	14
    141046	2007-02-17 00:00:00.000	NULL	15
    141047	2007-02-24 00:00:00.000	NULL	16
    141048	2007-03-03 00:00:00.000	NULL	17
    141049	2007-03-10 00:00:00.000	NULL	18
    En fait, il faudrait qu'elle me renvoie :

    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
    141032	2006-10-07 00:00:00.000	NULL	1
    141033	2006-10-14 00:00:00.000	NULL	2
    141034	2006-10-21 00:00:00.000	NULL	3
    141035	2006-10-28 00:00:00.000	NULL	4
    141036	2006-11-04 00:00:00.000	NULL	5
    141037	2006-11-25 00:00:00.000	1	6
    141038	2006-12-02 00:00:00.000	NULL	11
    141039	2006-12-09 00:00:00.000	NULL	12
    141040	2006-12-16 00:00:00.000	NULL	13
    141041	2006-12-30 00:00:00.000	NULL	14
    141042	2007-01-06 00:00:00.000	NULL	15
    141043	2007-01-20 00:00:00.000	1	21
    141044	2007-01-27 00:00:00.000	NULL	22
    141045	2007-02-10 00:00:00.000	NULL	23
    141046	2007-02-17 00:00:00.000	NULL	24
    141047	2007-02-24 00:00:00.000	NULL	25
    141048	2007-03-03 00:00:00.000	NULL	26
    141049	2007-03-10 00:00:00.000	NULL	27
    Je ne vois pas trop comment procéder... ?
    Vive Visual Studio.net !!!

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je ne comprend pas trop votre résultat attendu. Est-ce bien 5 lignes par page ou 6 ?

    Si on considére 5 lignes par page, voici une requête qui vous donne pour chaque ligne de votre table, son numéro de page et son numéro de ligne. Vous pourriez en faire une vue pour simplifier vos requêtes par la suite...
    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
    33
    34
    35
    36
    37
    38
     
    ;WITH tmp as (
    select	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		COALESCE(
    			A.dernierVolPAge,
    			CASE 
    				WHEN	ROW_NUMBER() OVER (
    							PARTITION BY COUNT(B.DernierVolPage) 
    							ORDER BY A.jour 
    						) % 5 = 0
    					THEN 1
    			END
    		) 
    		AS DernierVolPageAuto
    from vols_avion		A
    LEFT JOIN	vols_avion B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Merci beaucoup j'essaye desuite. Et c'est bien ceci que j'essaye de faire.

    J'aurai par la suite des milliers de ligne à traiter d'un coup. Pensez-vous que la requête sera-t-elle efficace lors de gros traitements ?

    Merci
    Vive Visual Studio.net !!!

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Je viens d'essayer la requête, par contre j'ai oublié de précier que je dois avec un WHERE id_user='XXX' qui correspond à la sélection des lignes d'un utilisateur uniquement. A quel niveau je dois le placer ?
    Vive Visual Studio.net !!!

  12. #12
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    À la source, dans la déclaration de tmp.
    Idéalement vous pouvez même en faire une CTE, pour faciliter la jointure et permettre de rajouter facilement en un endroit des critères :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    ;WITH restrictionVol AS
    (
    SELECT v.id ,
    	   v.jour,	
    	   v.DernierVolPage
    FROM vols_avion	
    WHERE id_user = 'XXX' -- vous devriez binder cette variable, idéalement
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		COALESCE(
    			A.dernierVolPAge,
    			CASE 
    				WHEN	ROW_NUMBER() OVER (
    							PARTITION BY COUNT(B.DernierVolPage) 
    							ORDER BY A.jour 
    						) % 5 = 0
    					THEN 1
    			END
    		) 
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Ca a l'air de fonctionner merci beaucoup. Par contre j'ai du mal à imaginer le comportement de la réponse avec des milliers de ligne... pensez-vous que le temps de réponse peut augmenter rapidement ?
    Vive Visual Studio.net !!!

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    J'ai un petit problème dans ta requête : avant, quand j'avais une valeur NULL dans le champ DernierVolPage, cela fonctionnait parfaitement. Mais depuis que je met des valeurs "0" (ou false, c'est un bit), alors le basculement de page ne se fait plus et je n'arrive pas à savoir d'où cela vient... voici ma requête un peu adaptée :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    CREATE FUNCTION GetCarnet (@id_user INT, @NbVolParPage INT)
    RETURNS TABLE
    AS
    RETURN
    WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
    	   Vols_avion.jour,	
    	   Vols_avion.DernierVolPage
    FROM vols_avion	
    WHERE id_user = @id_user 
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		COALESCE(
    			A.dernierVolPAge,
    			CASE 
    				WHEN	ROW_NUMBER() OVER (
    							PARTITION BY COUNT(B.DernierVolPage) 
    							ORDER BY A.jour 
    						) % @NbVolParPage = 0
    					THEN 1
    			END
    		) 
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage
    Vive Visual Studio.net !!!

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Voilà ce que cela renvoit (si on remplace les "0" par NULL cela refonctionne) :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    ID	Jour	DernierVolPAge	Page	Ligne
    141032	2006-10-07 00:00:00.000	0	1	1
    141033	2006-10-14 00:00:00.000	0	1	2
    141034	2006-10-21 00:00:00.000	0	1	3
    141035	2006-10-28 00:00:00.000	0	1	4
    141036	2006-11-04 00:00:00.000	0	1	5
    141037	2006-11-25 00:00:00.000	0	1	6
    141038	2006-12-02 00:00:00.000	0	1	7
    141039	2006-12-09 00:00:00.000	0	1	8
    141040	2006-12-16 00:00:00.000	0	1	9
    141041	2006-12-30 00:00:00.000	0	1	10
    141042	2007-01-06 00:00:00.000	0	1	11
    141043	2007-01-20 00:00:00.000	0	1	12
    141044	2007-01-27 00:00:00.000	0	1	13
    141045	2007-02-10 00:00:00.000	0	1	14
    141046	2007-02-17 00:00:00.000	0	1	15
    141047	2007-02-24 00:00:00.000	0	1	16
    141048	2007-03-03 00:00:00.000	0	1	17
    141049	2007-03-10 00:00:00.000	0	1	18
    141050	2007-03-10 00:00:00.000	0	1	19
    141051	2007-03-17 00:00:00.000	0	1	20
    141052	2007-03-21 00:00:00.000	0	1	21
    141053	2007-03-24 00:00:00.000	0	1	22
    141054	2007-03-28 00:00:00.000	0	1	23
    141055	2007-03-28 00:00:00.000	0	1	24
    141056	2007-04-07 00:00:00.000	0	1	25
    141057	2007-04-07 00:00:00.000	0	1	26
    141058	2007-04-14 00:00:00.000	0	1	27
    141059	2007-04-14 00:00:00.000	0	1	28
    141060	2007-04-18 00:00:00.000	0	1	29
    141061	2007-04-20 00:00:00.000	0	1	30
    141062	2007-04-20 00:00:00.000	0	1	31
    141063	2007-04-28 00:00:00.000	0	1	32
    141064	2007-04-28 00:00:00.000	0	1	33
    141065	2007-05-05 00:00:00.000	0	1	34
    141066	2007-05-05 00:00:00.000	0	1	35
    141067	2007-05-12 00:00:00.000	0	1	36
    141068	2007-05-19 00:00:00.000	0	1	37
    141069	2007-05-26 00:00:00.000	0	1	38
    141070	2007-06-02 00:00:00.000	0	1	39
    141071	2007-06-09 00:00:00.000	0	1	40
    141072	2007-06-16 00:00:00.000	0	1	41
    141073	2007-06-22 00:00:00.000	0	1	42
    141074	2007-06-23 00:00:00.000	0	1	43
    141075	2007-06-23 00:00:00.000	0	1	44
    141076	2007-07-14 00:00:00.000	0	1	45
    141077	2007-07-25 00:00:00.000	0	1	46
    141078	2007-07-25 00:00:00.000	0	1	47
    141079	2007-07-28 00:00:00.000	0	1	48
    141080	2007-08-01 00:00:00.000	0	1	49
    141081	2007-08-01 00:00:00.000	0	1	50
    141082	2007-08-11 00:00:00.000	0	1	51
    141083	2007-08-18 00:00:00.000	0	1	52
    141084	2007-08-25 00:00:00.000	0	1	53
    141085	2007-09-01 00:00:00.000	0	1	54
    141086	2007-09-08 00:00:00.000	0	1	55
    141087	2007-09-15 00:00:00.000	0	1	56
    141088	2007-09-26 00:00:00.000	0	1	57
    141089	2007-09-29 00:00:00.000	0	1	58
    141090	2007-09-29 00:00:00.000	0	1	59
    141091	2007-10-13 00:00:00.000	0	1	60
    141092	2007-10-20 00:00:00.000	0	1	61
    141093	2007-10-27 00:00:00.000	0	1	62
    141094	2007-11-03 00:00:00.000	0	1	63
    141095	2007-11-10 00:00:00.000	0	1	64
    141096	2007-11-24 00:00:00.000	0	1	65
    141097	2007-12-15 00:00:00.000	0	1	66
    141098	2007-12-22 00:00:00.000	0	1	67
    141099	2007-12-29 00:00:00.000	0	1	68
    141100	2008-01-04 00:00:00.000	0	1	69
    141101	2008-01-04 00:00:00.000	0	1	70
    141102	2008-01-19 00:00:00.000	0	1	71
    141103	2008-02-02 00:00:00.000	0	1	72
    141104	2008-02-09 00:00:00.000	0	1	73
    141105	2008-02-09 00:00:00.000	0	1	74
    141106	2008-02-16 00:00:00.000	0	1	75
    141107	2008-02-23 00:00:00.000	0	1	76
    141108	2008-02-29 00:00:00.000	0	1	77
    141109	2008-03-07 00:00:00.000	0	1	78
    141110	2008-03-07 00:00:00.000	0	1	79
    141111	2008-03-15 00:00:00.000	0	1	80
    141112	2008-03-29 00:00:00.000	0	1	81
    141113	2008-03-29 00:00:00.000	0	1	82
    141114	2008-03-29 00:00:00.000	0	1	83
    141115	2008-04-05 00:00:00.000	0	1	84
    141116	2008-04-25 00:00:00.000	0	1	85
    141117	2008-05-03 00:00:00.000	0	1	86
    141118	2008-05-04 00:00:00.000	0	1	87
    141119	2008-05-10 00:00:00.000	0	1	88
    141120	2008-05-17 00:00:00.000	0	1	89
    141121	2008-05-28 00:00:00.000	0	1	90
    Vive Visual Studio.net !!!

  16. #16
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par FoxDeltaSierra Voir le message
    si on remplace les "0" par NULL cela refonctionne
    inversez les deux parties du coalesce :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    CREATE FUNCTION GetCarnet (@id_user INT, @NbVolParPage INT)
    RETURNS TABLE
    AS
    RETURN
    WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
    	   Vols_avion.jour,	
    	   Vols_avion.DernierVolPage
    FROM vols_avion	
    WHERE id_user = @id_user 
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		COALESCE(
     
    			CASE 
    				WHEN	ROW_NUMBER() OVER (
    							PARTITION BY COUNT(B.DernierVolPage) 
    							ORDER BY A.jour 
    						) % @NbVolParPage = 0
    					THEN 1
    			END
    ,A.dernierVolPAge
    		) 
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Bonjour,

    J'ai essayé, cela ne change pas le problème...

    Merci !
    Vive Visual Studio.net !!!

  18. #18
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par FoxDeltaSierra Voir le message
    J'ai essayé, cela ne change pas le problème...
    C'est normal, je vous ai dit n'importe quoi

    ceci devrait aller mieux :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    CREATE FUNCTION GetCarnet (@id_user INT, @NbVolParPage INT)
    RETURNS TABLE
    AS
    RETURN
    WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
    	   Vols_avion.jour,	
    	   Vols_avion.DernierVolPage
    FROM vols_avion	
    WHERE id_user = @id_user 
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		CASE 
    				WHEN 	A.dernierVolPAge =  1 
    				OR 	ROW_NUMBER() OVER (
    							PARTITION BY COUNT(B.DernierVolPage) 
    							ORDER BY A.jour 
    						) % @NbVolParPage = 0
    					THEN 1
    		END
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 249
    Points : 95
    Points
    95
    Par défaut
    Non c'est pareil... ?
    Vive Visual Studio.net !!!

  20. #20
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    à force de rater, on va finir par réussir :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    ;WITH restrictionVol AS
    (
    SELECT Vols_avion.id ,
    	   Vols_avion.jour,	
    	   Vols_avion.DernierVolPage
    FROM vols_avion	
    )
    ,tmp AS (
    SELECT	A.id ,
    		A.jour,	
    		A.DernierVolPage,
    		CASE 
    				WHEN 	A.dernierVolPAge =  1 
    				OR 	ROW_NUMBER() OVER (
    							PARTITION BY COALESCE(SUM(B.DernierVolPage), 0) 
    							ORDER BY A.jour 
    						) % 5 = 0
    					THEN 1
    		END
    		AS DernierVolPageAuto
    FROM restrictionVol 		A
    LEFT JOIN	restrictionVol  B
    	ON		B.jour < A.jour
    GROUP BY A.id ,
    		A.jour,	
    		A.DernierVolPage
    )
    SELECT 
    	A.id,
    	A.jour,
    	A.dernierVolPage,
    	COUNT(B.DernierVolPageAuto) +1 AS Page,
    	ROW_NUMBER() OVER (PARTITION BY COUNT(B.DernierVolPageAuto) ORDER BY A.jour) AS Ligne
     
    FROM	tmp A
    LEFT JOIN tmp B
    	ON			B.jour < A.jour
    	AND			B.DernierVolPageAuto = 1
    GROUP BY	
    		A.id,
    		A.jour,
    		A.dernierVolPage,
    		A.dernierVolPageAuto

Discussions similaires

  1. [XL-2003] Connaitre le nombre de page d'un document word
    Par Krovax dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/07/2009, 22h21
  2. [WD-2003] Connaitre le nombre de page d'un document word
    Par Krovax dans le forum VBA Word
    Réponses: 4
    Dernier message: 07/07/2009, 21h23
  3. Connaitre le nombre de page
    Par toblerona dans le forum Rave
    Réponses: 6
    Dernier message: 19/06/2009, 20h01
  4. Réponses: 1
    Dernier message: 28/04/2009, 11h49
  5. Connaitre le nombre de page d'un fichier Word
    Par abbd dans le forum Services Web
    Réponses: 1
    Dernier message: 23/02/2009, 11h26

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