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 :

Syntaxe sur if else


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Par défaut Syntaxe sur if else
    Bonjour,

    Ce bout de code est issue de ma 1er procédure stockée .
    J'ai un problème de syntaxe sur la condition IF, j'ai aussi hésité a la remplacer par CASE.
    Merci pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF @date1 = NULL @date1 = 'ok'  else @date1 'pas ok'
    Le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Syntaxe incorrecte vers '@date1'

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Les 2 sont possibles : (je suppose que @date1 n'est pas une date ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF @date1 IS NULL 
     SET @date1 = 'ok'  
    ELSE 
     SET @date1 = 'pas ok'
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET date1 = CASE WHEN @date1 IS NULL THEN 'ok'
                              ELSE 'pas ok'
                      END
    ++

  3. #3
    Membre éclairé Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Par défaut
    (je suppose que @date1 n'est pas une date
    Si c'est une date, ça pose problème à priori ?!

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Oui parce que vous réaffectez à la variable @date1 est une valeur qui n'est pas conforme ('ok' ou 'pas ok')

    Dans ce cas il faut ajouter une 2ème variable @result par exemple ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF @date1 IS NULL 
     SET @result = 'ok'  
    ELSE 
     SET @result = 'pas ok'
    Sinon postez votre code entier de procédure pour voir si on peut procéder autrement

    ++

  5. #5
    Membre éclairé Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Par défaut
    J'ai modifié la condition, c'est mieux avec une date plutôt qu'un varchar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    IF @date1 IS NULL 
         SET @date1 = '2010-01-01'  
        ELSE 
         SET @date1 = @date1
    Si c'est hors post je comprendrais, sinon pourriez-vous me dire si mon début de procédure vous parait correcte :

    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
     
    ALTER PROCEDURE [dbo].[CALCUL_TEST](@matric int)
    AS
     
    DECLARE @pb int;
    DECLARE @pm int;
    DECLARE @abs1 int;
    DECLARE @abs2 int ;
    DECLARE @date1 datetime;
    DECLARE @date2 datetime;
     
    -- Récupération des valeurs nécéssaires au calcul de la prime individuelle
    SELECT
     @date1=d_entree
    ,@date2=d_sortie
    ,@abs1=absenteisme1
    ,@abs2=absenteisme2
    ,@pm=part_manageriale
    FROM 
    utilisateur_gldr A
    WHERE 
    peg = 1
    AND A.annee = 2010
    AND MATRIC = @matric 
     
        -- On vérifit l'existance de la prime de base (@pb)
        IF NOT EXISTS(SELECT prime_Debase FROM peg_historique_calcul WHERE annee = 2010)
    BEGIN
        PRINT 'Il manque la prime de base';
        RETURN;
    END
        IF EXISTS (SELECT prime_Debase FROM peg_historique_calcul WHERE annee = 2010)
    BEGIN
        PRINT 'Le calcul peut commencer :';
     
        IF @date1 IS NULL 
         SET @date1 = '2010-01-01'  
        ELSE 
         SET @date1 = @date1
     
        PRINT @date1;
        RETURN;
     
    END

  6. #6
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Moi j'enleverais la partie IF .. ELSE et je modifierais le 1er SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -- Récupération des valeurs nécéssaires au calcul de la prime individuelle
    SELECT
     @date1=ISNULL(d_entree, '2010-01-01')
    ,@date2=d_sortie
    ,@abs1=absenteisme1
    ,@abs2=absenteisme2
    ,@pm=part_manageriale
    FROM 
    utilisateur_gldr A
    WHERE 
    peg = 1
    AND A.annee = 2010
    AND MATRIC = @matric
    .....
    ++

  7. #7
    Membre éclairé Avatar de arthuro45
    Profil pro
    Développeur du dimanche
    Inscrit en
    Juillet 2009
    Messages
    602
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Juillet 2009
    Messages : 602
    Par défaut
    Merci pour le if else en moins je ne connaissais pas encore cette syntaxe.

    Je vous présente ma 1er procédure stockée, elle retourne le même résultat que la même fonction écrite en PHP, donc est elle juste. Mon but est de tester si cette procédure accélère le traitement par rapport à la fonction PHP :

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    ALTER PROCEDURE [dbo].[calcul_prime_individuelle](@id_utilisateur_gldr int, @annee int)
    AS
     
    DECLARE @pb float;
    DECLARE @pm int;
    DECLARE @abs1 int;
    DECLARE @abs2 int;
    DECLARE @coef1 float;
    DECLARE @coef2 float;
    DECLARE @date1 datetime;
    DECLARE @date2 datetime;
    DECLARE @nb_jour int;
    DECLARE @prime_debase_parjour float;
    DECLARE @prime_auprorata_jour float;
    DECLARE @prime_individuelle float;
     
    -- Récupération des valeurs nécéssaires au calcul de la prime individuelle
    SELECT
     @date1=ISNULL(d_entree,'2010-01-01') 
    ,@date2=ISNULL(d_sortie, '2010-31-12')
    ,@abs1=absenteisme1
    ,@abs2=absenteisme2
    ,@pm=ISNULL(part_manageriale, 0)
    FROM 
    dbo.utilisateur_gldr A
    WHERE 
    id_utilisateur_gldr=@id_utilisateur_gldr
     
    SELECT
    @pb = prime_Debase
    FROM
    dbo.PEG_HISTORIQUE_CALCUL
    WHERE
    annee = @annee
    AND etat = 1
     
    -- ********************************************************************************
    --                        CALCUL DE LA PRIME INDIVIDUELLE
    --*********************************************************************************
     
        -- On vérifit l'existance de la prime de base
        IF NOT EXISTS(SELECT prime_Debase FROM peg_historique_calcul WHERE annee = @annee)
    BEGIN
        PRINT 'Il manque la prime de base';
        RETURN;
    END
        IF EXISTS (SELECT prime_Debase FROM peg_historique_calcul WHERE annee = @annee)
    BEGIN
     
        -- Si les dates d'entrée et sortie de l'entreprise sont à NULL, on effectue le calcul sur 365 jours :
        --IF @date1 IS NULL SET @date1 = '2010-01-01' ELSE SET @date1 = @date1;
        --IF @date2 IS NULL SET @date2 = '2010-31-12' ELSE SET @date2 = @date2;
     
        -- Si la prime managèriale (@pm) est à NULL, on remplace NULL par 0 pour que le calcul s'effectue :
        --IF @pm IS NULL SET @pm = 0 ELSE SET @pm = @pm;
     
        -- calcul du nombre de jours :
        SET @nb_jour = DATEDIFF(day,@date1, @date2);
     
        -- Calcule du montant de la prime de base par jour pour une année :
        SET @prime_debase_parjour = @pb/364;
     
        -- Calcul de la prime de base par jour sur l'année :
        SET @prime_auprorata_jour = @nb_jour*@prime_debase_parjour;
     
        -- Récupération des COEFFICIENTS en fonction des JOURS D'ABSENTEISME sur les deux semestres (ABS1 et ABS2):
        SELECT
        @coef1=coeff
        FROM peg_parametre
        WHERE @abs1 BETWEEN valeur_min AND valeur_max
     
        SELECT
        @coef2=coeff
        FROM peg_parametre
        WHERE @abs2 BETWEEN valeur_min AND valeur_max
     
        -- CALCULE DE LA PRIME INDIVIDUELLE :
        SET @prime_individuelle = (((@prime_auprorata_jour + @pm)/2) * @coef1) + (((@prime_auprorata_jour + @pm)/2) * @coef2);
     
        -- Insertion de la prime individuelle :
        UPDATE dbo.utilisateur_gldr
        SET MONTANT_PEG=ROUND(@prime_individuelle,0)
        WHERE id_utilisateur_gldr=@id_utilisateur_gldr
     
        --Debug:
        --PRINT @date1;
        --PRINT @date2;
        --PRINT @nb_jour;
        --PRINT @pb;
        --PRINT @prime_debase_parjour;
        --PRINT @prime_auprorata_jour;
        --PRINT @coef1;
        --PRINT @coef1;
        PRINT @prime_individuelle;
        RETURN;
     
    END

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

Discussions similaires

  1. [MySQL] Erreur de syntaxe sur requête
    Par winnie82 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 21/03/2006, 13h51
  2. [MySQL] Erreur de syntaxe sur ma requête SELECT
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 08/03/2006, 11h50
  3. [MySQL] Erreurs de syntaxe sur requêtes DELETE
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2006, 15h53
  4. Erreur de syntax sur JOIN
    Par helje dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/03/2006, 17h36
  5. Erreur de syntaxe sur la création d'une vue.
    Par cgougeon dans le forum Installation
    Réponses: 3
    Dernier message: 09/09/2005, 11h00

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