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 :

Bloc Catch Trigger


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2018
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Octobre 2018
    Messages : 87
    Points : 51
    Points
    51
    Par défaut Bloc Catch Trigger
    Bonjour,
    Je suis entrain de développer un trigger pour une base Sage L100, le fonctionnement de trigger est qu'il interdit l'ajout ou la modification d'une ligne de document (dans une table F_DOCLIGNE) si la date de ce dernier est hors période de saisie autorisé.
    le problème est qu'au niveau d'update Sage, avant de valider la transaction de modification de ligne, il met à jour la table de stock (F_ARTSTOCK) et il comite la transaction de telle sorte si mon trigger de la table de ligne de document lance un rollback je me trouve en situation de désynchronisation entre la table de stock la table des mouvements.
    la seule solution que j'ai trouvé et de lancer un update sur la table de stock dans le bloc catch de mon trigger
    ci dessous les problèmes que j'ai rencontré
    - est ce que dans un bloc catch je peux utiliser les tables inserted et deleted ? j'ai fais quelques vérifications mais je pense que non c'est pour cela j'ai ajouter une variable table avant le rollback
    - bien sur s'il existe des pistes pour améliorer mon code

    Merci

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    ALTER TRIGGER [AP_TG_INS_UPD_F_DOCLIGNE] ON [F_DOCLIGNE]
    WITH   EXECUTE AS OWNER
    FOR INSERT, UPDATE AS
    BEGIN
     
    declare @NBJ_MOINS tinyint = 1;
    declare @NBJ_PLUS tinyint = 1;
    DECLARE @Action as char(1);
     
        SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
                             AND EXISTS(SELECT * FROM DELETED)
                            THEN 'U'  -- Set Action to Updated.
                            WHEN EXISTS(SELECT * FROM INSERTED)
                            THEN 'I'  -- Set Action to Insert.
                            WHEN EXISTS(SELECT * FROM DELETED)
                            THEN 'D'  -- Set Action to Deleted.
                            ELSE NULL -- Skip. It may have been a "failed delete".   
                        END)
     
    BEGIN TRY
      IF UPDATE(cbReplication) 
    	RETURN
    -- les exceptions du trigger :
     
    	-- 1- si le docuement est un BC et que la colonne modifié est DL_QtePL (Qte à livrer) il ne faut 
    	-- déclencher le trigger
    	If EXISTS (SELECT '*'
    			  FROM inserted
    			  WHERE DO_Type =1  )  AND UPDATE(DL_QtePL)
    	BEGIN
     
    			RETURN
    	END
     
    	-- 2- s'il s'agit d'une transformation partielle d'un BC vers n'importe quel type de docuement
    	-- il ne faut pas déclencher le trigger
    		 IF EXISTS (SELECT '*'
    					FROM inserted i
    					INNER JOIN deleted d ON i.DO_Type =d.DO_Type AND i.DO_Piece = d.DO_Piece
    					WHERE i.DO_Type =1
    					AND i.DL_Qte = d.DL_Qte-d.DL_QtePL
    					)
    		BEGIN
    			RETURN
    		END
    -- fin bloc exception
     
     
    	IF EXISTS (SELECT '*'
    				FROM inserted i
     
    		        WHERE CONVERT(date, DATEADD(DAY, -@NBJ_MOINS  , GETDATE())) > i.DO_Date
    				   OR CONVERT(date, DATEADD(DAY, @NBJ_PLUS, GETDATE())) < i.DO_Date )
    	 RAISERROR('La date du document est hors période de saisie.',16,1)
     
    END TRY
    BEGIN CATCH
     
     PRINT error_message()
     
    	DECLARE @t TABLE (AR_Ref varchar(35),
    					 AG_No1 int,
    					 AG_No2 int,
    					 DE_No int)
     
    	INSERT INTO @t (AR_Ref,AG_No1,AG_No2,DE_No)
    	SELECT i.AR_Ref,AG_No1,AG_No2,DE_No
    	FROM inserted i 
     
       ROLLBACK TRANSACTION
     
    	 IF @Action = 'U'
    	 BEGIN
     
    		;with x as (SELECT s.DL_Qte As Cumul_Qte, i.AR_Ref,i.DE_No
    							   FROM @t i
    							   OUTER APPLY dbo.Fnc_StockADate(i.DE_No,'31/12/2021',i.AR_Ref,i.AG_NO1,i.AG_NO2,NULL) s
     
    		 )
    		UPDATE s
    		SET s.AS_QteSto = x.Cumul_Qte
    		 FROM F_ARTSTOCK s
    		 inner join x ON s.AR_Ref = x.AR_Ref AND s.DE_No = x.DE_No
    	END
     
     
    END CATCH
     
    END;
    GO

  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
    21 761
    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 : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Vous pouvez utiliser un déclencheur INSTEAD OF....

    A +
    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/ * * * * *

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/07/2016, 16h06
  2. [Débutant] forcer le passage par le bloc catch
    Par ouinih dans le forum C#
    Réponses: 5
    Dernier message: 15/07/2011, 16h38
  3. [JOptionPane] probleme dans un bloc catch
    Par Balbuzard dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 22/08/2008, 15h59
  4. Réponses: 1
    Dernier message: 15/01/2008, 12h39
  5. Bloc catch non atteint
    Par Cram_N7 dans le forum Langage
    Réponses: 5
    Dernier message: 05/04/2007, 11h23

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