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é en Gescom 16.90 [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut Trigger non exécuté en Gescom 16.90
    Bonjour,

    Suite à la migration chez un client de la gescom en version 16.90, un trigger qui a été fait en interne ne s'exécute plus, le trigger dont il est question s'enclenchait lors de la mise à jour dans la table F_ARTSTOCK.

    J'ai commenté une partie du code, même le code présent ne se lance pas :

    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
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[MAJPRIXACHAT] 
    ON [dbo].[F_ARTSTOCK] 
    FOR UPDATE
    AS
    begin
    SET NOCOUNT ON
     
    DECLARE @article 	     	VARCHAR(50)
    DECLARE @QteStock        	FLOAT
    DECLARE @ValeurStock	FLOAT
    DECLARE @monSQL 		VARCHAR(2000)
    DECLARE @CoefVen		FLOAT
    DECLARE @PrixPublic		FLOAT
    DECLARE @CoefConversion	FLOAT
    IF UPDATE(AS_MontSto)
     
       BEGIN
     
    	SELECT @article 	= AR_REF 		from inserted
    	SELECT @QteStock  	= AS_QteSto	 	from inserted
    	SELECT @ValeurStock	= AS_MontSto	from inserted
     
    UPDATE dbo.F_ARTICLE SET AR_PrixAch=90, AR_Coef=1.3, AR_PrixVen=117 WHERE ltrim(rtrim(AR_REF))='ACC63061001';
     
       END
    end
    Auriez-vous des idées?

    Quand j'exécute la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT name, is_disabled FROM sys.triggers
    Le champ is_disabled a la valeur 0 par rapport à ce trigger.

    Merci

    PS: après vérifications, le trigger est bel est bien lancé, mais les différentes requêtes UPDATE semblent donner aucun résultat, par contre, si j'exécute les requêtes UPDATE dans un batch, ça marche
    Dernière modification par Invité ; 17/08/2016 à 17h36.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    A froid, le mode auto-commit n'aurait-il pas changé ?

    Que se passe-t-il si tu rajoute un "commit" dans ton trigger ?

    Aucune certitude que ça marche avec SQL Server. Mais sous Oracle c'est une erreur classique : tout marche bien, mais tout est rollbacké en fin de trigger

    Bon, visiblement, après tests, il aime pas trop le commit au milieu du trigger.
    Mais je retrouve plus le paramètre auto-commit... Il a été supprimé ? Je suis certain que sur une ancienne version (2000, 2005 ?) il existait bien...
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Sinon, en relisant rapidement ton trigger, je vois plusieurs choses :

    AS_MontSto est-elle toujours la colonne mise à jour par le programme ? En effet, d'une version à l'autre, peut-être que cette colonne a été abandonnée au profit d'une nouvelle d'un autre type ? C'est le truc typique des éditeurs : on modifie pas l'existant, mais on rajoute des colonnes sans rien dire à personne et y'a plus rien qui marche après. Vu que ton type est un FLOAT, ça ne m'étonnerait pas du tout qu'ils soient passés à un DECIMAL à la place, qui ne fait pas d'erreurs de calcul (au prix d'une légère dégradation des performances cependant).

    Ensuite, tu fais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT @article 	= AR_REF 		from inserted
    SELECT @QteStock  	= AS_QteSto	 	from inserted
    SELECT @ValeurStock	= AS_MontSto	from inserted
    Soit 3 requêtes... Alors que tu peux n'en faire qu'une seule :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT @article = AR_REF, @QteStock = AS_QteSto, @ValeurStock = AS_MontSto from inserted
    Ce qui est moins coûteux...

    Ensuite, que se passe-t-il si tu fais :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update F_ARTSTOCK set AS_MontSto = AS_MontSto + 1
    => Moi je vais te le dire : ton trigger plante en flames et empêche la requête ^^

    En effet, INSERTED n'est pas une LIGNE, mais une TABLE.
    Donc tu tentes de récupérer dans une VARIABLE non pas une colonne d'une ligne, donc une valeur, mais une colonne d'une table, donc une liste de valeurs.
    Ça ne peux pas marcher si ton trigger se déclenche sur une mise à jour de plusieurs lignes à la fois.

    Par conséquent, tu dois réécrire ton trigger comme suit :
    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
     
    ALTER TRIGGER [dbo].[MAJPRIXACHAT] 
    ON [dbo].[F_ARTSTOCK] 
    FOR UPDATE
    AS
    begin
    SET NOCOUNT ON
     IF UPDATE(AS_MontSto)
     BEGIN
    UPDATE a
    SET a.AR_PrixAch = 90, a.AR_Coef = 1.3, a.AR_PrixVen = 117
    FROM dbo.F_ARTICLE a
    inner join inserted i on i.ar_ref;
      END;
    END;
    GO
    => Non seulement ça plante plus, mais en plus ton trigger est plus rapide qu'avec ton approche ligne à ligne.
    On ne jouit bien que de ce qu’on partage.

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

    Citation Envoyé par StringBuilder Voir le message
    Par conséquent, tu dois réécrire ton trigger comme suit :
    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
     
    ALTER TRIGGER [dbo].[MAJPRIXACHAT] 
    ON [dbo].[F_ARTSTOCK] 
    FOR UPDATE
    AS
    begin
    SET NOCOUNT ON
     IF UPDATE(AS_MontSto)
     BEGIN
    UPDATE a
    SET a.AR_PrixAch = 90, a.AR_Coef = 1.3, a.AR_PrixVen = 117
    FROM dbo.F_ARTICLE a
    inner join inserted i on i.ar_ref;
      END;
    END;
    GO
    La requête ne marche pas, j'ai l'erreur suivant :
    Expression de type non booléen spécifiée dans un contexte où une condition est attendue, près de ';'.

    A part ça, j'ai contacté SAGE pour y trouver une solution, ils m'ont donné 2 informations :
    - le problème de mise à jour a été reproduit en version 16.90
    - le test a été concluant en version 8.50, la meilleur des choses à faire serait de migrer notre client en dernière version

    Après, par rapport à tes commentaires, comme j'ai découvert à peine la présence de ce trigger, j'ai préféré éviter de trop retoucher, vu que ça marchait très bien jusqu'en version 16.50, mais merci quand même.

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    inner join inserted i on i.ar_ref on a.ar_ref;

    J'avais oublié un bout de jointure
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. Trigger phpmyadmin non exécuté
    Par katsuya dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 30/07/2009, 10h55
  2. Non exécution d'une méthode repaint()
    Par Flophx dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/05/2006, 18h04
  3. [MySQL] Requête non exécutée
    Par harlock59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2006, 15h42
  4. On error goto Err : goto non exécutée au 2ème appel
    Par charliejo dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 15h00
  5. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44

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