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(Envoi mail ) avec Entete et Details


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Trigger(Envoi mail ) avec Entete et Details
    Bonjour;
    j ai créer un trigger qui envoi une notification après chaque Ajout sur une table (DemandeAchat) avec formatage du mail avec les detail de la demande (Articles).
    cepondnat l'email contient que le numéro ,les details sont vide.c question de timing je pense(La demande se crée et exécute le Trigger avec que les détail ne soient enregistrés).Les enregistrements s'effectuent sur une application.
    Merci de m'aider svp.(Solution très pratique je pense)

    Voici le code :
    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
    CREATE TRIGGER AlertDA
    ON DemandeAchat
    AFTER INSERT
    AS
     
    DECLARE @NumDa varchar(max)='' ,@body varchar(max)='',@subject varchar(max);
    DECLARE @Desi nvarchar(max)='';
    DECLARE @DesiGL nvarchar(max)='';
    DECLARE @Qte varchar(max)='';
     
    SET @NumDa =(SELECT numDemande from inserted);--recuperation numero demande crée
    DECLARE moncurseur CURSOR FOR SELECT DetailDemandeAchat.designation,DetailDemandeAchat.qteDemandee from DetailDemandeAchat where DetailDemandeAchat.numDemande=@NumDa;--recuperer les ligne enregistré
     
     
    OPEN moncurseur;
    FETCH NEXT FROM moncurseur INTO @Desi,@Qte;
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	SET @DesiGL+=@Desi+'  '+@Qte+char(13);
     
    	FETCH NEXT FROM moncurseur INTO @Desi,@Qte;
    END
    PRINT @DesiGL;
     
    SET @subject='Notification Demande Achat   '+@NumDa
     
    EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'PROFILMAIL SQL',
        @recipients = 'mail',
        @body=@DesiGL,--chaine regroupants les lignes de demande ave retour chariot pour charque ligne
     
        @subject = @subject,
        @importance ='HIGH';
     
    CLOSE moncurseur
    DEALLOCATE moncurseur

  2. #2
    Invité
    Invité(e)
    Par défaut
    Si tu as une seule valeur qui est NULL, ta chaine sera NULL.
    Par expérience mets de coalesce(machin, '') partout pour éviter de rien avoir.

    Sinon votre déclencheur n'est pas ensembliste à cause de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @NumDa =(SELECT numDemande from inserted);--recuperation numero demande crée
    Qui est une absurdité totale car si vous faites de l'insertion en masse, ça plante !

    Et pourquoi ne pas remplacer cette chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE moncurseur CURSOR FOR SELECT DetailDemandeAchat.designation,DetailDemandeAchat.qteDemandee from DetailDemandeAchat where DetailDemandeAchat.numDemande=@NumDa;--recuperer les ligne enregistré
    avec une jointure sur la pseudo table INSERTED ?

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    MERIC POUR VOS REMARQUES .

    le @num@Da ne peut avoir qu'une seule valeur (Une Execution de Trigger pour Chaque DA) et mémé avec jointure ça donne rien

    les '' je suis pour .
    Le prob c est que le trigger s’exécute avant que l'instruction d'ajout sur la deuxième table DetailDemande s'effectue ;alors si je cherche les lignes de la @NumDA je trouve rien!!
    j 'ai déjà fait un Delay mais rien .

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    C'est que votre envoi de mail est mal placé.

    Au pire, il devrait être dans un trigger sur la table des détails.

    Mieux, il devrait être sorti de la transaction (d'insertion de demande d'achat) afin de ne pas allonger celle-ci (et donc réduire la durée de pose des verrous).
    Vous pourriez utiliser le service broker pour une solution plus stable et adaptée.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Bonjour;
    merci pour vos contributions.
    Si le trigger sur les Détails Demande le trigger s’exécutera autant de fois que de lignes détail.
    Pourtant c est simple question d'envoi d'information par mail!!

    le service brooker je connait pas je vais me documenter

    Merci pour tout j'attend toute proposition.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    pas si vous insérez toutes les lignes de détails d'un seul coup.

    Mais il faudrait en savoir plus sur votre procédure d'insertion des demandes (et des détails de demandes) d'achat.

    car vous pourriez aussi laisser l'applicatif se charger de cet envoi de mail.

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Rebonjour;
    C est une application développement spécifique qui utilise SQL server comme SGBDR que j'ai pas accès au code.
    j ai essayer et je vient de le refaire je reçoit 1 mail pour chaque ligne !!!!

    je suis dans l impasse


    une autre solution ?

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Comme le disait aieeeuuuuu, il faudrait que vous sortiez ce traitement du trigger.
    A mon sens, le fait que l'envoi de mail se fasse ou pas n'a rien à voir avec la charge de travail.

    Comme vous n'avez pas accès au code, vous pouvez créer une procédure stockée qui va être exécutée à intervalles réguliers par un job de l'Agent SQL Server.
    Dès lors vos transactions sont aussi courtes que possible, et l'envoi de mail se fait de façon asynchrone : ceci vous permettra de retrouver les détails puisqu'ils sont insérés dans un deuxième temps.
    Par une simple équi-jointure, vous trouverez donc les lignes pour lesquelles il y a des détails; les autres seront traitées à la prochaine exécution du job.

    Par ailleurs, les curseurs sont un non-sens en SQL puisque :

    • SQL est un langage déclaratif : on spécifie donc seulement le résultat que l'on veut obtenir, pas la façon dont on souhaite l'obtenir (c'est le rôle de l'optimiseur)
    • SQL est un langage ensembliste : on traite les lignes dans leur ensemble et pas dans leur unité


    Un petit billet sur l'écriture ensembliste de déclencheurs, et un autre sur les "performances" des curseurs.

    Il serait certainement plus avantageux de ne générer qu'un seul email par ensemble de lignes ajouté.
    On peut donc s'en remettre à une table HTML; pour ce faire, on peut détourner l'utilisation de la clause FOR XML à notre avantage, comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT		DDA.designation AS td
    		, DDA.qteDemandee AS td
    FROM		DetailDemandeAchat AS DDA
    INNER JOIN	INSERTED AS I
    			ON DDA.numDemande = I.numDemande
    FOR		XML RAW('tr'), ELEMENTS
    Ensuite pour la partie HTML, on aurait, si l'on part avec une procédure stockée :

    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
    CREATE PROCEDURE maProcedure
    AS
    BEGIN
    	SET NOCOUNT ON;
     
    	DECLARE @html_body varchar(max)
    		, @html_table_header varchar(max)
    		, @html_table_footer varchar(max)
    		, @mail_subject varchar(128) = 'Désignation et quantité';
     
    	SELECT	@html_table_footer = '</table></body></html>'
    		, @html_table_header = '<html><head>' + 
    		    '<style>
    	    td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:11pt;}
    	    tr.even {background-color:white;}
    	    tr.odd {background-color:#eeeeee;}
    		    </style>' + 
    		    '</head>' + 
    		    '<body><table cellpadding=0 cellspacing=0 border=0>' + 
    		    '<tr bgcolor=#FFEFD8><td align=center><b>Designation</b></td>' + 
    		    '<td align=center><b>qteDemandee</b></td></tr>';
     
    	SELECT	@html_body = 
    		(
    			SELECT		DDA.designation AS td
    					, DDA.qteDemandee AS td
    			FROM		DetailDemandeAchat AS DDA
    			INNER JOIN	INSERTED AS I
    						ON DDA.numDemande = I.numDemande
    			FOR		XML RAW('tr'), ELEMENTS
    		);
     
    	IF @html_body IS NOT NULL AND LEN(@html_body) > 0
    	BEGIN
    		SET @html_body = REPLACE(@html_body, '_x003D_', '=');
    		SET @html_body = REPLACE(@html_body, '_x0020_', ' ');
    		SET @html_body = REPLACE(@html_body, '<tr><TRRow>0</TRRow>', '<tr class="even">');
    		SET @html_body = REPLACE(@html_body, '<tr><TRRow>1</TRRow>', '<tr class="odd">');
     
    		SET @html_body = @html_table_header + @html_body + @html_table_footer;
     
    		EXEC msdb.dbo.sp_send_dbmail
    		    @profile_name = 'PROFILMAIL SQL'
    		    , @recipients = 'mail'
    		    , @body = @html_body 
    		    , @subject = @mail_subject
    		    , @body_format = 'HTML'
    		    , @importance ='HIGH';
    	END
    END
    On appelle ensuite la procédure stockée dans le job, à la fréquence qui vous convient (qui peut tout à fait être toutes les minutes).
    Je ne vous garantis pas que le code fonctionne, je n'ai pas le temps de le tester maintenant.

    Pour aller plus loin, je ne peux que vous conseiller la lecture du livre qui est référencé dans ma signature.

    @++

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    merci elsuket

    je vais imprimer tout ça pour plus de réflexion et lire le livre.
    tout ça c bcp compliqué pour moi .je vais voir comment faire pour créer le Job avec la procédure contrôle ajout nouvelle DA.(lire table INSERTED).
    je vous tien au courant.
    Merci Bcp

Discussions similaires

  1. [javamail] envoi mail avec message en pièce jointe
    Par k4eve dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 16/11/2007, 11h17
  2. [VB]Bp envoie mail avec piéce jointe
    Par jm1213 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/02/2006, 20h55
  3. [Oracle 10g] Envoi mail avec PJ à une heure donnée
    Par djoule6 dans le forum Oracle
    Réponses: 5
    Dernier message: 25/10/2005, 11h51
  4. Envoi mail avec Outlook accusé de réception
    Par KapoueMan dans le forum Access
    Réponses: 2
    Dernier message: 14/04/2005, 10h41
  5. envoi mail avec piece jointe fichier excel
    Par flogreg dans le forum ASP
    Réponses: 12
    Dernier message: 20/12/2004, 16h02

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