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 avec SELECT sur plusieurs bases


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2021
    Messages : 6
    Par défaut Trigger avec SELECT sur plusieurs bases
    Bonjour,

    un peu débutant en SQL, je souhaiterais faire un trigger sur notre CRM, ce trigger a pour but d'insérer une nouvelle ligne dans la table "Comm_link".
    Le problème que je rencontre c'est qu'il faudrait que j'aille chercher les données à insérer dans 2 tables, la table Communication et la table Opportunité.

    J'avais pensé naïvement faire quelque chose comme ça mais force est de constater que ça ne fonctionne 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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    CREATE TRIGGER [dbo].[VD_Date_lendemain1]
     
       ON  [dbo].[Communication]
     
       AFTER INSERT,UPDATE
     
    AS
     
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
     
    -- interfering with SELECT statements.
     
    SET NOCOUNT ON;
     
    -- Insert statements for trigger here
     
    INSERT INTO [dbo].[Comm_Link]
    (
    	[CmLi_Comm_UserId],
    	[CmLi_Comm_CommunicationId],
    	[CmLi_CreatedBy],
    	[CmLi_CreatedDate],
    	[CmLi_UpdatedBy],
    	[CmLi_UpdatedDate],
    	[CmLi_Comm_CompanyId],
    	[CmLi_Comm_PersonId]
    )
     
    SELECT
        CmLi_Comm_UserId = Comm_CreatedBy,
    	CmLi_Comm_CommunicationId = Comm_CommunicationId,
    	CmLi_CreatedBy = Comm_CreatedBy,
    	CmLi_CreatedDate = Comm_ToDateTime,
    	CmLi_UpdatedBy = Comm_UpdatedBy,
    	CmLi_UpdatedDate = Comm_UpdatedDate,
    	CmLi_Comm_CompanyId = Oppo_PrimaryCompanyId,
    	CmLi_Comm_PersonId = Oppo_PrimaryPersonId
     
     
    FROM dbo.Communication inner join dbo.opportunity ON Oppo_OpportunityId = Comm_OpportunityId 
    					inner join dbo.Comm_Link ON Comm_CommunicationId = CmLi_Comm_CommunicationId
     
     
     
    WHERE Comm_Action = 'Meeting'
     
    END
    Je ne sais pas si c'est possible au final ? Merci d'avance de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 456
    Par défaut
    Bonjour,
    Ici tu nous dis que "ça ne fonctionne pas", mais il faudrait être un peu plus explicite: aucune ligne insérée, trop de lignes, message d'erreur ?

    Quoi qu'il en soit, je vois déjà une erreur potentielle: il n'y a aucun lien entre la ligne insérer/mise à jour et la jointure.
    Je ne vois aucun référence aux pseudo-table inserted/deleted dans ton code.

    Donc quelque soient les lignes ajoutées/modifiées, tu insères toujours la même chose dans la table Comm_Link.

    Tatayo.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2021
    Messages : 6
    Par défaut
    Merci pour ta réponse,
    alors pour être plus précis, ça n'insère rien.

    Effectivement normalement il y a un inserted, je n'ai pas envoyé la bonne version :

    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
    CREATE TRIGGER [dbo].[VD_Date_lendemain1]
     
       ON  [dbo].[Communication]
     
       AFTER INSERT,UPDATE
     
    AS
     
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
     
    -- interfering with SELECT statements.
     
    SET NOCOUNT ON;
     
    -- Insert statements for trigger here
     
    INSERT INTO [dbo].[Comm_Link]
    (
    	[CmLi_Comm_UserId],
    	[CmLi_Comm_CommunicationId],
    	[CmLi_CreatedBy],
    	[CmLi_CreatedDate],
    	[CmLi_UpdatedBy],
    	[CmLi_UpdatedDate],
    	[CmLi_Comm_CompanyId],
    	[CmLi_Comm_PersonId]
    )
     
    SELECT
        CmLi_Comm_UserId = Comm_CreatedBy,
    	CmLi_Comm_CommunicationId = Comm_CommunicationId,
    	CmLi_CreatedBy = Comm_CreatedBy,
    	CmLi_CreatedDate = Comm_ToDateTime,
    	CmLi_UpdatedBy = Comm_UpdatedBy,
    	CmLi_UpdatedDate = Comm_UpdatedDate,
    	CmLi_Comm_CompanyId = Oppo_PrimaryCompanyId,
    	CmLi_Comm_PersonId = Oppo_PrimaryPersonId
     
     
    FROM inserted inner join dbo.opportunity ON Oppo_OpportunityId = Comm_OpportunityId 
    					inner join dbo.Comm_Link ON Comm_CommunicationId = CmLi_Comm_CommunicationId
     
     
     
    WHERE Comm_Action = 'Meeting'
     
    END
    Je sens bien qu'il manque quelque chose mais je ne sais pas comment ajouter, ni comment lier ?
    Mon code de base sans la jointure et avec une seule table fonctionne bien et me créé bien la ligne.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 456
    Par défaut
    Tu devrais préfixer les colonnes dans tes requêtes, ici on ne voit pas trop le lien entre chaque table.

    Est-ce que la requête SELECT renvoie bien des lignes quand elle est lancée en dehors du trigger ?
    Est-ce que l'INSERT fonctionne en dehors du trigger ?
    Quelle est la collation de la colonne Comm_Action ?

    Et surtout, il faudrait nous donner le schéma des tables impliquées, ainsi qu'un jeu de test et la requête qui doit déclencher le trigger.

    Tatayo.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2021
    Messages : 6
    Par défaut
    Les préfixes Comm_, Oppo_ et CmLi_ ne vont pas ?

    Je vais essayer d'être un peu plus clair sans parler chinois pour ceux qui ne connaissent pas le CRM Sage.
    Mon but ultime étant que lorsqu'un utilisateur créé une opportunité dans le CRM (donc nouvelle ligne dans la table opportunity), un trigger déclenche au niveau d'un champs date, la création d'un rendez-vous dans le calendrier (Communication et Comm_link) avec affichage de certaines données donc de certains champs.

    J'ai un premier trigger sur la base Opportunity qui fonctionne très bien, il me copie les données dans colonnes dans les colonnes de la table communication.

    Mon 2e trigger sur la table communication qui copie des colonnes communication dans com_link fonctionne bien aussi sauf quand je veux ajouter des données de la table opportunity.

    La particularité dans le CRM c'est que le rdv dans le calendrier s'affiche que si certaines colonnes des bases communication et com_link sont renseignées. Les 2 tables sont liées.

    Sur le principe tout fonctionne, sauf que je souhaiterais ajouter 2 infos dans ce rdv, la sociétéà et le contact à l'origine de l'opportunité. Qui correspondent à ces 2 lignes
    CmLi_Comm_CompanyId = Oppo_PrimaryCompanyId,
    CmLi_Comm_PersonId = Oppo_PrimaryPersonId
    Et à la jointure.

    Dans la table Communication d'autres lignes sont insérées qu'ils s'agissent d'actions comme les notes, les actions (j'ai envoyé un mail au client) etc... donc ce where est pour copier les colonnes uniquement quand c'est un rdv.

    Est-ce que c'est un peu plus clair ou pas du tout ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 456
    Par défaut
    En fait je me suis mal exprimé: en disant préfixer, je voulais dire ajouter le nom des tables devant celui des colonnes.

    Je ne connais pas Sage (je ne dois pas être le seul), donc je ne connais pas la structure des tables.

    En attendant tu n'as répondu à aucune de mes questions.
    On n'a toujours pas de description des tables, de jeu de test… On ne sait toujours pas si la requête SELECT lancée en dehors du trigger renvoie quelque chose...

    Donc je pars d'une hypothèse: aucune ligne n'est insérer, car la requête ne renvoie rien. Elle ne renvoie rien soit car une des jointure fait qu'il n'y a aucune correspondance entre les lignes des deux tables concernées, soit parce qu'aucune ligne de dbo.Communication (?) ne vérifie la condition de la clause WHERE (problème de collation ?), soit un mix de tout ça.
    Bref sans plus d'infos, hypothèse en conjecture…

    Tatayo.

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

Discussions similaires

  1. Requête avec select sur 3 bases
    Par maloue dans le forum Développement
    Réponses: 1
    Dernier message: 20/07/2015, 12h07
  2. Menu avec select sur plusieurs lignes
    Par jfox dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 23/07/2012, 15h11
  3. Réponses: 2
    Dernier message: 19/05/2010, 16h20
  4. Insert avec select sur table avec Trigger d'insertion
    Par bran_noz dans le forum Développement
    Réponses: 5
    Dernier message: 23/12/2005, 14h38
  5. triggers sur plusieurs bases de données
    Par Shabata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2004, 10h02

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