Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/12/2010, 13h56   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2003
Messages : 36
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 36
Points : 10
Points : 10
Par défaut Affichage d'une colonne d'une ligne précédente

[SQL2005] Affichage d'une colonne d'une ligne précédente
Bonjour,
Je m'explique. J'ai un générateur d'édition pas très évolué et dans l'édition de ma facture (avec regroupement de BL) je veux ajouter une bande de sous total quand je change de Bon de livraison. Dans mon générateur d état je ne peux pas crée de variable qui enregistre une colonne d’une ligne précédente.
L’éditeur source de donnée SQL est assez limité. Je suis obligé de passer par une vue. Ca je sais faire.
Mais pour la requête je ne sais pas comment faire ?

Requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
WITH LIGNE(NUM,LIG,CODE,LIB,NAT)AS
(
  SELECT 1000, 1, '', 'LIVRAISON CLIENT N° 1 DU 05/01/2010','FAC' UNION ALL
  SELECT 1000, 2, '', 'COMMANDE CLIENT N° 113 DU 05/01/2010','FAC' UNION ALL
  SELECT 1000, 3, '100484', 'CABLE Ø5MM 19X7 AME METAL. ANTIGIR. GALVA GR.','FAC' UNION ALL
  SELECT 1000, 4, '100483', 'CABLE Ø4MM 19X7 AME METAL. ANTIGIR. GALVA GR.','FAC' UNION ALL
  SELECT 1000, 5, '105505', 'SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA','FAC' UNION ALL
  SELECT 1001, 1, '' , 'LIVRAISON CLIENT N° 5 DU 06/01/2010' ,'FAC' UNION ALL
  SELECT 1001, 2, '' , 'COMMANDE CLIENT N° 47 DU 24/12/2009','FAC' UNION ALL
  SELECT 1001, 3, '105505', 'SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA','FAC' UNION ALL
  SELECT 1002, 1, '' , 'DEVIS CLIENT N° 12 DU 23/12/2009  ','FAC' UNION ALL
  SELECT 1002, 2, '106670', 'MANILLE LYRE MI-DUR CMU 0T4 LEVAGE AFNOR J33344','FAC' UNION ALL
  SELECT 1002, 3, '106671', 'MANILLE LYRE MI-DUR CMU 0T63 LEVAGE AFNOR J33344','FAC'
)
SELECT NUM,LIG,CODE,LIB FROM LIGNE WHERE NAT='FAC' ORDER BY NUM, LIG
Le résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
 
NUM	LIG	CODE	LIB
1000	1		LIVRAISON CLIENT n° 1 du 05/01/2010
1000	2		COMMANDE CLIENT n° 113 du 05/01/2010
1000	3	100484	CABLE Ø5MM 19X7 AME METAL. ANTIGIR. GALVA GR.
1000	4	100483	CABLE Ø4MM 19X7 AME METAL. ANTIGIR. GALVA GR.
1000	5	105505	SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA
1001	1		LIVRAISON CLIENT n° 5 du 06/01/2010
1001	2		COMMANDE CLIENT n° 47 du 24/12/2009
1001	3	105505	SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA
1002	1		DEVIS CLIENT n° 12 du 23/12/2009  
1002	2	106670	MANILLE LYRE MI-DUR CMU 0T4 LEVAGE AFNOR J33344
1002	3	106671	MANILLE LYRE MI-DUR CMU 0T63 LEVAGE AFNOR J33344
Résultat souhaité :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
NUM	LIG	CODE	PRE_CDE	LIB
1000	1			LIVRAISON CLIENT n° 1 du 05/01/2010
1000	2		1000	COMMANDE CLIENT n° 113 du 05/01/2010
1000	3	100484	1000	CABLE Ø5MM 19X7 AME METAL. ANTIGIR. GALVA GR.
1000	4	100483	1000	CABLE Ø4MM 19X7 AME METAL. ANTIGIR. GALVA GR.
1000	5	105505	1000	SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA
1001	1		1000	LIVRAISON CLIENT n° 5 du 06/01/2010
1001	2		1001	COMMANDE CLIENT n° 47 du 24/12/2009
1001	3	105505	1001	SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA
1002	1		1001	DEVIS CLIENT n° 12 du 23/12/2009  
1002	2	106670	1002	MANILLE LYRE MI-DUR CMU 0T4 LEVAGE AFNOR J33344
1002	3	106671	1002	MANILLE LYRE MI-DUR CMU 0T63 LEVAGE AFNOR J33344
La colonne PRE_CDE est la colonne NUM de la LIGNE précédente.

Merci pour vos réponses.

Cordialement.
d.tellier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2011, 17h00   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 766
Points : 17 766
Dans une base de données relationnelle il n'y a pas d'ordre des lignes dans les tables.... donc, pas de précédent, ni suivant.
Commencez par définir l'ordre que vous souhaitez.... et puisque vous voulez retourner une seule valeur, il faut que cet ordonnancement soit unique !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 19h40   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2003
Messages : 36
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 36
Points : 10
Points : 10
Bonsoir,
Je me suis peut-être mal fait comprendre. J'ai une requête qui est trié, et je voulais savoir s'il est possible d'afficher le contenu d'une colonne d'une ligne précédente voir exemple dans le début de la discussion.

Merci.
d.tellier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2011, 23h39   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 766
Points : 17 766
Réponse brute non, car il n'y a pas d'ordre dans les bases de données relationnelle. Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p5...sont-des-ense/
Donc la notion d'avant, après ou précédent au niveau des lignes n'existe pas.

