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 :

Double insertion trigger


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 150
    Points : 65
    Points
    65
    Par défaut Double insertion trigger
    Bonjour j'ai créé un trigger qui lors de la modification d'un champ d'une ligne créé une nouvelle ligne.
    Seulement je lui dit de me faire qu'une insertion mais il m'en fait deux.
    Voila mon 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
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TRIGGER PassageBF ON [dbo].[F_DOCLIGNE] 
    FOR  UPDATE
    AS
    DECLARE @PasseBF NUMERIC(13), @Qte NUMERIC(13),@Type SMALLINT,@Piece VARCHAR(9) ,@DL_No INTEGER,@QteAvant NUMERIC(13),@Test INTEGER,@sens SMALLINT,@DO_Piece VARCHAR(9),@NbLigne INTEGER,
    @CHAR_DO_Piece_bis	CHAR(1),
    @CHAR_DO_Piece CHAR(1),-- Caractère pour ajout au n° de pièce
    @CHAR_DO_Piece4 CHAR(1),
    @CHAR_DO_Piece3 CHAR(1),
    @CHAR_DO_Piece2 CHAR(1),
    @CHAR_DO_Piece1 CHAR(1),@cbMarq INTEGER
    SELECT @Type=DO_Type,@PasseBF=PassageBF,@Qte=DL_Qte,@Piece=DO_Piece,@DL_No=DL_No,@sens=DL_MvtStock FROM Inserted
    SELECT @QteAvant=DL_Qte FROM Deleted
     
     
     
    Set @Test=0
    IF @Type=25
    BEGIN
    	IF @sens=0
    	BEGIN		
    		UPDATE F_DOCLIGNE SET DL_Qte=(DL_Qte*@Qte)/@QteAvant  FROM F_DOCLIGNE WHERE DO_Piece=@Piece AND 
    DL_MvtStock=3
    		Set @NbLigne=@@rowcount
     
    		--Calculer Nouveau DO_Piece
    		IF @Piece=NULL 
    		BEGIN
    			Raiserror('Le No_Pièce est NULL',16,1)
    		END
    		IF LEN(@Piece)>=10 
    		BEGIN
    			Raiserror('Le numéro de pièce ne peut être incrémenté',16,1)
    		END
     
    		SELECT @CHAR_DO_Piece_bis = RIGHT(LEFT(MAX(DO_Piece),8),1)--Récupere le chiffre qui va falloir incrementer
    		FROM F_DOCENTETE 
    		WHERE DO_Type=25
     
    		SELECT @CHAR_DO_Piece = LEFT(RIGHT(MAX(DO_Piece),2),1)--Récupere le chiffre qui va falloir incrementer
    		FROM F_DOCENTETE 
    		WHERE DO_Type=25
     
    		SELECT @CHAR_DO_Piece1 = LEFT(RIGHT(MAX(DO_Piece),3),1) --Récupere le nombre à rajouter en cas de test 1
    		FROM F_DOCENTETE 
    		WHERE DO_Type=25
     
    		SELECT @CHAR_DO_Piece2 = LEFT(RIGHT(MAX(DO_Piece),4),1) --Récupere le nombre à rajouter en cas de test 1
    		FROM F_DOCENTETE 
    		WHERE DO_Type=25
     
    		SELECT @CHAR_DO_Piece3 = LEFT(RIGHT(MAX(DO_Piece),5),1) --Récupere le nombre à rajouter en cas de test 1
    		FROM F_DOCENTETE 
    		WHERE DO_Type=25
     
    		SELECT @CHAR_DO_Piece4 =LEFT(RIGHT(MAX(DO_Piece),6),1) --Récupere le nombre à rajouter en cas de test 1
    		FROM F_DOCENTETE 
    		WHERE DO_Type=25 
     
    		-- Pour Info 'A' = 65 ; 'Z' = 90 ; 'a' = 97 ; 'z' = 122
    		-- Recherche de la lettre suivante
    		IF @CHAR_DO_Piece_bis IS NULL
    		BEGIN
    			SET @CHAR_DO_Piece_bis = '0' -- si pas de lettre initialise à 0
    		END
    		ELSE
    		BEGIN
    		-- incrémente la lettre
    			IF (ASCII(@CHAR_DO_Piece_bis) >= 47
    				AND ASCII(@CHAR_DO_Piece_bis) < 57) -- Verifie qu'une lettre existe*/
    			BEGIN
    				SET @CHAR_DO_Piece_bis = CHAR(ASCII(@CHAR_DO_Piece_bis) + 1)
    			END
    			ELSE		
    			BEGIN
    	 		-- incrémente la lettre
    				IF (ASCII(@CHAR_DO_Piece) >= 47 AND ASCII(@CHAR_DO_Piece) < 57) -- Verifie qu'une lettre existe*/
    				BEGIN
    					SET @CHAR_DO_Piece = CHAR(ASCII(@CHAR_DO_Piece) + 1)
    					SET @CHAR_DO_Piece_bis = '0'
    				END
    				ELSE
    				BEGIN
    				IF (ASCII(@CHAR_DO_Piece1) >= 47 AND ASCII(@CHAR_DO_Piece1) < 57) -- Verifie qu'une lettre existe*/
    				BEGIN
    					SET @CHAR_DO_Piece1 = CHAR(ASCII(@CHAR_DO_Piece1) + 1)
    					SET @CHAR_DO_Piece = '0'
    					SET @CHAR_DO_Piece_bis = '0'
    				END
    				ELSE 
    				BEGIN
    					IF (ASCII(@CHAR_DO_Piece2) >= 47 AND ASCII(@CHAR_DO_Piece2) < 57)
    					BEGIN
    						SET @CHAR_DO_Piece2 = CHAR(ASCII(@CHAR_DO_Piece2) + 1)
    						SET @CHAR_DO_Piece1 = '0'
    						SET @CHAR_DO_Piece = '0'
    						SET @CHAR_DO_Piece_bis = '0'
    					END
    					ELSE
    					BEGIN
    						IF (ASCII(@CHAR_DO_Piece3) >= 47 AND ASCII(@CHAR_DO_Piece3) < 57)
    						BEGIN
    							SET @CHAR_DO_Piece3 = CHAR(ASCII(@CHAR_DO_Piece3) + 1)
    							SET @CHAR_DO_Piece2 = '0'
    							SET @CHAR_DO_Piece1 = '0'
    							SET @CHAR_DO_Piece = '0'
    							SET @CHAR_DO_Piece_bis = '0'
    						END
     
    						BEGIN -- toutes les lettres ont été utilisées
    								RAISERROR ('Impossible de Numéroter cette pièce1',16,1)
    						END
    					END
    				END
    			END
    		END
    	END 	
    	SET @DO_Piece ='OF'+ @CHAR_DO_Piece3 + @CHAR_DO_Piece2+@CHAR_DO_Piece1 + @CHAR_DO_Piece +@CHAR_DO_Piece_bis	--@DO_PieceOrigine+@CHAR_DO_Piece 
    	IF @DO_Piece IS NULL
    	BEGIN
    		RAISERROR('Le do_Piece est null',16,1)
    	END 
    	-- Valeur de cbMarq
    	SELECT @cbMarq = MAX([cbMarq]+1)
    	FROM [F_DOCENTETE]
     
    --Insertion ENTETE
    	INSERT INTO [F_DOCENTETE] 
      	([DO_Domaine],[DO_Type],[DO_Piece],[DO_Date],[DO_Ref],[DO_Tiers],
    	[RE_No],[cbRE_No],[DO_Period],[DO_Devise],[DO_Cours],[DE_No],
    	[cbDE_No],[LI_No],[cbLI_No],[CT_NumPayeur],[DO_Expedit],
    	[DO_NbFacture],	[DO_BLFact],[DO_TxEscompte],[DO_Reliquat],[DO_Imprim],
    	[CA_Num],[DO_Coord01],[DO_Coord02],[DO_Coord03],[DO_Coord04],
    	[DO_Souche],[DO_DateLivr],[DO_Condition],[DO_Tarif],[DO_Colisage],
    	[DO_TypeColis],	[DO_Transaction],[DO_Langue],[DO_Ecart],[DO_Regime],
    	[N_CatCompta],[DO_Ventile],[AB_No],[DO_DebutAbo],[DO_FinAbo],
    	[DO_DebutPeriod],[DO_FinPeriod],[CG_Num],[DO_Statut],[DO_Heure],
    	[CA_No],[cbCA_No],[RE_NoCaissier],[cbRE_NoCaissier],[DO_Transfere],
    	[DO_Cloture],[DO_NoWeb],[DO_Attente],[DO_Provenance],[cbProt],
    	/*[cbMarq],*/[cbCreateur],[cbModification],[cbReplication],[cbFlag])
    	SELECT 
    	[DO_Domaine],[DO_Type],	@DO_Piece,[DO_Date],[DO_Ref],[DO_Tiers],
    	[RE_No],[cbRE_No],[DO_Period],[DO_Devise],[DO_Cours],[DE_No],
    	[cbDE_No],[LI_No],[cbLI_No],[CT_NumPayeur],[DO_Expedit],
    	[DO_NbFacture],[DO_BLFact],[DO_TxEscompte],[DO_Reliquat],
    	[DO_Imprim],[CA_Num],[DO_Coord01],[DO_Coord02],[DO_Coord03],
    	[DO_Coord04],[DO_Souche],[DO_DateLivr],[DO_Condition],[DO_Tarif],
    	[DO_Colisage],[DO_TypeColis],	[DO_Transaction],[DO_Langue],
    	[DO_Ecart],[DO_Regime],[N_CatCompta],[DO_Ventile],[AB_No],
    	[DO_DebutAbo],[DO_FinAbo],[DO_DebutPeriod],[DO_FinPeriod],[CG_Num],
    	[DO_Statut],[DO_Heure],[CA_No],[cbCA_No],[RE_NoCaissier],
    	[cbRE_NoCaissier],[DO_Transfere],[DO_Cloture],[DO_NoWeb],[DO_Attente],
    	[DO_Provenance],[cbProt],/*@cbMarq,*/[cbCreateur],[cbModification],
    	[cbReplication],[cbFlag]
    	FROM [F_DOCENTETE]
    	WHERE [DO_Piece] = @Piece
     
    --Insertion Ligne avec boucle tant que	
    	END
    END
    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 150
    Points : 65
    Points
    65
    Par défaut
    C'est bon résolu. J'ai mis deux commit. Un après le UPDATE et un après l'insertion et j'ai aussi effectué un test sur la colonne que je modifie.

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

Discussions similaires

  1. [MySQL] double Insert
    Par cyrill.gremaud dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/03/2007, 11h13
  2. débutant: ne pas exécuter une insertion (trigger) ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/09/2006, 16h35
  3. Eviter la double insertion en rafraichissant la page
    Par p0Kep0K dans le forum Langage
    Réponses: 8
    Dernier message: 08/06/2006, 14h10
  4. [MySQL] Problème double insertion dans BDD
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 34
    Dernier message: 28/12/2005, 00h09
  5. pb double insertion dans BDD
    Par oceane751 dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/12/2005, 09h59

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