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

SQL Procédural MySQL Discussion :

Trigger, insert en fonction d'un premier select


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2
    Par défaut Trigger, insert en fonction d'un premier select
    Bonjour @ tous,

    Je débute avec les triggers et j'ai un souci avec un cas particulier :

    Je bosse sur 4 tables, sur un trigger BEFORE INSERT d'une de mes tables je dois aller récupérer des infos dans 2 autres tables pour les insérer.
    Le problème c'est que je dois d'abord récupérer un critère dans une table (Affilies) et en fct de cette valeur je vais taper dans une table ou dans l'autre pour récupérer mes valeurs à inserer via mon trigger :

    Mes 4 tables:

    - Factures
    - Affilies
    - Aff_RIB
    - Aff_MON

    Je dois d'abord récupérer "Moyen_paiement" dans la table Affilies et en s'il vaut 1 je fait un select dans Aff_RIB, s'il vaut 2 je fais un select dans Aff_MON, et dans les deux cas j'insère les valeurs récupérer dans "Factures" (là ou j'ai mon trigger).

    En gros donc quand je créé une facture (trigger insert dans "factures") pour un affilié je veux récupérer automatiquement les informations nécessaires au moyen de paiement (RIB ou Moneyteller), cette info est précisé dans la table Affilies dans le champ "Moyen_paiement".
    Si Affilies.Moyen_paiement = 1 -> je prend les infos dans Aff_RIB et j'insère dans factures.
    Si Affilies.Moyen_paiement vaut 2 -> je prend les infos dans Aff_RIB et j'insère dans factures.

    Voici mon code (BEFORE INSERT ON Factures):

    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
     
    BEGIN
     
    	DECLARE cur_rib_tit_adresse, cur_rib_banq_adresse TINYTEXT;
    	DECLARE cur_rib_num, cur_rib_iban, cur_rib_bic VARCHAR(200);
    	DECLARE moyen_paiement TINYINT(1);
    	DECLARE cur_mp_rib CURSOR FOR
    		SELECT
    			UPPER(CONCAT(TIT_DOM,"\n", TIT_ADRESSE,"\n", TIT_CP,"\n", TIT_VILLE,"\n", TIT_PAYS)) as rib_tit_adresse,
    			CONCAT(RIB_DOM,"\n", RIB_ADRESSE,"\n", RIB_CP,"\n", RIB_VILLE,"\n", RIB_PAYS) as rib_banq_adresse,
    			RIB_NUM,
    			IBAN,
    			RIB_BIC
    		FROM Affilies_RIB 
    		WHERE Affilies_RIB.ID_Sup = NEW.fac_ida;
     
     
    	SELECT Moyen_paiement INTO moyen_paiement FROM Affilies WHERE Affilies.ID_Sup = NEW.fac_ida;
     
    	IF moyen_paiement = 1 THEN
    	BEGIN
    		OPEN cur_mp_rib;
    		FETCH cur_mp_rib INTO cur_rib_tit_adresse, cur_rib_banq_adresse, cur_rib_num, cur_rib_iban, cur_rib_bic;
    		SET NEW.fac_rib_tit_adresse = cur_rib_tit_adresse,
    			NEW.fac_rib_banq_adresse = cur_rib_banq_adresse,
    			NEW.fac_rib_num = cur_rib_num,
    			NEW.fac_rib_iban = cur_rib_iban,
    			NEW.fac_rib_bic = cur_rib_bic;
    		CLOSE cur_mp_rib;
    	ELSE
    		... un autre curseur identique pour récupérer les infos dans Aff_MON ...
    	END IF;
     
    END
    Mon problème c'est qu'a priori je ne rentre pas dans IF moyen = 1 ...
    Impossible de savoir si j'ai bien fait les choses, et si ma variable est bien remplie ... je passe toujours dans le ELSE dès que j'insère une ligne dans Factures ...

    Quelqu'un voit d'où vient le problème ?
    J'utilise des curseurs mais je ne sais pas si c'est la meilleure solution ?

    bref, si vous avez des conseils je suis preneur !!
    Je précise que le trigger passe bien et ne génère aucune erreur ...

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    Pour débugger, il est indispensable que tu saches quelle valeur prend ton moyen_paiement. Pour cela, le plus simple est encore de le mettre dans une table ad hoc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE debug
    SELECT moyen_paiement ;
    Sinon, il est effectivement inutile de faire un trigger pour récupérer une seule valeur. Tu peux utiliser une sous-requête scalaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET variable = (SELECT...) ;
    ou bien un INTO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT colonne INTO variable FROM...
    Enfin, les BEGIN... END sont inutiles dans un THEN ou un ELSE.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/02/2014, 16h31
  2. [SQL2008][SQL2012] Trigger, Inserted dans la fonction EXEC
    Par Donpi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/02/2013, 18h03
  3. [TSQL] trigger inserted
    Par mous33 dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 31/10/2007, 13h46
  4. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  5. trigger insert entre 2 serveurs
    Par Shabata dans le forum Développement
    Réponses: 5
    Dernier message: 27/05/2004, 12h00

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