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 :

Appel d'une fonction dans une fonction (sql server 2005)


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Appel d'une fonction dans une fonction (sql server 2005)
    Bonjour,

    Je suis en train d'écrire une fonction me permettant de calculer une date selon une date d'origine et un délai à rajouter.
    Pour cela j'ai besoin d'une autre fonction qui me permet de savoir si le jour suivant est un jour travaillé ou non. Cette fonction renvoi un boolean à vrai si le jour suivant est travaillé, faux sinon.

    Ainsi, dans ma première fonction, j'ai une condition qui est que si le jour suivant est travaillé, alors on fait telle chose. Mais comment faire pour appeler la fonction de vérification du jour suivant, et selon le résultat renvoyé, faire ou nonn la boucle dans la première fonction ??

    Merci de votre aide

  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 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Postez votre code...

    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut Code
    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
     
    CREATE FUNCTION calcul_delai
    (
    -- Add the parameters for the function here
    @DHDebut DateTime,
    @Delai Int
    )
    RETURNS DateTime
    AS
    BEGIN
    -- Declare the return variable here
    DECLARE @DateFin DateTime
    DECLARE @JourSuiv BIT
    SET @DateFin = @DHDebut
     
    IF DATEPART(hour, @DHDebut) < 9
    SET @DateFin = DATEADD(hour, -DATEPART(hour,@DHDebut)+9, DateFin)
    ELSE IF DATEPART(hour, @DHDebut) > 18
    BEGIN
    SET @DateFin = DATEADD(hour, -DATEPART(hour,@DHDebut)+9, DateFin)
    WHILE --APPEL A JOUR_SUIVANT = false
    BEGIN
    SET @DateFin = DATEADD(day, DATEPART(day,@DHDebut)+1, DateFin)
    END
    END
    ELSE IF ((DATEPART(hour, @DHDebut) > 12) & (DATEPART(hour, @DHDebut) < 14))
    SET @DateFin = DATEADD(hour, -DATEPART(hour,@DHDebut)+14, DateFin)
     
    ... Je ne poste pas tout car le reste est insignifiant
     
     
    CREATE FUNCTION jour_suivant
    (
    -- Add the parameters for the function here
    @JourActuel DateTime
    )
    RETURNS BIT
    AS
    BEGIN
    <div style="margin-left:40px">-- Declare the return variable here
    DECLARE @Ok BIT -- Jour suivant ouvré
    -- Declare variables
    DECLARE @JourSuivant DateTime
    DECLARE @NumJour Int
    -- Fonction
    SELECT @JourSuivant = DATEADD(day, DATEPART(day,@JourActuel)+1, @JourSuivant)
    SELECT @NumJour = DATEPART(weekday, @JourSuivant)
     
    IF (@NumJour=1 | @NumJour=2 | @NumJour=3 | @NumJour=4 | @NumJour=5)
    @Ok = true
    ELSE
    @Ok = false
     
    -- Return the result of the function
    RETURN @Ok</div>END
    GO

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je ne suis pas sûr que le code de la fonction FnCalculeDelai que je vais vous proposer répondra parfaitement à ce que vous souhaitez faire, mais vous pourrez au moins vous en inspirer :

    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
    CREATE FUNCTION FnIsJourSuivantOuvre (@Jour DATETIME)
    	RETURNS BIT
    AS
    BEGIN
    	RETURN CASE DATEPART(weekday, DATEADD(day, 1, @Jour))
    				WHEN 6 THEN 1
    				WHEN 7 THEN 1
    				ELSE 0
    			END
    END
    -----------------------------------------------------------
    CREATE FUNCTION FnCalculeDelai (@DHDebut DATETIME, @Delai INT)
    	RETURNS DATETIME
    AS
    BEGIN
    	DECLARE @heure TINYINT
    	SELECT @heure = DATEPART(hour, @DHDebut)
     
    	RETURN CASE dbo.FnIsJourSuivantOuvre(@DHDebut)
    				WHEN 0 THEN CASE 
    								WHEN @heure < 9 OR @heure > 18 THEN DATEADD(hour, -@heure + 9, @DHDebut)
    								WHEN @heure > 12 AND @heure < 14 THEN DATEADD(hour,-@heure + 14, @DHDebut)
    							END
    				WHEN 1 THEN DATEADD(day, @heure + 1, @DHDebut)
    			END
    END
    Faites attention au code de FnIsJourSuivantOuvre, car dans votre cas il suppose que la valeur de @@DATEFIRST est configuré à 1 (1er jour de la semaine : lundi), ce qui n'est pas vrai chez nos amis anglo-saxons (1er jour de la semaine : dimanche)

    @++

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Je ne suis pas sûr que le code de la fonction FnCalculeDelai que je vais vous proposer répondra parfaitement à ce que vous souhaitez faire, mais vous pourrez au moins vous en inspirer :

    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
    CREATE FUNCTION FnIsJourSuivantOuvre (@Jour DATETIME)
    	RETURNS BIT
    AS
    BEGIN
    	RETURN CASE DATEPART(weekday, DATEADD(day, 1, @Jour))
    				WHEN 6 THEN 1
    				WHEN 7 THEN 1
    				ELSE 0
    			END
    END
    -----------------------------------------------------------
    CREATE FUNCTION FnCalculeDelai (@DHDebut DATETIME, @Delai INT)
    	RETURNS DATETIME
    AS
    BEGIN
    	DECLARE @heure TINYINT
    	SELECT @heure = DATEPART(hour, @DHDebut)
     
    	RETURN CASE dbo.FnIsJourSuivantOuvre(@DHDebut)
    				WHEN 0 THEN CASE 
    								WHEN @heure < 9 OR @heure > 18 THEN DATEADD(hour, -@heure + 9, @DHDebut)
    								WHEN @heure > 12 AND @heure < 14 THEN DATEADD(hour,-@heure + 14, @DHDebut)
    							END
    				WHEN 1 THEN DATEADD(day, @heure + 1, @DHDebut)
    			END
    END
    Faites attention au code de FnIsJourSuivantOuvre, car dans votre cas il suppose que la valeur de @@DATEFIRST est configuré à 1 (1er jour de la semaine : lundi), ce qui n'est pas vrai chez nos amis anglo-saxons (1er jour de la semaine : dimanche)

    @++

    Merci pour ce code, il m'aide un petit peu. Le problème, je ne vois pas ou tu te sers de ton délai ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Le code complet de ma fonction


    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
    CREATE FUNCTION calcul_delai
    (
     -- Add the parameters for the function here
     @DHDebut DateTime,
     @Delai Int
    )
    RETURNS DateTime
    AS
    BEGIN
     -- Declare the return variable here
     DECLARE @DateFin DateTime
     DECLARE @JourSuiv BIT
     SET @DateFin = @DHDebut
     
        -- Foncton
      -- Placement de l'horaire dans la journée
      IF DATEPART(hour, @DHDebut) < 9
       SET @DateFin = DATEADD(hour, -DATEPART(hour,@DHDebut)+9, DateFin)
      ELSE IF DATEPART(hour, @DHDebut) > 18
       BEGIN
        SET @DateFin = DATEADD(hour, -DATEPART(hour,@DHDebut)+9, DateFin)
        WHILE --APPEL A JOUR_SUIVANT= false
        BEGIN
         SET @DateFin = DATEADD(day, DATEPART(day,@DHDebut)+1, DateFin)
         -- APPEL A JOUR_SUIVANT
        END
       END
      ELSE IF ((DATEPART(hour, @DHDebut) > 12) & (DATEPART(hour, @DHDebut) < 14))
       SET @DateFin = DATEADD(hour, -DATEPART(hour,@DHDebut)+14, DateFin)
     
      -- Calcul de la première journée si même jour que la demande
      IF (DATEPART(hour, @DateFin) >= 9 & DATEPART(hour, @DateFin) <= 12)
       BEGIN
        SET @Delai = @Delai - (12 - DATEPART(hour,@DateFin))
        SET @DateFin = DATEADD(hour, -DATEPART(hour,@DateFin)+12, DateFin)
        IF @Delai != 0 & @Delai >= 4
         BEGIN
          SET @Delai = @Delai - (18 - DATEPART(hour,@DateFin))
          SET @DateFin = DATEADD(hour, -DATEPART(hour,@DateFin)+18, DateFin)
         END
       END 
      ELSE IF (DATEPART(hour, @DateFin) >= 14 & DATEPART(hour, @DateFin) <= 19)
       BEGIN
        SET @Delai = @Delai - (18 - DATEPART(hour,@DateFin))
        SET @DateFin = DATEADD(hour, -DATEPART(hour,@DateFin)+18, DateFin)
       END
      WHILE @Delai != 0
       IF -- APPEL A JOUR_SUIVANT = true
        SET @DateFin = DATEADD(day, DATEPART(day,@DateFin)+1, DateFin)
        SET @DateFin = DATEADD(hour, -DATEPART(hour,@DateFin)+9, DateFin)
        IF @Delai <= 3
         BEGIN
          SET @DateFin = DATEADD(hour, @Delai, DateFin)
          SET @Delai = 0
          BREAK
         END
        ELSE IF @Delai <= 7
         BEGIN
          SET @DateFin = DATEADD(hour, @Delai + 2, DateFin) -- @Delai+2 pour la pause du midi
          SET @Delai = 0
          BREAK
         END
        ELSE
         BEGIN
          SET @DateFin = DATEADD(hour, 9, DateFin) -- 7h + 2h de pause
          SET @Delai = @Delai - 7
          CONTINUE
         END
       ELSE
        BEGIN
         SET @DateFin = DATEADD(day, DATEPART(day,@DateFin)+1, DateFin)
         SET @DateFin = DATEADD(hour, -DATEPART(hour,@DateFin)+9, DateFin)
         CONTINUE
        END
     -- Return the result of the function
     RETURN @DateFin
    END
    GO

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    je ne vois pas ou tu te sers de ton délai
    Exact, je n'ai pas vu non plus où tu t'en sers ...

    Tu pourrais probablement simplifier le code de ta fonction finale avec des CASE ...

    @++

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Exact, je n'ai pas vu non plus où tu t'en sers ...

    Tu pourrais probablement simplifier le code de ta fonction finale avec des CASE ...

    @++

    C'est pour cela que j'ai reposté le code complet de ma fonction !

    Oui je vais essayer de la simplifier avec des CASE mais j'avous que j'ai beaucoup de mal car je débute en T-SQL et je suis en stage ! Mais bon j'essaye !

    Si tu peux m'aider pour le code que j'ai posté juste au dessus je suis preneur !

    Merci en tout cas

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Exact, je n'ai pas vu non plus où tu t'en sers ...

    Tu pourrais probablement simplifier le code de ta fonction finale avec des CASE ...

    @++

    elsuket, tu pourrais m'aider pour mon code ou pas ?
    Car je suis vraiment pommé...

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Je peux mais pas tout de suite.
    D'autres participants peuvent aussi t'aider

    @++

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Je peux mais pas tout de suite.
    D'autres participants peuvent aussi t'aider

    @++
    Oui toi ou un autre évidemment !

    Aidez-moi !!! ^^

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2013, 12h05
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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