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

Requêtes PostgreSQL Discussion :

Requête sql pour un UPDATE automatique


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Géomaticienne
    Inscrit en
    Juillet 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Géomaticienne
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2018
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Requête sql pour un UPDATE automatique
    Bonjour,

    je cherche à écrire une requête SQL qui me permettrait d'activer 2 UPDATE l'un après l'autre et de manière automatique au moment de la saisie d'un enregistrement dans la base :

    Actuellement, je dispose d'une table comme ceci :

    date0 | date1 | date2


    Quand je saisis une date0 => j'aimerais que le champ date1 se remplisse automatiquement avec la même valeur et que date2 reste vide,
    j'obtiens donc ceci :


    date0 | date1 | date2
    01/01/2010 | 01/01/2010 | --------

    Quand je modifie date0 => j'aimerais que date2 se remplisse automatiquement avec la même valeur que date0 et que la valeur de date1 ne bouge pas
    pour avoir qqchose comme cela :


    date0 | date1 | date2
    01/01/2022 | 01/01/2010 | 01/01/2022


    Actuellement j'ai donc 2 UPDATE séparés que j'active indépendamment pour arriver au même résultat.
    Voici mes 2 requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         - UPDATE matable
       SET date1 = date0
         WHERE date2 IS NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         - UPDATE matable
       SET date2 = date0
         WHERE date1 IS NOT NULL
    Mon but étant d'avoir les 2 UPDATES au sein d'un même trigger ou d'une vue, afin de me permettre par la suite, au travers d'un formulaire de saisie, de mettre à jour tous les champs dates lorsque je saisi une date0 ou quand je mets à jour le champ date0

    Quelqu'un pour m’aider ?
    Merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Un déclencheur fera bien le travail : vous exécutez une instruction sur INSERT et l'autre sur UPDATE.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Géomaticienne
    Inscrit en
    Juillet 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Géomaticienne
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2018
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour Waldar,

    En effet je souhaite bien faire en premier un INSERT puis un UPDATE

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez quelque chose de ce genre-là :
    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
    CREATE FUNCTION MaTable_Dates() RETURNS trigger
    AS $MaTable_Dates$
    BEGIN
        IF (TG_OP = 'UPDATE') THEN
            NEW.Date2 = NEW.Date0
        ELSIF (TG_OP = 'INSERT') THEN
            NEW.Date1 = NEW.Date0
        END IF;
     
        RETURN NEW;
    END;
    $MaTable_Dates$
    LANGUAGE plpgsql;
     
     
    CREATE TRIGGER tg_MaTable_Dates
    BEFORE INSERT OR UPDATE ON MaTable
    FOR EACH ROW EXECUTE PROCEDURE MaTable_Dates();

  5. #5
    Membre à l'essai
    Femme Profil pro
    Géomaticienne
    Inscrit en
    Juillet 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Géomaticienne
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2018
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour Waldar,

    MERCI pour votre aide !! j'ai bien avancée dans ma requête qui fonctionne sans aucun problème pour l'ajout et la modification de nlle données.

    Je souhaitais pouvoir également supprimer des enregistrements, j'ai donc rajouté la fonction DELETE. L'INSERT et le UPDATE fonctionne tjs mais pas mon DELETE...

    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
    CREATE OR REPLACE FUNCTION MaTable.Date_trg()
      RETURNS trigger AS
    $BODY$
    BEGIN
        IF (TG_OP = 'UPDATE') THEN
            NEW.date2 = NEW.date0;
           
            RETURN NEW;
            
        ELSIF (TG_OP = 'INSERT') THEN
            NEW.date1 = NEW.date0;
            
            RETURN NEW;
        
         ELSIF TG_OP = 'DELETE' THEN
            DELETE FROM MaTable WHERE id_date = OLD.id_date;
           RETURN NULL;
        
     END IF;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION MaTable_fct_trg()
      OWNER TO sig;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER MaTable_trg
      BEFORE INSERT OR UPDATE OR DELETE
      ON MaTable
      FOR EACH ROW
      EXECUTE PROCEDURE MaTable_fct_trg();

  6. #6
    Membre à l'essai
    Femme Profil pro
    Géomaticienne
    Inscrit en
    Juillet 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Géomaticienne
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2018
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Afin de corriger mon problème de DELETE, je me suis créée une "vue", pour y mettre un "INSTEAD OF" à la place d'un "BEFORE" et là tout fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER v_Date_trg
      INSTEAD OF INSERT OR UPDATE OR DELETE
      ON MaTable.v_Date
      FOR EACH ROW
      EXECUTE PROCEDURE MaTable.Date_trg();
    Merci de votre aide

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il n'y a pas besoin, le déclencheur permet de compléter ou de remplacer un ordre SQL.
    Dans le cas d'un DELETE, toute la ligne est effacée, il n'y a rien à faire de plus.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Géomaticienne
    Inscrit en
    Juillet 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Géomaticienne
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2018
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour Waldar,

    merci pour votre aide qui m'a permis de débloquer ce soucis et de créer ma requête.

    J'ai poursuivi ma requête en ajoutant d'autres fonctions, comme des calculs, certains fonctionnent sauf ceux avec des "*" et des "/". Je ne vois pas comment l'écrire autrement :

    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
    CREATE OR REPLACE FUNCTION MaTable_Date_trg()
      RETURNS trigger AS
    $BODY$
    BEGIN
        IF (TG_OP = 'UPDATE') THEN
            NEW.date2     = NEW.date0;
            NEW.tec2      = NEW.tec0;
            NEW.mtt_entre = (NEW.ce + NEW.ce1) - NEW.ff;
            NEW.solde     = NEW.mtt_entre - (NEW.a10 + NEW.a25 + NEW.a30 + NEW.a35);
            NEW.ch_usa    = (NEW.ce * 0,5) /100; NE FONCTIONNE PAS
           NEW.subv      = (NEW.ce * 0,5) /100; NE FONCTIONNE PAS
            NEW.ch_usa1   = NEW.ce1 - 5100;
            NEW.subv1     = 5100;
            
            RETURN NEW;
            
        ELSIF (TG_OP = 'INSERT') THEN
            NEW.date1     = NEW.date0;
            NEW.tec1      = NEW.tec0;
            NEW.mtt_entre = (NEW.ce + NEW.ce1) - NEW.ff;
            NEW.solde     = NEW.mtt_entre - (NEW.a10 + NEW.a25 + NEW.a30 + NEW.a35);
            NEW.ch_usa    = (NEW.ce * 0,5) /100; NE FONCTIONNE PAS
            NEW.subv      = (NEW.ce * 0,5) /100; NE FONCTIONNE PAS
            NEW.ch_usa1   = NEW.ce1 - 5100;
            NEW.subv1     = 5100;
            
            RETURN NEW;
        
        
     END IF;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION MaTable_Date_trg()
      OWNER TO sig;

  9. #9
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Dans les lignes qui ne fonctionnent pas, remplacez la virgule par un point comme séparateur décimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            NEW.ch_usa    = (NEW.ce * 0.5) /100; NE FONCTIONNE PAS
           NEW.subv      = (NEW.ce * 0.5) /100; NE FONCTIONNE PAS
    Sous PostgreSQL, le séparateur décimal est le point.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  10. #10
    Membre à l'essai
    Femme Profil pro
    Géomaticienne
    Inscrit en
    Juillet 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Géomaticienne
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2018
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Merci !!

    tout fonctionne avec cette correction

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

Discussions similaires

  1. Requête SQL pour insérer une donnée BINAIRE ?
    Par Najdar dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/05/2006, 10h21
  2. Requêtes SQL pour les Dates et numériques
    Par Ramage03 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/03/2006, 17h26
  3. Requête SQL pour afficher un tri
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2005, 15h27
  4. problème de requète SQL pour formulaire
    Par en_stage dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2005, 12h21
  5. Requêtes SQL pour access
    Par cciocc dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/04/2005, 08h45

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