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 :

Trigger et retour de valeur


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Trigger et retour de valeur
    Bonjour,

    J'ai un trigger qui pose problème (je débute en Postgres).
    Pour faire des comptes, j'ai les tables :
    t_comptes = listes des comptes
    t_operations = les opérations
    t_soldes = les soldes au fur et à mesure des opérations

    Quand j’insère ou modifie un enregistrement (validé ou non par la banque),
    il insère une ligne dans t_soldes.
    Mais je n'arrive pas à faire passer par défaut la valeur du champ sur lequel je travaille (current row) dans la fonction (en rouge).

    J'ai regardé un peu tout mais sans résultat.

    Merci de votre aide.

    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
    CREATE OR REPLACE FUNCTION test5()
      RETURNS trigger AS
    $BODY$
    
    begin
    
    insert into t_soldes
    values (default,
    (select ope_cpt from t_operations, t_comptes where ope_cpt=cpt_num),
    (select sum(ope_cre) from t_operations,t_comptes where ope_val='TRUE' and ope_cpt=cpt_num),
    (select sum(ope_deb) from t_operations,t_comptes where ope_val='TRUE' and ope_cpt=cpt_num),
    (select coalesce(sum(ope_cre),'0.00') from t_operations,t_comptes where ope_val='FALSE' and ope_cpt=cpt_num),
    (select coalesce(sum(ope_deb),'0.00') from t_operations,t_comptes where ope_val='FALSE' and ope_cpt=cpt_num),
    (select sum(ope_cre)-sum(ope_deb) from t_operations,t_comptes where ope_val='TRUE' and ope_cpt=cpt_num)
    );
    return new;

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut utiliser NEW.nom_du_champ pour accéder aux valeurs insérées.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Précision
    Bonjour,

    la table t_comptes:
    cpt_num = numéro de compte

    la table t_opérations :
    ope_num = numéro d'oprération
    ope_cpt = opération sur le compte n

    la table t_soldes :
    sol_num = numéro de solde
    sol_cpt = solde sur compte n

    donc je voudrais pouvoir prendre la valeur ope_cpt de l'enregistrement que j'insère ou modifie dans la table t_soldes pour pouvoir faire que le trigger fonctionne automatiquement en fonction de la ligne où je me trouve pour faire les opérations qui y sont définies.

    J'espère être assez précis.

    Merci

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'ai fait un essai sans résultat.

    le trigger s’exécute à l'ajout donc NEW.champ mais aussi en modification
    Je ne sais pas comment prendre champ/champ sur un l'enregistrement courant
    nouveau ou déjà existant
    j'ai regarder CURSOR mais je ne comprends pas le fonctionnement.
    Je m'y prends peut-être mal, la table t_operations contient n operations pour n comptes.
    je veux juste avoir la valeur t_operations.ope_cpt pour l'utiliser dans une requête que l'enregistrement existe ou qu'il soit en cours de création.

    merci
    ps : si je ne suis pas très clair, je peux donner le détail des tables

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faudrait plutôt montrer le code, la version utilisant NEW, et aussi le CREATE TRIGGER correspondant.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Voici le code de la déclaration de la fonction trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER test5
      AFTER INSERT OR UPDATE
      ON t_operations
      FOR EACH STATEMENT
      EXECUTE PROCEDURE test5();

    Voici le code de la fonction trigger :

    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
    declare curs_operations cursor IS select ope_cpt from t_operations;
    declare test varchar;
     
    begin
    --test = fetch 0 from curs_operations
    --fetch from curs_operations
    --open curs_operations ;
    open curs_operations ;
     
    fetch last from curs_operations into test;
    insert into t_soldes
    values (default,
    (select ope_cpt from t_operations, t_comptes where ope_cpt=test),
    (select sum(ope_cre) from t_operations,t_comptes where ope_val='TRUE' and cpt_num=test),
    (select sum(ope_deb) from t_operations,t_comptes where ope_val='TRUE' and cpt_num=test),
    (select coalesce(sum(ope_cre),'0.00') from t_operations,t_comptes where ope_val='FALSE' and cpt_num=test),
    (select coalesce(sum(ope_deb),'0.00') from t_operations,t_comptes where ope_val='FALSE' and cpt_num=test),
    (select sum(ope_cre)-sum(ope_deb) from t_operations,t_comptes where ope_val='TRUE' and cpt_num=test)
    );
        --return test;
        close curs_operations;
     
    --fin
    return new;
    end;

    J’ai un message comme quoi il est renvoyé trop de résultats.
    En lieu et place de LAST j’ai mis aussi FORWARD 0 et BACKWARD 0 qui devrait selon la documentation renvoyer l’enregistrement courant.
    J’ai fait aussi : fetch curs_operations into test;
    C’est le même résultat.

    merci.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Supposons un INSERT sur t_operations mais c'est pareil sur UPDATE.

    Dans le trigger on a automatiquement:
    NEW.ope_num = numéro d'oprération
    NEW.ope_cpt = opération sur le compte n
    pareil pour les autres colonnes

    donc au lieu de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into t_soldes
    values (default,
    (select ope_cpt from t_operations, t_comptes where ope_cpt=test),
    (select sum(ope_cre) from t_operations,t_comptes where ope_val='TRUE' and cpt_num=test),
    (select sum(ope_deb) from t_operations,t_comptes where ope_val='TRUE' and cpt_num=test),
    on va faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into t_soldes
    values (default, 
    NEW.ope_cpt,
    (select sum(ope_cre) from t_comptes where ope_val='TRUE' and cpt_num=NEW.ope_cpt),
    (select sum(ope_deb) from t_comptes where ope_val='TRUE' and cpt_num=NEW.ope_cpt),
    etc...
    Pas de curseur pour accéder à la ligne insérée parce qu'elle est dans NEW.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Résolu merci
    Merci pour votre aide, cela fonctionne.
    Il restait un message d'erreur : l'enregistrement "NEW" n'est pas encore affecté.

    j'ai modifié dans la déclaration du trigger:

    par :

    Merci encore.

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

Discussions similaires

  1. Erreur retour de valeur !!
    Par mana12 dans le forum C++
    Réponses: 1
    Dernier message: 24/06/2006, 12h12
  2. [VB.NET] Retour de valeur
    Par krfa1 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/05/2006, 09h32
  3. PB de retour de valeur dans formulaire
    Par Poutchou dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 05/04/2006, 16h10
  4. retour de valeur
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/09/2005, 16h20
  5. [IB] [trigger+generator] récup dernière valeur générée ?
    Par fred64 dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/05/2004, 00h38

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