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

 .NET Discussion :

Execution d'une procedure stockée qui fait appel a plusieurs fonctions udf


Sujet :

.NET

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut Execution d'une procedure stockée qui fait appel a plusieurs fonctions udf
    Bonjour,
    base de donnnées sql server 2008
    je développe une application vb qui exécute une procédure stockée qui fait appel a deux fonctions(scalar function)
    Quand j’exécute l'application l'erreur suivante s'affiche
    la sous requête a retourné plusieurs valeurs.cela n'est pas autorisé quand la sous requête suit =,!=,<,<=,=>,> ou quand elle est utilisée entant qu'expression
    la sous requête a retourné plusieurs valeurs.cela n'est pas autorisé quand la sous requête suit =,!=,<,<=,=>,> ou quand elle est utilisée entant qu'expression
    l'instruction a été arrêtée
    l'instruction a été arrêté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
     
    USE [GestionPaie]
    GO
    /****** Object:  StoredProcedure [dbo].[Calcul_paie]    Script Date: 03/08/2014 13:09:47 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER proc [dbo].[Calcul_paie] 
    @Mois int,
    @Année int
    as
    begin
     
    delete from table1
    where Mois=@Mois and Année=@Année
     
    --Salaire de base Numéro 1
    insert into table1
    select Id_fonctionnaire,1, @Mois, @Année,dbo.salaire_de_base (Id_fonctionnaire)
    from dbo.Fonctionnaire
     
     
    --indemnité1 Numéro 2
    insert into table1
    select Id_fonctionnaire,2, @Mois, @Année,dbo.Iindemnité1(Id_fonctionnaire)
    from dbo.Fonctionnaire
    where dbo.Iindemnité1(Id_fonctionnaire) <>0
     
    end
    Voici le code vb
    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
     
    Public Class FrmCalcul_paie
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Try
                Dim dts As New VCalcul_paie
                Dim func As New FCalcul_paie
     
     
     
                dts.gMois = Cbomois.SelectedValue
                dts.gAnnée = Cboannée.SelectedValue
     
     
     
     
                If func.Calcul_paie(dts) Then
                    MsgBox("Paie Calculée", MessageBoxButtons.OK)
     
                Else
                    MsgBox("Erreur Inconnue")
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
     
        End Sub
     
    End Class
    Voici la classe FCalcul_paie
    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
     
    Imports System.Data.SqlClient
    Public Class FCalcul_paie
        Inherits Connexion
        Dim cmd As New SqlCommand
     
        Public Function Calcul_paie(ByVal dts As VCalcul_paie)
            Try
                connecté()
                cmd = New SqlCommand("Calcul_paie")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cnn
                cmd.Parameters.AddWithValue("@Mois", dts.gMois)
                cmd.Parameters.AddWithValue("@Année", dts.gAnnée)
     
     
                If cmd.ExecuteNonQuery Then
                    Return True
                Else
                    Return False
                End If
     
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            Finally
                déconnecté()
            End Try
        End Function
     
    End Class
    Donc comment faire pour résoudre ce problème ?
    Merci d'avance

  2. #2
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello,
    J'ai l'impression que le pb vient des 2 fonctions : dbo.salaire_de_base et dbo.Iindemnité1. Elles font quoi exactement ?
    "C'est tellement merdique que toute modification est une amélioration !"

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par plume13 Voir le message
    Hello,
    J'ai l'impression que le pb vient des 2 fonctions : dbo.salaire_de_base et dbo.Iindemnité1. Elles font quoi exactement ?
    Merci plume13 POUR TA REPONSE,
    voici le code des deux fonctions
    dbo.salaire_de_base:
    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
     
    USE [GestionPaie]
    GO
    /****** Object:  UserDefinedFunction [dbo].[salaire_de_base]    Script Date: 03/08/2014 19:54:35 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
     
     
    ALTER FUNCTION [dbo].[salaire_de_base]
    (
    	@Id_fonctionnaire int
    )
    RETURNS decimal (20,2)
    AS
    BEGIN
    	declare @categorie int 
    	set @categorie = (SELECT     dbo.Categorie.Indice_minimal
    FROM         dbo.Fonctionnaire INNER JOIN
                          dbo.Fonction ON dbo.Fonctionnaire.Id_Fonction = dbo.Fonction.Id_fonction INNER JOIN
                          dbo.Categorie ON dbo.Fonction.Categorie = dbo.Categorie.Categorie
    where dbo.Fonctionnaire.Id_fonctionnaire=@Id_fonctionnaire)
     
    	RETURN @categorie
    END
    et
    la deuxième fonction dbo.Iindemnité1
    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
     
    USE [GestionPaie]
    GO
     
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
     
    ALTER FUNCTION [dbo].[Iindemnité1]
     
    (
    	@Id_fonctionnaire int
    )
    RETURNS decimal (18,2)
    AS
    BEGIN
    	declare @Iindemnité1req int 
    	set @Iindemnité1req = (SELECT     dbo.Iindemnité1.valeur_ech
    FROM         dbo.Fonctionnaire INNER JOIN
                          dbo.Echelon ON dbo.Fonctionnaire.Echelon = dbo.Echelon.ech INNER JOIN
                          dbo.Categorie ON dbo.Echelon.categorie = dbo.Categorie.Categorie INNER JOIN
                          dbo.Fonction ON dbo.Fonctionnaire.Id_Fonction = dbo.Fonction.Id_fonction AND dbo.Categorie.Categorie = dbo.Fonction.Categorie
                                where dbo.Fonctionnaire.Id_fonctionnaire=@Id_fonctionnaire)
     
    	RETURN @Iindemnité1req
    END
    Merci d'avance

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    juste une précision
    la procédure stockée Calcul_paie qui exécute deux fonctions ,cette procédure s’exécute sur la table dbo.Fonctionnaire cette table contient 5 fonctionnaires.
    Merci d'avance

  5. #5
    Membre confirmé

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 46
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 244
    Points : 574
    Points
    574
    Par défaut
    Hello,
    J'ai regardé les fonctions, à mon avis, si tu souhaites que cela ne plante plus, il faut rajouter TOP 1 dans les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ....
    	set @categorie = (SELECT   TOP 1  dbo.Categorie.Indice_minimal
    ...
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ...
    	set @Iindemnité1req = (SELECT  TOP 1   dbo.Iindemnité1.valeur_ech
    ...
    Néanmoins, je me suis posée quelques questions concernant ton architecture : cela me semble très compliqué pour "pas grand chose". Es-tu sûr d'avoir besoin de 2 fonctions scalaires pour effectuer ce calcul ? A leur lecture, j'ai l'impression qu'au pire 2 vues seraient équivalentes, et au mieux, ni vue ni fonction ne sont nécessaires !?
    J'ai bien peur que les performances soient finalement très détériorées à cause de ces fonctions.
    "C'est tellement merdique que toute modification est une amélioration !"

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par plume13 Voir le message
    Hello,
    J'ai regardé les fonctions, à mon avis, si tu souhaites que cela ne plante plus, il faut rajouter TOP 1 dans les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ....
    	set @categorie = (SELECT   TOP 1  dbo.Categorie.Indice_minimal
    ...
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ...
    	set @Iindemnité1req = (SELECT  TOP 1   dbo.Iindemnité1.valeur_ech
    ...
    Néanmoins, je me suis posée quelques questions concernant ton architecture : cela me semble très compliqué pour "pas grand chose". Es-tu sûr d'avoir besoin de 2 fonctions scalaires pour effectuer ce calcul ? A leur lecture, j'ai l'impression qu'au pire 2 vues seraient équivalentes, et au mieux, ni vue ni fonction ne sont nécessaires !?
    J'ai bien peur que les performances soient finalement très détériorées à cause de ces fonctions.
    Merci bcp Plume13 votre solution fonctionne très très bien merci encore une fois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] Progress Bar et l'execution d'une procedure stockée
    Par messi1987 dans le forum Débuter
    Réponses: 4
    Dernier message: 20/03/2014, 00h22
  2. Arreter l'execution d'une procedure stockée asynchrone
    Par Naruto_kun dans le forum Langages
    Réponses: 1
    Dernier message: 10/12/2013, 10h00
  3. Réponses: 0
    Dernier message: 23/11/2009, 18h05
  4. Execution d'une procedure stockée ds un script pl-sql
    Par padraig29 dans le forum Oracle
    Réponses: 11
    Dernier message: 30/07/2007, 17h00
  5. [SQL-Server] Execution d'une procedure stockée SQL Serveur depuis PHP.
    Par gregb34 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/05/2006, 02h06

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