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 18/01/2011, 11h03   #1
Membre actif
 
Homme
Développeur .NET
Inscription : janvier 2008
Messages : 209
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2008
Messages : 209
Points : 156
Points : 156
Par défaut Invalid object name

Bonjour à tous;
en fait j'ai tenté de faire un appel à une fonction dans une autre fonction comme suit
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE FUNCTION acReliquat3 (@TYPE int) RETURNS TABLE
AS
RETURN
 
SELECT [dbo].[AcReliquat2](@TYPE).CleProduit, acProduit.Designation, 
Sum([dbo].[AcReliquat2](@TYPE).SumQteLiee) AS SumQtesLiee, 
Sum([dbo].[AcReliquat2](@TYPE).PremierDeQuantite) AS SumQteSource, 
Sum([dbo].[AcReliquat2](@TYPE).PUNetHTS) AS PUNetsHTS, 
Sum([dbo].[AcReliquat2](@TYPE).PrixNetTTCS) AS PUNetsTTCS, 
Sum([dbo].[AcReliquat2](@TYPE).PUNetHTD) AS PUNetsHTD, 
Sum([dbo].[AcReliquat2](@TYPE).PUNetTTCD) AS PUNetsTTCD, acTiers.TiersRaisonSociale AS TiersRaisonSocialeS, 
acProduit.Code AS CodeProduit, acProduit.Reference AS ReferenceProduit, acProduit.Designation2, 
acProduit.Produit.Quantite AS QteProduit, acProduit.FamilleArticle, acProduit.Emplacement, acProduit.StatutLot, 
acProduit.Marque, acProduit.CategorieProduit, ([SumQtesLiee]-[SumQteSource])*-1 AS Ecart, [PUNetsHTS]-[PUNetsHTD] AS EcartHT, 
[PUNetsTTCS]-[PUNetsTTCD] AS EcartTTC, ([SumQtesLiee]*100)/[SumQteSource] AS Realispour
FROM (([dbo].[AcReliquat2](@TYPE) LEFT JOIN acProduit ON [dbo].[AcReliquat2](@TYPE).CleProduit = acProduit.CleProduit) LEFT JOIN acEffet ON [dbo].[AcReliquat2](@TYPE).CleEffetS = acEffet.CleEffet) LEFT JOIN acTiers ON acEffet.CleTiers = acTiers.CleTiers
GROUP BY [dbo].[AcReliquat2](@TYPE).CleProduit, acProduit.Designation, acTiers.TiersRaisonSociale, acProduit.Code, acProduit.Reference, acProduit.Designation2, acProduit.Produit.Quantite, acProduit.FamilleArticle, acProduit.Emplacement, acProduit.StatutLot, acProduit.Marque, acProduit.CategorieProduit, acEffet.Code;
GO
mais j'ai l'erreur suivante :
Citation:
Invalid object name 'dbo.AcReliquat2'.
sam83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 11h38   #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 769
Points : 17 769
Utilisez des alias. Virez les parenthèses inutiles.
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 18/01/2011, 11h39   #3
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,

Utilises un alias pour ta fonction table AcReliquat2 :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
CREATE FUNCTION acReliquat3 (@TYPE int) RETURNS TABLE
AS
RETURN
 
SELECT AcReliquat2.CleProduit, acProduit.Designation, 
Sum(AcReliquat2.SumQteLiee) AS SumQtesLiee, 
Sum(AcReliquat2.PremierDeQuantite) AS SumQteSource, 
Sum(AcReliquat2.PUNetHTS) AS PUNetsHTS, 
Sum(AcReliquat2.PrixNetTTCS) AS PUNetsTTCS, 
Sum(AcReliquat2.PUNetHTD) AS PUNetsHTD, 
Sum(AcReliquat2.PUNetTTCD) AS PUNetsTTCD, acTiers.TiersRaisonSociale AS TiersRaisonSocialeS, 
acProduit.Code AS CodeProduit, acProduit.Reference AS ReferenceProduit, acProduit.Designation2, 
acProduit.Produit.Quantite AS QteProduit, acProduit.FamilleArticle, acProduit.Emplacement, acProduit.StatutLot, 
acProduit.Marque, acProduit.CategorieProduit, ([SumQtesLiee]-[SumQteSource])*-1 AS Ecart, [PUNetsHTS]-[PUNetsHTD] AS EcartHT, 
[PUNetsTTCS]-[PUNetsTTCD] AS EcartTTC, ([SumQtesLiee]*100)/[SumQteSource] AS Realispour
FROM (([dbo].[AcReliquat2](@TYPE)  AS AcReliquat2 LEFT JOIN acProduit ON AcReliquat2.CleProduit = acProduit.CleProduit) LEFT JOIN acEffet ON AcReliquat2.CleEffetS = acEffet.CleEffet) LEFT JOIN acTiers ON acEffet.CleTiers = acTiers.CleTiers
GROUP BY AcReliquat2.CleProduit, acProduit.Designation, acTiers.TiersRaisonSociale, acProduit.Code, acProduit.Reference, acProduit.Designation2, acProduit.Produit.Quantite, acProduit.FamilleArticle, acProduit.Emplacement, acProduit.StatutLot, acProduit.Marque, acProduit.CategorieProduit, acEffet.Code;
GO
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2011, 12h25   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
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 665
Points : 8 710
Points : 8 710
Bonjour,

