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] Trigger instead of , after ?


Sujet :

Développement SQL Server

  1. #1
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut [Trigger] Trigger instead of , after ?
    Bonjour,

    Voila j'ai un petit souci, j'alimente une table quotidiennement avec des infos de ventes du type :

    date;ref_produit;magasin;qte_vendue;
    vous aurez compris que cette table a une clé composée date;ref_produit;magasin

    Je souhaiterai ajouter à cette table 2 champs calculés Ventes_semaine_moins1 et Ventes_semaines_moins2

    par exemple pour un une ligne :
    30/08/2004;3411941581508;136;VS1;VS2

    j'aurai pour VGS1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT     SUM(Ventes) AS VGS1
    FROM         [Daily Reports_Stocks-Sales]
    WHERE     ([Date] >= DATEADD([day], - 6, CONVERT(DATETIME, '2004-08-30 00:00:00', 102))) AND ([Date] <= CONVERT(DATETIME, '2004-08-30 00:00:00', 102)) AND
                           ([Code Mag] = N'136') AND ([Code EAN] = N'3411941581508')
    GROUP BY [Date]
    Je souhaiteria que ce calul se fasse à l'insertion je me tourne donc après avoir regarder le tuto SQL vers un trigger du type INSTEAD OF ou AFTER INSERT

    Mais je ne vois pas comment coder cela, notamment comment à chaque tentative d'insert de récupérer la date, le code, mag et l'ean qui me permette de réaliser la requête de calcul.

    D'avance merci

  2. #2
    Membre à l'essai
    Inscrit en
    Octobre 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 9
    Points : 12
    Points
    12
    Par défaut
    Salut,
    Esseye de voir avec les triggers delete ou insert, t'(aura surement moyen de récupérer ta date.

  3. #3
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    Oui, je pense que cela doit pouvoir se résoudre par ce côté là mais je ne vois pas comment coder la reqûete insert ou update dans le trigger, je vois bien que j'aurai un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TRIGGER ventes_insert
    	ON Ventes INSTEAD OF INSERT
    AS
    	BEGIN
    		INSERT Ventes SELECT date, ref_produit, magasin, qte_vendue, ???????, ???????? FROM inserted
    	END
    Mais mon problème est surtout de coder ce qu'il y a à la place des ? pour y mettre les ventes semaine - 1 et les ventes semaines - 2.

    Mon problème est surtout que je ne peux pas faire cela dans une appli extérieure car le nombre de ligne est énorme chaque jour (4 à 500 000), j'ai essayé en faisant un ensemble de requête imbriquée gérées en C# mais c'est super lourd (je n'ai en fait pas que ces 2 valeurs à mais d'autres aussi à calculer dans le même style).
    Une idée sur comment faire ?

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Bonjour,

    Essayey ceci :
    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
     
    CREATE TRIGGER tr_ventes_insert
       ON [***la table en question***] AFTER INSERT
    AS
    BEGIN
        -- On recupere la clef
        DECLARE @date [***type du champ date***],
              @ref   [***type du champ ref***],
              @mag [***type du champ magasin***]
     
        SELECT @date = date, @ref = ref_produit, @mag = magasin
        FROM inserted
     
        --maintenant on calcule les valeurs vs1 et vs2
        DECLARE @vs1 INT, @vs2 INT
     
        SELECT @vs1 = SUM(qte_vendues) AS VGS1
        FROM [***la table**]
        WHERE ref_produit = @ref AND magasin = @mag
        AND [*** votre cuisine sur les dates ici***]
     
        SELECT @vs2 = [*** idem calcul precedent 
        FROM....
        WHERE....***]
     
        --On modifie la ligne qu'on vient d'inserer
        UPDATE [*** la table ***]
        SET vs1 = @vs1, vs2 = @vs2
        WHERE date = @date AND magasin = @mag AND ref_produit = @ref
     
    --C'est fini !
    END
    Il ne rest plus qu'à modifier les [***] par votre environnement.

    N'oubliez pas aussi de penser à l'update. Une colonne de modifiée dans un n-uplet et il faudra alors refaire votre calcul. L'instruction update permet de modifier plusieurs n-uplets. La table inserted ne comprendra pas 1 seul n-uplet, mais tous ceux modifié... Le script précédent calculera alors vos valeurs uniquement sur le "premier" n-uplet renvoyé par inserted. Il vous effectuer le traitement sur chaque n-uplet et ce grâce aux curseurs ... Mais là on s'écarte du sujet.

    Je ne sais pas si j'ai été clair, si j'ai dit des inepties. Je fais confiance aux autres pour me corriger.

    Hope This Helps,

    Mr N.

  5. #5
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    je vais essayer cela, je ne savais pas qu'on pouvais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select @var = champs

  6. #6
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Février 2003
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 126
    Points : 127
    Points
    127
    Par défaut
    cela fonctionne mais pas aussi bien que je le pensaisn la gestion du trigger avec l'ensemble des calculs à effectuer est lourde (une 10aine de champs en tout) je vais plutôt me tourner vers une procédure stockée que réalisera l'insert.

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

Discussions similaires

  1. Trigger Insertion instead of
    Par Lionhart dans le forum MS SQL Server
    Réponses: 32
    Dernier message: 01/09/2014, 14h39
  2. [Trigger] Trigger ne se lance pas toujours
    Par geof51 dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 08/12/2011, 17h59
  3. [Triggers] Modifier NEW en AFTER INSERT
    Par windmastr26 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 24/10/2009, 11h48
  4. [SQL SERVER 2k5]Trigger update instead of sur vue
    Par qlaimand dans le forum Développement
    Réponses: 0
    Dernier message: 18/06/2008, 17h06
  5. [Trigger] Trigger cascade table hiérarchique
    Par CUCARACHA dans le forum Développement
    Réponses: 1
    Dernier message: 12/02/2006, 18h24

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