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

MS SQL Server Discussion :

Probleme avec Select Case


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Probleme avec Select Case
    Bonjour à tous!

    J'ai un petit problème pour écrire une procédure stockée pour Sql Server 2000.
    Voici les données de mon problème

    J'ai une table client et une table contrat comme suit :

    --------------------------------------------------------------------------------

    Client
    {
    Nocli int
    Bloque bit
    Urgence int
    }

    Contrat
    {
    NoContrat int
    DateSignature datetime
    }

    Client.NoCli est la clés primaire de Client
    Contrat.NoContrat est la clés primaire de Contrat

    --------------------------------------------------------------------------------

    DATEDIFF(day, DateSignature, GETUTCDATE() )

    la formule ci-dessus permet de connaitre le nombre de jour écoulé entre DateSignature et la date courante.


    Et j'aimerais mettre à jour grace à une procédure stockée la propriété Urgence pour chaque client. Sachant que
    Urgence vaut 1 quand Bloque=1
    ou quand DATEDIFF() <= 10 jours

    Urgence vaut 2 quand Bloque = 0
    et quand DATEDIFF() > 10 et DATEDIFF() < 30

    Urgence vaut 3 quand Bloque = 0
    et quand DATEDIFF() > 30

    Voila j'aurais besoin de votre aide car visiblement je n'arrive pas à avoir une procédure stockée fonctionelle, il y'a certainement l'utilisation des SELECT CASE, ca je sais plus ou moins l'utiliser mais pour mon exemple j'ai du mal a implémanté correctement. En fait je sais faire cette procédure stockée avec comme paramètre le numéro du client (NoCli) mais pour avoir un traitement sur tous les client, là je sêche, merci de me donner un coup de main [/b]

  2. #2
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Je constate à tout hasard que tu n'as pas une relation entre la table des contrats et celle des clients.

    je conseillerai de mettre une relation entre ces deux tables et utiliser le
    IF ... ELSE
    pour ta procédure stockée.

    Cordialement

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut
    Désolé de ne pas avoit été assez clair voila une meilleur définition de ms tables ::

    Client
    {
    Nocli int
    Bloque bit
    Urgence int
    }

    Contrat
    {
    NoContrat int
    NoCli int
    DateSignature datetime
    }

    Client.NoCli est la clés primaire de Client
    Contrat.NoContrat est la clés primaire de Contrat
    Contrat.NoCli est une clés étrangère liée à Client.Nocli

    Tu parles de IF...ELSE, je veut bien mais pour un traitment pour 1 seul client il n'ya pas de probleme, alors que pour un traitement sur tous les clients apparment ca ne marche pas

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 25
    Points : 25
    Points
    25
    Par défaut
    En utilisant le IF...ELSE dans un curseur qui parcours ta table, ça devrait être bon.

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    essaies ceci et nous verrons si ça marche
    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
    CREATE proc MAJUrgence
    AS
     
    declare UrgenceCur CURSOR FOR
     
    Select Bloque , DATEDIFF(day, DateSignature, GETUTCDATE()) 
    from Client C,Contrat C1 
    where C1.NoCli = C.NoCli
     
    Declare @Bloque as bit,@Intervalle as int;
    OPEN UrgenceCur
    FETCH NEXT FROM UrgenceCur
    	into  @Bloque,@Intervalle;
    WHILE (@@FETCH_STATUS = 0)
    Begin
    If (@Bloque = 1) and (@Intervalle <= 10)
    BEGIN
    Update Client SET Urgence = 1
    END
    ELSE If (@Bloque = 0) and (@Intervalle between 10 and 30)
    BEGIN
    Update Client SET Urgence = 1
    END
    ELSE If (@Bloque = 0) and (@Intervalle > 30)
    BEGIN
    Update Client SET Urgence = 1
    END
     
    FETCH NEXT FROM UrgenceCur
      into  @Bloque,@Intervalle;
    end
    CLOSE UrgenceCur
    DEALLOCATE UrgenceCur;
     
    GO
    J'utilise un curseur comme l'a dit Joul's

    A++

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Modifies le
    Update Client SET Urgence = 1
    Pour chaque cas. Sur le coup de la précipitation j'ai laissé une seule valeur.

    Tiens nous informé

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 23
    Points : 7
    Points
    7
    Par défaut Merci à vous :)
    Merci, le bout de code m'a vraiment bien aidé pour la structure globale de mon scripte, cependant pour que ca marche dans la logique du probleme il aurait fallut en plus incluer dans le curseur le numéro de client, car sans cela a chaque update, cela affecte tous les clients :p Enfin a part ca c'était tout bon
    Mon problème était légèrement plus compliqué que cela, je l'ai raccourci afin de ne pas poser une question trop complexe, donc voici mon vrai scripte pleinement fonctionel, si vous avez des choses à y redire, n'hésiteez pas, et encore merci
    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
     
    CREATE proc MajAllClient
    AS 
     
    DECLARE UrgenceCur CURSOR FOR 
     
    SELECT C.Bloque , DATEDIFF(day, DATEADD(y,1,C1.DateSignature), GETDATE()), C.NoCli, C1.HCourantN1, C1.HCourantN2, C1.HDebutN1, C1.HDebutN2
    FROM Client C,NewContrat C1 
    WHERE C1.NoCli = C.NoCli 
    AND C1.Etat=1
     
    UPDATE Client SET Urgence=0;
     
    DECLARE @Bloque AS BIT,@Intervalle AS INT, @NoCli AS INT, @HCourantN1 AS INT, 
    @HCourantN2 AS INT, @HDebutN1 AS INT, @HDebutN2 AS INT;
     
    OPEN UrgenceCur 
    	FETCH NEXT FROM UrgenceCur INTO  @Bloque, @Intervalle, @NoCli, @HCourantN1, @HCourantN2, @HDebutN1, @HDebutN2; 
     
    	WHILE (@@FETCH_STATUS = 0) 
    	BEGIN
    		IF (@Bloque=1) OR (@Intervalle <= 10)  OR (@HCourantN1<=0 AND @HDebutN1>0 ) OR (@HCourantN2<=0 AND @HDebutN2>0 )
    			UPDATE Client SET Urgence = 1 WHERE NoCli=@NoCli;
    		ELSE IF (@Bloque=0) AND ((@Intervalle BETWEEN 10 and 30) OR (@HCourantN1<0.2*@HDebutN1 AND NOT(@HDebutN1=0)) OR (@HCourantN1<0.2*@HDebutN1 AND NOT(@HDebutN1=0)))
    			UPDATE Client SET Urgence = 2 WHERE NoCli=@NoCli;
    		ELSE IF (@Bloque=0) AND (@Intervalle >= 30) 
    			UPDATE Client SET Urgence = 3 WHERE NoCli=@NoCli;
     
    	FETCH NEXT FROM UrgenceCur INTO  @Bloque, @Intervalle, @NoCli, @HCourantN1, @HCourantN2, @HDebutN1, @HDebutN2; 
    	END
    CLOSE UrgenceCur 
    DEALLOCATE UrgenceCur;
    GO

  8. #8
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Points : 358
    Points
    358
    Par défaut
    Contente de t'avoir aidé.

    Penses au TAG RESOLU pour la lisibilité du forum.

    Merci

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

Discussions similaires

  1. [XL-2003] Probleme avec Select Case base sur le rapport de deux variables :
    Par Bonero dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/02/2012, 12h41
  2. [EJB3][HIBERNATE] Probleme avec select max
    Par kristof_machin dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/04/2006, 13h05
  3. [VB]probleme avec select case
    Par mickael99 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/02/2006, 14h07
  4. Probleme avec select
    Par sorry60 dans le forum Réseau
    Réponses: 20
    Dernier message: 16/12/2005, 17h23
  5. [C#][débutant] Probleme avec un case
    Par Le Basque dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/01/2005, 12h45

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