none
Trigger:max modules RRS feed

  • Question

  • salut voilà j'ai une table Module(Code_Mdle int not null IDENTITY(1,2) primary key,
    Nom_mdle varchar(50), 
    Responsable varchar(50) , 
    Note_Mdle decimal(6,2),
    CNE_Mdle int not null)

    avec CNE_Mdle est un clé étranger de la table Etudiante;sachant qu'un étudiant à la possiblité d'inscrire dans 6 modules au maximun;j'ai essayer de créer un trriger qui permet ça le voilà;

    create trigger max_module 
    on Module 
    for insert
    as
    if(select count(*) from inserted group by CNE_Mdle)>6 
    raiserror('le maximun des modules inscris est 6',10,2)
    rollback transaction
    return
    il me donnes des erreur lors de la saisi dans la table Module ,même si j'ai pas atteint le nombre maximun de modules;SVP aider moi s'il vous avez une solution à mon problème ou bien vous pouvez me donner une autre solution plus simple que les trrigers Merci
    jeudi 16 avril 2015 23:06

Réponses

  • Bonjour,

    Pour recevoir l'erreur dans l'appelant, de mémoire il faut une sévérité de 16 pour RAISERROR => RAISERROR('message', 16, 1).

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.


    jeudi 23 avril 2015 05:35
  • Merci Yan,voilà le code complet pour ceux qui ont le même problème que moi
     Try
                cmd.CommandText = "ajout_module"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = con
                cmd.Parameters.AddWithValue("@Nom_mdle", Trim(Me.nom_mod.Text))
                cmd.Parameters.AddWithValue("@Responsable", Trim(Me.res_mod.Text))
                cmd.Parameters.AddWithValue("@Note_Mdle", Val(Me.note_mod.Text))
                cmd.Parameters.AddWithValue("@CNE_Mdle", Val(Me.ComboBox1.Text))
                cmd.ExecuteNonQuery()
                con.Close()
                MsgBox("Module ajouté avec succée", MsgBoxStyle.Information, "Ajout")
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    alter proc ajout_module(@Nom_mdle varchar(50),@Responsable varchar(50),@Note_Mdle decimal(6,2),@CNE_Mdle int)
    as
    if(select count(*) from Module Where CNE_Mdle = @CNE_Mdle)>=6 
    raiserror('le maximun des modules inscris est 6',16,1)
    else 
    insert into Module values(@Nom_mdle,@Responsable,@Note_Mdle,@CNE_Mdle)
    

    jeudi 23 avril 2015 11:24

