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

MS SQL Server Discussion :

Il manque un agrégat dans la liste de définition d'une instruction UPDATE pour Trigger [2000]


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2002
    Messages : 41
    Par défaut Il manque un agrégat dans la liste de définition d'une instruction UPDATE pour Trigger
    Bonjour A Tous,

    Ma requete est un trigger pour Champs Calculés, seulement a chaque fois que je l'execute dans l'analyseur de requete j'ai le message suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Serveur : Msg 157, Niveau  15, État 1, Procédure CALCUL_SOLDE_ASSUREUR_PATIENT, Ligne 6
    Il manque un agrégat dans la liste de définition d'une instruction UPDATE.
    Mon Trigger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create TRIGGER CALCUL_SOLDE_ASSUREUR_PATIENT ON dbo.T_VERSEMENT_TICKET_RECEPTION 
    FOR INSERT
    AS
     
    UPDATE T_VERSEMENT_TICKET_RECEPTION SET 
    Solde_assureur=sum(dbo.Vue_Ligne_ticket_reception1.Prix_prise_en_charge) - dbo.T_VERSEMENT_TICKET_RECEPTION.Montant_verser_assureur,
    Solde_patient=sum(dbo.Vue_Ligne_ticket_reception1.Prix_patient) - dbo.T_VERSEMENT_TICKET_RECEPTION.Montant_verser_patient
     
    FROM  dbo.T_VERSEMENT_TICKET_RECEPTION INNER JOIN
          dbo.Vue_Ligne_ticket_reception1 ON dbo.T_VERSEMENT_TICKET_RECEPTION.Num_ticket_reception = dbo.Vue_Ligne_ticket_reception1.Num_ticket_reception
    Merci pour votre Aide

  2. #2
    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 : 43
    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
    Par défaut
    Bonjour,

    En fait il y a une erreur de traduction du libellé de l'erreur en Anglais par rapport au Français.
    Sous SQL Server 2012, si nous exécutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT	*
    FROM	sys.messages m
    WHERE	m.message_id = 157
    AND	m.language_id = 1033
    Nous obtenons : An aggregate may not appear in the set list of an UPDATE statement.
    Ce que j'aurai traduit par Un agrégat ne peut pas apparaître dans la liste SET d'une instruction UPDATE.

    En effet on ne peut mettre que des valeurs scalaires à droite de l'affectation.
    Pour effectuer la requête que vous souhaitez, il faut réécrire votre trigger comme suit :

    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
    ALTER TRIGGER CALCUL_SOLDE_ASSUREUR_PATIENT
    	ON dbo.T_VERSEMENT_TICKET_RECEPTION 
    FOR INSERT
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	UPDATE		dbo.T_VERSEMENT_TICKET_RECEPTION
    	SET		Solde_assureur = AGG.A
    			, Solde_patient = AGG.B
    	FROM		dbo.T_VERSEMENT_TICKET_RECEPTION AS VTR
    	INNER JOIN	(
    				SELECT		VTR.Num_ticket_reception
    						, SUM(LTR.Prix_prise_en_charge) - VTR.Montant_verser_assureur AS A
    						, SUM(LTR.Prix_patient) - VTR.Montant_verser_patient AS B
    				FROM		dbo.T_VERSEMENT_TICKET_RECEPTION AS VTR
    				INNER JOIN	dbo.Vue_Ligne_ticket_reception1 AS LTR
    							ON VTR.Num_ticket_reception = LTR.Num_ticket_reception
    				GROUP BY	VTR.Num_ticket_reception
    			) AS AGG
    				ON AGG.Num_ticket_reception = VTR.Num_ticket_reception
    END
    Cela étant, il serait peut-être plus avantageux d'utiliser une colonne calculée ou une vue indexée. Pouvez-vous indiquer l'usage qui est fait de ces colonnes ? par exemple, sont-elles plus lues qu'écrites, ou au contraire lues une seule fois par jour par un travail de l'Agent SQL Server ? ...

    @++

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

Discussions similaires

  1. Présentation dans des listes imbriquées
    Par Ghusse dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/09/2005, 09h35
  2. Réponses: 5
    Dernier message: 27/09/2005, 17h25
  3. recuperer la valeur affichée dans un liste
    Par vplf dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/01/2005, 00h16
  4. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  5. manque de place dans un combobox
    Par liviertlse dans le forum Composants VCL
    Réponses: 4
    Dernier message: 24/10/2003, 16h19

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