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

VB.NET Discussion :

Utilisation d'un trigger pour faire un delete [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation d'un trigger pour faire un delete
    Bonjour,

    Je voudrais faire un delete dans les tables F_DOCENTETE et F_DOCLIGNE de Sage ligne 100 gestion commerciale, liée à un même numéro, quand je le fais dans la seconde table, je n'ai aucune erreur mais quand je le fais dans F_DOCENTETE, j'obtiens ce message d'erreur, que je ne comprend pas du tout :

    L'erreur*82067, la gravité*11, l'état*1 ont été générés, mais aucun message avec ce numéro d'erreur n'a été trouvé dans sys.messages. Si l'erreur est supérieure à 50000, vérifiez que le message défini par l'utilisateur a été ajouté à l'aide de sp_addmessage.
    Une erreur est survenue lors de l'exécution du déclencheur. Le lot a été abandonné et la transaction utilisateur éventuelle a été restaurée.
    Du coup, je pense que je devrais voir du côté des triggers mais j'ignore totalement comment ça marche.
    Je vous met tout de même la fonction que j'ai implémenté:

    Code VB : 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
        Private Function supprimer_facture(ByVal param_num_facture As String) As Boolean
            Dim cmd As SqlClient.SqlCommand = global_SQL_connection.CreateCommand
            Try
     
                For Each loop_table As String In {"F_DOCLIGNE", "F_DOCENTETE"}
                    If global_SQL_connection.State = ConnectionState.Open Then
                        global_SQL_connection.Close()
                    End If
                    global_SQL_connection.Open()
                    cmd.CommandType = CommandType.Text
                    cmd.CommandText = String.Format("DELETE FROM {0} WHERE DO_PIECE='{1}'", loop_table.Trim, param_num_facture.Trim)
                    cmd.ExecuteNonQuery()
                Next loop_table
     
            Catch ex As Exception
                MsgBox(ex.Message)
                Return False
            End Try
     
            Return True
        End Function

    Merci

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    il faut regarder le code du trigger une ligne du type if condition raiserror (avec le numéro 82067)
    un trigger c'est comme une sub de vb.net, appelée suite à un insert/update/delete (comme un évènement appelle une sub)
    le langage d'sql server s'appelle le transact SQL
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le trigger est défini ainsi:

    Code sql : 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
    USE [BIJOU]
    GO
    /****** Object:  Trigger [dbo].[TG_DEL_F_DOCENTETE]    Script Date: 05/23/2014 11:05:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[TG_DEL_F_DOCENTETE] ON [dbo].[F_DOCENTETE] FOR DELETE AS 
    BEGIN
    	BEGIN TRY
    		SET NOCOUNT ON;
    				IF EXISTS(SELECT 'a' FROM F_DOCLIGNE INNER JOIN DELETED
    						  ON (F_DOCLIGNE.DO_Type = DELETED.DO_Type AND F_DOCLIGNE.cbDO_Piece = DELETED.cbDO_Piece))
    					Raiserror(82043,11,1);
    				IF EXISTS(SELECT 'a' FROM F_DOCREGL INNER JOIN DELETED
    						  ON (F_DOCREGL.DO_Domaine = DELETED.DO_Domaine AND F_DOCREGL.DO_Type = DELETED.DO_Type AND
    							  F_DOCREGL.cbDO_Piece = DELETED.cbDO_Piece))
    					Raiserror(82067,11,1);
    				IF EXISTS(SELECT 'a' FROM F_REGLECH INNER JOIN DELETED
    						  ON (F_REGLECH.DO_Domaine = DELETED.DO_Domaine AND F_REGLECH.DO_Type = DELETED.DO_Type AND
    							  F_REGLECH.cbDO_Piece = DELETED.cbDO_Piece))
    					Raiserror(82076,11,1);
     
    	END TRY
    	BEGIN CATCH
    		DECLARE
    			@ErrorMessage nvarchar(max),
    			@ErrorNumber int,
    			@ErrorSeverity int,
    			@ErrorState int;
     
    		SET @ErrorMessage = ERROR_MESSAGE();
    		SET @ErrorNumber = ERROR_NUMBER();
    		SET @ErrorSeverity = ERROR_SEVERITY();
    		SET @ErrorState = ERROR_STATE();
    		IF XACT_STATE() <> 0
    			ROLLBACK;
    		IF (@ErrorNumber = 1205) OR (@ErrorNumber = 1222)
    			RAISERROR(80008,@ErrorSeverity,@ErrorState);
    		ELSE
    		IF @ErrorNumber > 50000
    			RAISERROR(@ErrorNumber,@ErrorSeverity,@ErrorState);
    		ELSE
    			RAISERROR(@ErrorMessage,@ErrorSeverity,@ErrorState);
    		RETURN;
    	END CATCH;
    END;

  4. #4
    Invité
    Invité(e)
    Par défaut
    En arrivant sur ce lien, j'ai pu trouver la réponse à mon soucis, l'utilisation d'un trigger est obsolète, j'ai simplement remplacé
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each loop_table As String In {"F_DOCLIGNE", "F_DOCENTETE"}
    par
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each loop_table As String In {"F_DOCLIGNE", "F_DOCREGL", "F_REGLECH", "F_DOCENTETE"}

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/07/2009, 21h10
  2. Réponses: 2
    Dernier message: 17/02/2009, 20h26
  3. Utilisation du mème trigger pour plusieurs PS
    Par Stouille33 dans le forum Développement
    Réponses: 2
    Dernier message: 17/10/2008, 09h18
  4. Utilisation d'un thread pour faire une pause.
    Par ropabo dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 11/06/2006, 14h28
  5. Trigger pour faire une table "mirroir"
    Par lgomez dans le forum Oracle
    Réponses: 8
    Dernier message: 26/10/2005, 13h12

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