Toutes les réponses

  • Bonjour,

    Plusieurs choses,

    Dans tous les cas vous provoquez rollback transaction donc à chaque insertion vous l'annulez. Votre condition devrait avoir un bloc BEGIN/END :

    create trigger max_module 
    on Module 
    for insert
    as
    if(select count(*) from inserted group by CNE_Mdle)>6 Begin
      raiserror('le maximun des modules inscris est 6',10,2)
      rollback transaction
    End
    return

    D'autre part il me semble que l'erreur n'est retournée dans ce cas là (a confirmer j'ai un doute) car c'est le roolback qui prend le pas en annulant l'opération, donc c'est plus une erreur d'annulation de transaction que l'on devrait recevoir.

    Ensuite, votre select n'est pas correct, en effet 'inserted' est une table contenant les lignes en cours d'insertion, donc là vous ne comptez que le nombre de lignes insérées par CNE_Mdle.

    Votre condition devrait donc être plutôt :

    (SELECT COUNT(*) FROM Module INNER JOIN inserted ON Module.CNE_Mdle = inserted.CNE_Mdle) > 6

    Toutefois personnellement faire un trigger pour ça me gêne, car potentiellement 'inserted' peut avoir plusieurs lignes (insertion en batch par exemple), dans ce cas votre trigger ne fonctionnera pas correctement. Il faudrait tester toutes les lignes insérées. Le problème est que si vous annulez avec un ROLLBACK vous annulerez l'ensemble de l'opération (toutes les lignes). Ce n'est pas probant.

    Je suis plus partisan de créer une procédure stockée à qui l'on transmet les informations pour insérer le module, et elle va faire la vérification avant l'insertion et provoquer une erreur le cas échéant, sinon elle fait l'insertion normalement.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    vendredi 17 avril 2015 08:23
  • Merci Yan, j'ai essayéé de créer une procédure comme vous avez mentiené;mais ça marche pas il autorise meme l'inscription d'un étudiant au plus de 6 module;merci de la ccorigé

    create proc ajout_module(@Nom_mdle varchar(50),@Responsable varchar(50),@Note_Mdle decimal(6,2),@CNE_Mdle int)
    as
    if(select count(*) from Module group by CNE_Mdle)>6 
    raiserror('le maximun des modules inscris est',10,2)
    else 
    insert into Module values(@Nom_mdle,@Responsable,@Note_Mdle,@CNE_Mdle)

    lundi 20 avril 2015 19:50
  • Vous refaites la même erreur que dans votre trigger, vous ne devez pas faire de regroupement. Vous devez compter le nombre de module pour un CNE_Mdle donné donc votre condition doit plutôt être :

    if(select count(*) from Module Where CNE_Mdle = @CNE_Mdle)>6 


    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.


    lundi 20 avril 2015 20:19
  • Ah bon donc il ne sera pas une procédure d'ajout mais une procédure de té-station je dois l'appeler avant d'appeler une autre d'ajout simple c'est ça n'est ce pas?
    lundi 20 avril 2015 20:48
  • Si bien sûr que c'est une procédure d'ajout, je vous dis juste que votre condition ne peut pas fonctionner correctement  (sauf coup de chance) car vous faîte un regroupement ce qui n'est pas approprié dans votre contexte.

    Vous voulez compter le nombre de module pour un CNE_Mdle pour déterminer si vous pouvez en rajouter un ou pas. Hors vous faîte un regroupement par CNE_Mdle, ce qui veut dire que votre select va compter tous les modules pour chaque CNE_Mdle qui se trouve dans votre table, si vous avez 10 CNE_Mdle différents dans votre table module, vous obtiendrez 10 lignes de résultats. Et dans ces 10 lignes vous ne savez pas laquelle correspond au CNE_Mdle que vous cherchez.

    Vous devez donc compter le nombre de module pour le CNE_Mdle pour lequel vous voulez ajouter un nouveau module.

    La procédure complète devrait plutôt être :

    create proc ajout_module(@Nom_mdle varchar(50),@Responsable varchar(50),@Note_Mdle decimal(6,2),@CNE_Mdle int)
    as
    if(select count(*) fromModule Where CNE_Mdle = @CNE_Mdle)>6 
    raiserror('le maximun des modules inscris est',10,2)
    else 
    insert into Module values(@Nom_mdle,@Responsable,@Note_Mdle,@CNE_Mdle)

    Votre condition IF compte le nombre d'éléments pour le @CNE_mdle que vous transmettez, cette requête ne retourne qu'une seule ligne donc il n'y a pas d’ambiguïté.

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.

    mardi 21 avril 2015 04:55
  • oui c'est ce que je fait exactement mais lorsque je veux l'utiliser dans le vb il n'affiche pas le message cité dans le raiserror ;comment.??
    mercredi 22 avril 2015 22:41
  • Bonjour,

    Pour recevoir l'erreur dans l'appelant, de mémoire il faut une sévérité de 16 pour RAISERROR => RAISERROR('message', 16, 1).

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.


    jeudi 23 avril 2015 05:35
  • Merci Yan,voilà le code complet pour ceux qui ont le même problème que moi
     Try
                cmd.CommandText = "ajout_module"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = con
                cmd.Parameters.AddWithValue("@Nom_mdle", Trim(Me.nom_mod.Text))
                cmd.Parameters.AddWithValue("@Responsable", Trim(Me.res_mod.Text))
                cmd.Parameters.AddWithValue("@Note_Mdle", Val(Me.note_mod.Text))
                cmd.Parameters.AddWithValue("@CNE_Mdle", Val(Me.ComboBox1.Text))
                cmd.ExecuteNonQuery()
                con.Close()
                MsgBox("Module ajouté avec succée", MsgBoxStyle.Information, "Ajout")
    
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    alter proc ajout_module(@Nom_mdle varchar(50),@Responsable varchar(50),@Note_Mdle decimal(6,2),@CNE_Mdle int)
    as
    if(select count(*) from Module Where CNE_Mdle = @CNE_Mdle)>=6 
    raiserror('le maximun des modules inscris est 6',16,1)
    else 
    insert into Module values(@Nom_mdle,@Responsable,@Note_Mdle,@CNE_Mdle)
    

    jeudi 23 avril 2015 11:24