Cependant il est possible de faire référence à une valeur avant ou après, mais une valeur ce n'est pas une ligne, et la valeur peut ne pas être unique.

D'ou la question de départ à laquelle vous n'avez toujours pas répondu :
Commencez par définir l'ordre que vous souhaitez....

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 11h30   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par SQLpro Voir le message
D'ou la question de départ à laquelle vous n'avez toujours pas répondu :
Commencez par définir l'ordre que vous souhaitez....
Visiblement, c'est ordonné par numero, puis par ligne. On peut supposer que le couple est unique...

par contre je ne vois pas trop l'interet de faire une telle chose... Quelles sont les contraintes imposées par votre "générateur d'édition" qui vous obligent a procéder ainsi ? Quel est l'interet de recuperer le numero de la ligne du "dessus" ? est-ce que votre "générateur d'édition" ne sait traiter qu'une ligne a la fois, et c'est ainsi une façon de "detecter" un changement de numéro ?

dans ce cas, ce cas, regardez cette requete, a adapter a vos besoin (j'ai ajouté une colonne montant, car avec ceci, vous pouvez même calculer les sous totaux)

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
WITH LIGNE(NUM,LIG,CODE,LIB,NAT, MONTANT)AS
(
  SELECT 1000, 1, '', 'LIVRAISON CLIENT N° 1 DU 05/01/2010','FAC', 2 UNION ALL
  SELECT 1000, 2, '', 'COMMANDE CLIENT N° 113 DU 05/01/2010','FAC', 3 UNION ALL
  SELECT 1000, 3, '100484', 'CABLE Ø5MM 19X7 AME METAL. ANTIGIR. GALVA GR.','FAC', 10 UNION ALL
  SELECT 1000, 4, '100483', 'CABLE Ø4MM 19X7 AME METAL. ANTIGIR. GALVA GR.','FAC', 12 UNION ALL
  SELECT 1000, 5, '105505', 'SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA','FAC', 3 UNION ALL
  SELECT 1001, 1, '' , 'LIVRAISON CLIENT N° 5 DU 06/01/2010' ,'FAC',4 UNION ALL
  SELECT 1001, 2, '' , 'COMMANDE CLIENT N° 47 DU 24/12/2009','FAC',4 UNION ALL
  SELECT 1001, 3, '105505', 'SERRE CABLE ETRIER MI-DUR Ø 5MM DIN741TALON LISSE GALVA','FAC', 4 UNION ALL
  SELECT 1002, 1, '' , 'DEVIS CLIENT N° 12 DU 23/12/2009  ','FAC', 5 UNION ALL
  SELECT 1002, 2, '106670', 'MANILLE LYRE MI-DUR CMU 0T4 LEVAGE AFNOR J33344','FAC', 6 UNION ALL
  SELECT 1002, 3, '106671', 'MANILLE LYRE MI-DUR CMU 0T63 LEVAGE AFNOR J33344','FAC', 23
)
SELECT NUM,LIG,CODE,LIB, MONTANT
FROM LIGNE 
WHERE NAT='FAC' 
UNION ALL
SELECT NUM, MAX(LIG) + 1, NULL, 'SOUS Total', SUM(MONTANT)
FROM LIGNE 
WHERE NAT='FAC' 
GROUP BY NUM
ORDER BY NUM, LIG
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 10h13   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2003
Messages : 36
Détails du profil
Informations forums :
Inscription : janvier 2003
Messages : 36
Points : 10
Points : 10
Bonjour
D’abord merci pour vos réponses.

Citation:
Envoyé par SQLpro
Cependant il est possible de faire référence à une valeur avant ou après, mais une valeur ce n'est pas une ligne, et la valeur peut ne pas être unique.

D'ou la question de départ à laquelle vous n'avez toujours pas répondu :
Commencez par définir l'ordre que vous souhaitez....
Le tri est : c'est ordonné par numéro, puis par ligne

Citation:
Par contre je ne vois pas trop l'intérêt de faire une telle chose... Quelles sont les contraintes imposées par votre "générateur d'édition" qui vous obligent à procéder ainsi ? Quel est l'intérêt de récupérer le numéro de la ligne du "dessus" ? Est-ce que votre "générateur d'édition" ne sait traiter qu'une ligne à la fois, et c'est ainsi une façon de "détecter" un changement de numéro ?
Je ne voyais pas le résultat comme ca mais ca peut être une solution. Dans mon générateur d’état. Je prépare une facture. Il y a un regroupement de BL. Pour chaque BL, je veux avoir un sous total.
Dans l’exemple fourni je n’ai mis qu’une partie de la requête. Avec cette solution je traite cette enregistrement dans une bande particulière. Dans mon générateur d’état de CEGID, je n’ai pas la possibilité de créer un champ valeur auquel j’affecte une valeur chaque fois que je traite une ligne. Mais c’est mois qui choisit l’affectation. Dans d’autre générateur d’état comme R&R je pouvais enregistrer des valeurs du record précédent issue de ma source de donné (en fonction de mon tri). CE qui me permet comme en programmation de tester si ma ligne de facture issue de mon BL fait bien partit de mon BL ou si c’est un nouveau BL.

Exemple voir l’image jointe

Merci.
Images attachées
Type de fichier : jpg Requête.jpg (85,9 Ko, 6 affichages)
d.tellier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h40.


 
 
 
 
Partenaires

Hébergement Web