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

Langage SQL Discussion :

Problème sur les évènements SQL


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Problème sur les évènements SQL
    Bonjour tout le monde,

    Je voudrais créer un évènement qui parcourt un attribut '' date_fin '' de type DATE dans la table affectation. Si date_fin est égale à la date d'aujourd'hui alors changer l'attribut '' statut '' de la table de collaborateur à '' non affecté '' sachant que l'identifiant de la table collaborateur est une clé étrangère de la table affectation.

    J'ai jamais appris comment faire alors je me suis documenté mais je bug trop alors que ça à l'air facile. Voilà ce que j'ai fait mais ça donne l'erreur 1064 dans la ligne 1 (erreur SQL) et je ne suis même pas sûr que ça pourrait fonctionner !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DECLARE
    CURSOR curseur IS
    SELECT date_fin FROM affectation ;
    ma_date date ;
    BEGIN
    OPEN curseur ;
    FOR ma_date IN curseur LOOP
        UPDATE collaborateur SET collaborateur.statut="non affecté" WHERE DATEDIFF(CURDATE(),ma_date)=0 ;
    END LOOP;
    CLOSE curseur;
    END;
    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Quel SGBD utilises-tu ?
    Quel est le message d'erreur associé au code 1064 ? Les codes d'erreur sont spécifiques à chaque SGBD. Sans connaître celui-ci, il est d'autant plus difficile de comprendre l’erreur.

    Rappel : Les chaines de caractères s'encadrent de guillemets simple en SQL standard.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Par ailleurs, il me semble que vous n'avez pas besoin de curseur pour faire ce que vous voulez : une simple requête devrait suffire, et sera surement bien plus rapide (à écrire, comme à exécuter...)
    Quels est la structure de vos tables ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Le SGBD que j'utilise est PhpMyAdmin.
    L'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    La requête «CREATE DEFINER=`root`@`localhost` EVENT `majStatutCol` ON SCHEDULE EVERY 10 DAY STARTS '2013-05-27 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO DECLARE CURSOR curseur IS SELECT date_fin FROM affectation ; ma_date date ; BEGIN OPEN curseur ; FOR ma_date IN curseur LOOP UPDATE collaborateur SET collaborateur.statut="non affecté" WHERE DATEDIFF(CURDATE(),ma_date)>0 ; END LOOP; CLOSE curseur; END;» a échoué
    MySQL a répondu: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE CURSOR curseur IS SELECT date_fin FROM affectation ; ma_date date ; ' at line 1
    La structure de mes tables :
    Collaborateur (id_collaborateur, nom_collaborateur, prenom_collaborateur, niveau, statut, telephone, #id_service)
    Affectation (id_affectation, #id_collaborateur, #id_client, #id_site, type_affecation, date_deb, date_fin, motif)

    Merci pour votre intention !!

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Tel que je lis ce que tu as essayé de faire dans ton script, voilà ce qui s'exécuterait (s'il n'y avait pas d'erreur de syntaxe) :
    Parcourir la table Affectation
    Si date_fin est égal a date du jour,
    Modifier le statut de tous les collaborateurs
    Est-ce réellement ce que tu attends ?

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    euh non le deuxième point c'est pas ça ! je veux modifier le statut du collaborateur qui sa date de fin d'affectation et égale à la date d'aujourd'hui !

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'ai réussi à modifier le code, je crois que celui là fonctionnerait il faut seulement résoudre cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CURSOR cur1 IS SELECT id_collaborateur FROM affectation WHERE DATEDIFF(CURDATE()' at line 6
    le code est :
    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
    DELIMITER |
    CREATE PROCEDURE update_collaborateur()
    BEGIN
    DECLARE idc int;
    DECLARE done INT DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    DECLARE CURSOR cur1 IS SELECT id_collaborateur FROM affectation WHERE DATEDIFF(CURDATE(),date_fin) = 0 ;
    OPEN cur1;
    REPEAT
        FETCH cur1 INTO idc
        IF NOT done THEN
            UPDATE collaborateur SET statut="Non affecté" WHERE id_collaborateur = idc;
        END IF;
    UNTIL done 
    END REPEAT;  
    CLOSE cur1;
    END|
    DELIMITER ;
    Un sauveur ou une sauveuse ?

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 400
    Points
    28 400
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    il me semble que vous n'avez pas besoin de curseur pour faire ce que vous voulez : une simple requête devrait suffire, et sera surement bien plus rapide (à écrire, comme à exécuter...)
    Supprimons le conditionnel :
    Une requête du type update ... where exists (select...) sera bien plus rapide à écrire et à exécuter !

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    je te suis pas !

    tu peux être plus explicites stp !

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Il suffit d'etre plus explicite sur le besoin.
    Si je ne me trompe pas :
    "mettre à jour le statut des collaborateurs qui n'ont plus d'affectation en cours"

    Ce qui se traduit en
    mettre à "Non affecté" le statut des collaborateurs pour lesquels il n'existe aucune ligne dans table affectation, pour ce collaborateur, ayant une date de fin supérieure à la date du jour"

    Ce qui se traduit enfin en SQL par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE Collaborateur C
    SET Statut = 'Non affecté'
    WHERE NOT EXISTS(
        SELECT 1
        FROM Affectation A
        WHERE A.id_collaborateur = C.id_collaborateur
        AND A.date_fin >CURDATE()
    )

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Un très grand merci à toi !! Je vois que je me suis bien compliqué les choses !!


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

Discussions similaires

  1. [Débutant] [API Communicator] Problème sur les événements
    Par Gumpy dans le forum C#
    Réponses: 1
    Dernier message: 01/02/2012, 14h38
  2. Droits sur les base SQL
    Par fabguy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/06/2006, 09h00
  3. Réponses: 6
    Dernier message: 31/03/2006, 17h05
  4. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09
  5. demande d'information sur les processus sql server
    Par patrick B dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 02/11/2005, 14h04

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