Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 27/05/2011, 11h36   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 42
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 42
Points : 11
Points : 11
Par défaut Procédure stockée : clause CASE dans mon WHERE ?

Bonjour,

j'ai développé une procédure stockée que je voudrais modifier en y ajoutant une clause CASE dans mon WHERE.

je ne sais absolument pas si c'est possible de prime abord et/ou quels sont les moyens d'y parvenir.

En 2 mots, l'utilisateur final devra soit entrer un code fournisseur soit un code de regroupement fournisseur et la requête ira lui rechercher l'ensemble des mouvements passés avec ce fournisseur.

je voudrais mettre en place une condition à savoir que si mon code regroupement est non null alors la requête utilise le code regroupement en priorité et ne s'occupe pas du code fournisseur, sinon si le code regroupement est vide alors la requête se jouera uniquement par le code fournisseur.


voila mon code à aujourd'hui :

Merci d'avance pour votre aide

Code :
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
 
ALTER PROCEDURE [dbo].[SyntheseCAFournisseur]
	-- Add the parameters for the stored procedure here
	@CodeFou varchar(9),
	@CodeRegr varchar(20),
	@DateDeb datetime,
	@DateFin datetime
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
 
	SELECT 'C' AS SOCIETE, T_Table2 AS code_regroupement, e_contrepartieaux,t_commentaire,e_etablissement, e_journal, et_libelle, e_refinterne, sum(e_debit-e_credit) AS SOLDE, e_periode
	FROM C..ecriture
	LEFT JOIN C..tiers ON e_contrepartieaux = t_auxiliaire
	LEFT JOIN C..etabliss ON e_etablissement = et_etablissement
	WHERE e_contrepartieaux = @CodeFou
	AND T_TABLE2 = @CodeRegr
	AND e_journal IN ('AC','ACO', 'AI', 'AIO')	
	AND e_datecomptable BETWEEN @DateDeb AND @DateFin
	AND (e_general LIKE '6%' OR e_general LIKE  '2%')
	GROUP BY e_contrepartieaux, T_Table2, t_commentaire,e_etablissement, et_libelle, e_journal, e_periode, e_refinterne
 
END
ridokou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h47   #2
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
Bonjour

vous pouvez faire ainsi :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
	SELECT 'C' AS SOCIETE, T_Table2 AS code_regroupement, e_contrepartieaux,t_commentaire,e_etablissement, e_journal, et_libelle, e_refinterne, sum(e_debit-e_credit) AS SOLDE, e_periode
	FROM C..ecriture
	LEFT JOIN C..tiers ON e_contrepartieaux = t_auxiliaire
	LEFT JOIN C..etabliss ON e_etablissement = et_etablissement
	WHERE (
		@CodeRegr IS NOT NULL 
		AND T_TABLE2 = @CodeRegr
		OR
		@CodeRegr IS NULL
		AND e_contrepartieaux = @CodeFou
	)
	AND e_journal IN ('AC','ACO', 'AI', 'AIO')	
	AND e_datecomptable BETWEEN @DateDeb AND @DateFin
	AND (e_general LIKE '6%' OR e_general LIKE  '2%')
	GROUP BY e_contrepartieaux, T_Table2, t_commentaire,e_etablissement, et_libelle, e_journal, e_periode, e_refinterne
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 11h49   #3
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
ou directement :

Code :
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
ALTER PROCEDURE [dbo].[SyntheseCAFournisseur]
	-- Add the parameters for the stored procedure here
	@CodeFou varchar(9),
	@CodeRegr varchar(20),
	@DateDeb datetime,
	@DateFin datetime