J'ai rarement vu une requête aussi moche et fausse.

- Les parenthèses inutiles sont ... inutiles et pourrissent la lisibilité du code
- le code n'est pas indenté
- les tables ne sont ni qualifiées, ni aliasées
- les alias de colonnes sont utilisés comme colonnes (PUNetsHTS n'est pas une colonne mais un alias, dès lors tout "calcul" est impossible)
- il y a des jointures entre des fonctions tables qui spécifient le paramètre

Ce qui fait que l'on peut réécrire votre fonction comme suit :

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
43
44
45
46
47
CREATE FUNCTION acReliquat3
	(@TYPE int)
RETURNS TABLE
AS
RETURN 
SELECT		R2.CleProduit
		, P.Designation
		, SUM(R2.SumQteLiee) AS SumQtesLiee
		, SUM(R2.PremierDeQuantite) AS SumQteSource
		, SUM(R2.PUNetHTS) AS PUNetsHTS
		, SUM(R2.PrixNetTTCS) AS PUNetsTTCS
		, SUM(R2.PUNetHTD) AS PUNetsHTD
		, SUM(R2.PUNetTTCD) AS PUNetsTTCD
		, T.TiersRaisonSociale AS TiersRaisonSocialeS
		, P.Code AS CodeProduit
		, P.Reference AS ReferenceProduit
		, P.Designation2
		, P.Quantite AS QteProduit
		, P.FamilleArticle
		, P.Emplacement
		, P.StatutLot
		, P.Marque
		, P.CategorieProduit
		, (SUM(R2.SumQteLiee) - SUM(R2.PremierDeQuantite)) * -1 AS Ecart
		, SUM(R2.PUNetHTS) - SUM(R2.PUNetHTD) AS EcartHT
		, SUM(R2.PrixNetTTCS) - SUM(R2.PUNetTTCD) AS EcartTTC
		, (SUM(R2.SumQteLiee) * 100) / SUM(R2.PremierDeQuantite) AS Realispour
FROM 		dbo.AcReliquat2(@TYPE) AS R2
LEFT JOIN	dbo.acProduit AS P
			ON R2.CleProduit = P.CleProduit
LEFT JOIN	dbo.acEffet AS E
			ON R2.CleEffetS = E.CleEffet
LEFT JOIN	dbo.acTiers AS T
			ON E.CleTiers = T.CleTiers
GROUP BY	R2.CleProduit
		, P.Designation
		, T.TiersRaisonSociale
		, P.Code
		, P.Reference
		, P.Designation2
		, P.Quantite
		, P.FamilleArticle
		, P.Emplacement
		, P.StatutLot
		, P.Marque
		, P.CategorieProduit
		, E.Code
Avouez que c'est quand même un peu plus lisible
Les 4 dernières lignes du SELECT sont à mon sens inutiles et peuvent être calculées côté applicatif.

En outre, vous semblez confondre ce qu'est une fonction et une procédure.
D'autre part les fonctions définies par l'utilisateur sont connues sous SQL Server pour être contre-performantes plus que pour être utiles.
Essayez donc de remplacer le code de vos fonctions par des procédures.
Il semble que vous codiez en cherchant à faire du ligne à ligne, ce pour quoi un SGBDR SQL n'est pas conçu : il traite les données dans leur ensemble, et c'est ce qui fait que l'accès aux données dans les bases de données modernes est très rapide ... à condition d'avoir un bon modèle de données et d'être scrupuleux dans l'écriture du code

@++
__________________
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 19/01/2011, 09h28   #5
Membre actif
 
Homme
Développeur .NET
Inscription : janvier 2008
Messages : 209
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2008
Messages : 209
Points : 156
Points : 156
Bonjour;
Merci infiniment elsuket, en fait pour le code c'était pas le mien c'est des requêtes MS Access dont je dois faire la traduction mais bon j'aurais dû faire mieux
sam83 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 23h33.


 
 
 
 
Partenaires

Hébergement Web