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

Développement SQL Server Discussion :

Trigger non exécuté lors d'une requête INSERT [2008R2]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Trigger non exécuté lors d'une requête INSERT
    Bonjour à tous et bonne année.

    J'ai fait une interface qui me permet de générer un fichier d'import pour le module Gestion Commerciale version 8.01 afin de générer des factures client, le fichier est importé, mais cependant, j'ai mis un trigger sur les tables F_DOCENTETE et sur F_DOCLIGNE lors de l'insertion, aucun des 2 triggers ne s'active.

    Je vous met le trigger que j'ai en place sur la table F_DOCENTETE, le but consiste à modifier la valeur du champ DO_REF uniquement si ce dernier contient la chaine {LIMOG} :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    ALTER TRIGGER [dbo].[GMT_ADD_F_DOCENTETE] 
       ON  [dbo].[F_DOCENTETE]
       AFTER INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
    	declare @date smalldatetime
    	declare @upd smallint=0
    	declare @refFacture varchar(17)
            declare @cbmarq int,@dotype int,@domaine int, @provenance int
    	declare @mois int, @annee int
    	declare @anneeSTRING varchar(4)
     
    	select @cbmarq=cbmarq,@dotype=do_type, @domaine=do_domaine, @refFacture=DO_REF, @provenance=DO_Provenance, @date=DO_Date FROM inserted
     
    	exec CB_SendMessage @@SPID, @cbmarq
     
    	--si je ne suis pas une facture cliente, je ne fais pas de traitement
    	if @domaine=0 and @dotype=6 and @provenance=0
    		begin
    			if @refFacture like '% {LIMOG}'
    				begin
    					set @upd=1
    					set @mois=MONTH(@date)
    					set @annee=YEAR(@date)
    					set @anneeSTRING=@annee
    					set @anneeSTRING=RIGHT(@anneeSTRING,2)
     
    					if @mois=1
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','JAN '+@anneeSTRING))
     
    					if @mois=2
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','FEV '+@anneeSTRING))
     
    					if @mois=3
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','MAR '+@anneeSTRING))
     
    					if @mois=4
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','AVR '+@anneeSTRING))
     
    					if @mois=5
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','MAI '+@anneeSTRING))
     
    					if @mois=6
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','JUI '+@anneeSTRING))
     
    					if @mois=7
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','JUI '+@anneeSTRING))
     
    					if @mois=8
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','AOU '+@anneeSTRING))
     
    					if @mois=9
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','SEP '+@anneeSTRING))
     
    					if @mois=10
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','OCT '+@anneeSTRING))
     
    					if @mois=11
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','NOV '+@anneeSTRING))
     
    					if @mois=12
    						set @refFacture=(select replace(@refFacture,'{LIMOG}','DEC '+@anneeSTRING))
    				end
     
    			if @upd=1
    				update dbo.F_DOCENTETE set do_ref=@refFacture 
    				FROM dbo.F_DOCENTETE Y
    				join inserted I on I.cbmarq=Y.cbmarq
    		end
    	END

    Dans mon code, j'ai également ajouté
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec CB_SendMessage @@SPID, @cbmarq
    , histoire de voir si le trigger est exécuté, rien ne s'affiche à l'écran.

    Auriez-vous des idées de comment résoudre cela?

    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 002
    Billets dans le blog
    6
    Par défaut
    1) Le code de votre déclencheur n'est pas ensembliste
    2) Un déclencheur n'affiche rien
    3) Vous utilisez mal les alias de table dans l'UPDATE
    4) vous utilisez des variables qui servent à rien (@upd)...

    Voici grosso modo votre trigger récrit correctement !

    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
    ALTER TRIGGER [dbo].[GMT_ADD_F_DOCENTETE] 
       ON  [dbo].[F_DOCENTETE]
       AFTER INSERT
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    *
    UPDATE Y
    SET   do_ref = CASE MONTH(DO_Date)
                     WHEN 1 THEN replace(DO_REF,'{LIMOG}','JAN '+ RIGHT(CAST(YEAR(DO_Date) AS varchar(4)),2))
                     WHEN 2 THEN replace(DO_REF,'{LIMOG}','FEV '+ RIGHT(CAST(YEAR(DO_Date) AS varchar(4)),2))
                     WHEN 3 THEN replace(DO_REF,'{LIMOG}','MAR '+ RIGHT(CAST(YEAR(DO_Date) AS varchar(4)),2))
                     -- ... à compléter !!!
                   END
    FROM  dbo.F_DOCENTETE AS Y
    		JOIN inserted AS I 
               ON I.cbmarq=Y.cbmarq
    WHERE  do_domaine=0 
      and  do_type=6 
      and  DO_Provenance=0
      AND  DO_REF like '% {LIMOG}';
     
    END;
    Offrez-vous une formation ou lisez notre livre au moins :
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 381
Taille : 105,0 Ko

    A + et bonne année
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Mon développement est pour un client qui est sur divers sites, pour l'instant, 2 sites différents, et selon le site, la désignation ne sera pas formatée de la même manière.
    Dans le cas que j'ai présenté, il fallait que dans la référence je trouve les 3 caractères du mois de la facture générée et les 2 derniers chiffres de l'année.
    J'ai un autre cas dans lequel je devrais dire, toujours dans la référence, qu'il s'agit numéro 1 d'une série de 6 factures (ces factures proviennent d'un abonnement), la suivante sera la numéro 2 et ainsi de suite, d'où l'utilité d'une variable qui me dit si je peux ou non exécuter ma requête de mise à jour.

    J'ai refait des tests, il s'est avéré que lors de l'import, les triggers sont désactivés. Je me suis informé en interne, mon projet consiste en réalité à importer des abonnements clients (d'où ma confusion), puis de lancer depuis l'ERP le processus de génération des factures, et c'est justement lors de la génération des factures que les triggers sont activés.

    J'ai déjà regardé les triggers sur la table F_DOCLIGNE mais la mise à jour ne se fait pas du tout, bien qu'en lançant une trace, j'arrive à voir que le trigger est exécuté.
    J'ai alors contacté le service SAGE qui m'a donné une réponse assez étonnante, les triggers sur la table F_DOCLIGNE exécutent le code du traitement non pas lors de l'insertion, mais lors de la mise à jour!!!!

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

Discussions similaires

  1. TRIGGER d'insertion après une requête INSERT
    Par nasimpat7 dans le forum Développement
    Réponses: 11
    Dernier message: 06/04/2009, 15h45
  2. Réponses: 3
    Dernier message: 27/03/2008, 11h49
  3. Réponses: 11
    Dernier message: 17/01/2008, 18h53
  4. Lors de l'ajout/supp d'un tuple : exécution auto d'une requête
    Par Tentative dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/01/2007, 18h08
  5. [Trigger] Erreur 1136 lors d'une insertion
    Par tyrant dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/05/2006, 21h41

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