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

PL/SQL Oracle Discussion :

Maj par trigger


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 19
    Par défaut Maj par trigger
    Bonjour à tous et d'avance merci à eux qui pourront m'aider.
    Je vous explique mon problème :
    J'ai 2 tables :
    - 1 table T_Fournissseurs
    - 1 table T_Factures

    La table T_Fournisseurs a 1 colonne "nb_factures"

    Ma question est simple : comment puis-je compter le nombre total de facture pour un fournisseur donné au moment de la validation d'une nouvelle facture dans la table T_Facture ?

    J'a voulu faire un trigger AFTER sur la table T_Factures
    Extrait du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select count(*) into nCount from T_Facture where id_fournisseur = :old.id_fournisseur;
    update T_Fournisseur set nb_facture = nCount where id_fournisseur = :old.id_fournisseur;
    Mais j'ai l'erreur oracle de la table en mutation car je veux lire la table T_Factures qui vient d'être mise à jour alors que mon trigger est de type AFTER.

    Je ne comprend pas.

    Connaissez-vous une meilleur solution ?

    Merci

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    une recherche sur le forum devrait t'apporter des éléments, un sujet a été l'objet d'un long débat pas plus tard que la semaine dernière

    PS : le code du trigger serait nettement plus intéressant avec les balises ad hoc

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 72
    Par défaut Ecrit une procédure
    Utilise une procédure ou une fonction (tu pourras utiliser cette derniere dans une requète) qui se chargera
    1) de l'insertion dans la table T_FACTURE
    2) de la mise à jour du compteur dans la table T_FOURNISSEUR.

    Sinon, tu peux aussi utiliser une vue sur la table T_FOURNISSEUR de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace view V_FOURNISSEUR as 
    select 
        id_fournisseur as id_fournisseur,
        (select count(*) 
            from T_FACTURE FA 
            where FA.id_fournisseur = FO.id_fournisseur) as nb_facture
    from T_FOURNISSEUR FO ;
    Elle marche

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 19
    Par défaut
    Merci de ta réponse olive-andré mais l'insert se fait via le navigateur WEB.

    La vue ne m'apportera rien car la colonne nb_facture est sujet à des calculs à d'autres moments.

    Merci

    L'idée de la procédure est intéressante
    Je vais y travailler

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Il suffit de gérer tous les cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IF INSERTING
    THEN
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) + 1 WHERE id_fournisseur = :NEW.id_fournisseur;
    ELSIF DELETING
    THEN
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) - 1 WHERE id_fournisseur = :OLD.id_fournisseur;
    ELSIF UPDATING AND :OLD.id_fournisseur <> :NEW.id_fournisseur
    THEN
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) - 1 WHERE id_fournisseur = :OLD.id_fournisseur;
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) + 1 WHERE id_fournisseur = :NEW.id_fournisseur;
    END IF;
    Edit c'est un trigger BEFORE INSERT OR UPDATE OR DELETE FOR EACH ROW

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 19
    Par défaut
    Citation Envoyé par McM Voir le message
    Il suffit de gérer tous les cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IF INSERTING
    THEN
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) + 1 WHERE id_fournisseur = :NEW.id_fournisseur;
    ELSIF DELETING
    THEN
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) - 1 WHERE id_fournisseur = :OLD.id_fournisseur;
    ELSIF UPDATING AND :OLD.id_fournisseur <> :NEW.id_fournisseur
    THEN
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) - 1 WHERE id_fournisseur = :OLD.id_fournisseur;
    	UPDATE T_Fournisseur SET nb_facture = NVL(nb_facture,0) + 1 WHERE id_fournisseur = :NEW.id_fournisseur;
    END IF;
    Edit c'est un trigger BEFORE INSERT OR UPDATE OR DELETE FOR EACH ROW
    Je vais tenter cette solution.
    Je vous tiens au courant

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Je ne sais plus pourquoi mais il me semble qu’il faut ajouter aussi une contrainte sur la table facture. Mais j’ai du mal à me rappeler pourquoi

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 72
    Par défaut
    je ne sais pas ce que tu entends par
    Citation Envoyé par RSI06 Voir le message
    La vue ne m'apportera rien car la colonne nb_facture est sujet à des calculs à d'autres moments.
    mais, pourquoi dans le code de ton trigger tu ne calcules juste pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T_Fournisseur SET nb_facture = nCount WHERE id_fournisseur = :old.id_fournisseur;
    penses aussi à soustraire les factures que tu détruits, etc....

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 72
    Par défaut

    Désolé, MCM a tiré plus vite que moi ....

  10. #10
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut

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

Discussions similaires

  1. modification d'un champs par trigger
    Par witch dans le forum SQL Procédural
    Réponses: 17
    Dernier message: 06/10/2007, 19h50
  2. Clefs primaires assignées par trigger
    Par Costalfy dans le forum Hibernate
    Réponses: 8
    Dernier message: 10/08/2007, 11h59
  3. RAISE_APPLICATION_ERROR + INSERT déclenchés par trigger
    Par petit_crabe dans le forum PL/SQL
    Réponses: 2
    Dernier message: 26/06/2007, 15h11
  4. maj par innerHTML -> pas de back
    Par Bruno2000 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/06/2006, 11h22
  5. id autoincrémenté par trigger
    Par dumser1 dans le forum Développement
    Réponses: 4
    Dernier message: 08/02/2006, 13h54

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