AS
BEGIN
	 SET NOCOUNT ON
 
	SELECT		'C' AS SOCIETE
			, T_Table2 AS code_regroupement
			, e_contrepartieaux
			, t_commentaire
			, e_etablissement
			, e_journal
			, et_libelle
			, e_refinterne
			, SUM(e_debit - e_credit) AS SOLDE
			, e_periode
	FROM		C.dbo.ecriture AS E
	LEFT JOIN	C.dbo.tiers AS T
				ON E.e_contrepartieaux = T.t_auxiliaire
	LEFT JOIN	C.dbo.etabliss AS ET
				ON E.e_etablissement = ET.et_etablissement
	WHERE		
	AND		T.T_TABLE2 = @CodeRegr
	AND		E.e_journal IN ('AC','ACO', 'AI', 'AIO')	
	AND		E.e_datecomptable BETWEEN @DateDeb AND @DateFin
	AND		(E.e_general LIKE '6%' OR E.e_general LIKE  '2%')
	---
	AND		E.e_contrepartieaux = CASE WHEN @CodeFou IS NOT NULL THEN @CodeFou ELSE @CodeRegr END
	---
	GROUP BY	E.e_contrepartieaux
			, T.T_Table2
			, T.t_commentaire
			, E.e_etablissement
			, ET.et_libelle
			, E.e_journal
			, E.e_periode
			, E.e_refinterne
END
N'oubliez jamais de qualifier :

- les colonnes par l'alias de la table à laquelle elles appartiennent
- les tables par le nom du schéma auquel elles appartiennent.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 12h17   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Je ne suis pas certain que

Code :
1
2
3
[...]
AND		E.e_contrepartieaux = CASE WHEN @CodeFou IS NOT NULL THEN @CodeFou ELSE @CodeRegr END
[...]
réponde a la regle fonctionnelle demandée

J'ai plutot compris cela

Code :
1
2
3
4
[...]
e_contrepartieaux = CASE WHEN @CodeRegr IS NULL then @CodeFou else e_contrepartieaux end
		AND T_TABLE2 = COALESCE(@CodeRegr,T_TABLE2 )
[...]
Mais ai je bien compris le postulat ?

Bon coourage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 12h43   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Effectivement j'ai inversé le postulat.
On écrira donc :

Code :
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
ALTER PROCEDURE [dbo].[SyntheseCAFournisseur]
	@CodeFou varchar(9),
	@CodeRegr varchar(20),
	@DateDeb datetime,
	@DateFin datetime
AS
BEGIN
	 SET NOCOUNT ON
 
	SELECT		'C' AS SOCIETE
			, T_Table2 AS code_regroupement
			, e_contrepartieaux
			, t_commentaire
			, e_etablissement
			, e_journal
			, et_libelle
			, e_refinterne
			, SUM(e_debit - e_credit) AS SOLDE
			, e_periode
	FROM		C.dbo.ecriture AS E
	LEFT JOIN	C.dbo.tiers AS T
				ON E.e_contrepartieaux = T.t_auxiliaire
	LEFT JOIN	C.dbo.etabliss AS ET
				ON E.e_etablissement = ET.et_etablissement
	WHERE		
	AND		T.T_TABLE2 = @CodeRegr
	AND		E.e_journal IN ('AC','ACO', 'AI', 'AIO')
	AND		E.e_datecomptable BETWEEN @DateDeb AND @DateFin
	AND		(E.e_general LIKE '6%' OR E.e_general LIKE  '2%')
	---
	AND		(@CodeRegr IS NULL OR T.T_TABLE2 = @CodeRegr)
	AND		(@CodeFou IS NULL OR E.e_contrepartieaux = @CodeFou)
	---
	GROUP BY	E.e_contrepartieaux
			, T.T_Table2
			, T.t_commentaire
			, E.e_etablissement
			, ET.et_libelle
			, E.e_journal
			, E.e_periode
			, E.e_refinterne
END
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 13h55   #6
Candidat au titre de Membre du Club
 
Inscription : novembre 2010
Messages : 42
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 42
Points : 11
Points : 11
Merci beaucoup à tous pour votre aide.

Ça fonctionne parfaitement maintenant.

Bonne après midi et bon week-end.
ridokou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h02.


 
 
 
 
Partenaires

Hébergement Web