Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajout/Suppression en 3tiers

    27 novembre 2020 à 1:31:48

    Bonjour/Bonsoir tout le monde.

    Je fais une application en C# en " fausse " architecture trois tiers, je veux dire par là que mes DAL, BLL et PL sont des classes dans le même projet. Et je travaille avec une BD que je simule dans une classe DTO.

    Voici mon code du bouton qui me permet d'ajouter un client dans ma BD : 

     private void btnAjouterClient_Click(object sender, EventArgs e)
            {
                try
                {
                    
                        if (txtIdClient.Text == "" || txtNomClient.Text == "" || txtPrenomClient.Text == "")
                        {
                            MessageBox.Show("Veuillez remplir tout les champs");
                        }
                        else
                        {
                            
                            DtoClient dtoClient = new DtoClient(txtIdClient.Text, txtNomClient.Text, txtPrenomClient.Text);
                            //Si ma liste est vide, j'ajoute le premier éléments
                            if (listeRechercheClient.Count == 0)
                            {
                                cbAffichageClient.Items.Add(dtoClient.NomClient + " " + dtoClient.PrenomClient);
                                cbClientLocation.Items.Add(dtoClient);
                                listeRechercheClient.Add(dtoClient);
                                PlClient plClient = new PlClient();
                                string messageAjoutClient = plClient.AjoutClientPl(dtoClient);
                                MessageBox.Show(messageAjoutClient);
                            }
                            //Si ma liste contient déjà un élément, je vais la parcourir pour éviter de rentrer un ID existant
                            else
                            {
                                for (int i = 0; i < listeRechercheClient.Count; i++)
                                {
                                if (listeRechercheClient[i].IdClient == txtIdClient.Text)
                                {
                                    MessageBox.Show("L'id du client existe déjà");
                                }
                                else
                                {
                                    cbAffichageClient.Items.Add(dtoClient.NomClient + " " + dtoClient.PrenomClient);
                                    cbClientLocation.Items.Add(dtoClient);
                                    listeRechercheClient.Add(dtoClient);
                                    PlClient plClient = new PlClient();
                                    string messageAjoutClient = plClient.AjoutClientPl(dtoClient);
                                    MessageBox.Show(messageAjoutClient);
                                }
                            }
                        }
    
                    }
                }
                catch
                {
                    MessageBox.Show("Une erreur s'est produite");
                }
            }

    La première entrée se fait normalement, la deuxième réussis mais la messageBox de l'id déjà existant pop ( alors que les id sont différents) et la troisième entrée il double l'entrée, puis m'afficher deux fois la messagebox de l'id

    Et voici mon code de suppression : 

    private void btnSupprimerClient_Click(object sender, EventArgs e)
            {
                //try
                //{
                    PlClient plClient = new PlClient();
                    //DtoClient dtoClient = new DtoClient();
    
                    plClient.SupprimerClientPl(listeRechercheClient, cbAffichageClient.SelectedIndex);
                    cbAffichageClient.Items.Clear();
    
                    foreach (DtoClient maListeClient in listeRechercheClient)
                    {
                        cbAffichageClient.Items.Add(maListeClient.NomClient + " " + maListeClient.PrenomClient);
                    }
                //}
                //catch
                //{
                //    MessageBox.Show("Une erreur s'est produite");
                //}
            }

    Et là je clique sur le bouton, il me dit que l'index est en dehors de la limite.

    Si une âme charitable à une piste, ça fait deux jours que je cherche, je vais devenir chauve ... 

    Merci à tous ! 


    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2020 à 10:08:32

      Prenez la peine d'indenter correctement votre code. ;)
      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        27 novembre 2020 à 14:43:57

        pour le 1er problème, je ferai une boucle for "indépendante" (ou une fonction à part) qui indiquerai par un booléen si j'ai déjà l'ID et ensuite si je n'ai pas l'ID j'ajoute mon élément. Là tu te retrouves avec le fait que tu peux ajouter l'élément un certain nombre de fois, dès qu'un ID est différent (exemple si le 1er ID de la boucle est différent de l'ID à ajouter, tu l'ajoutes; tu passes à l'indice suivant, si l'ID est encore différent, bah tu l'ajoutes encore une fois, ..)

        Pour le 2nd problème, fait le en pas à pas et vérifies les indices et la présence de l'élément de cet indice dans ta liste

        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2020 à 17:06:40

          umfred a écrit:

          pour le 1er problème, je ferai une boucle for "indépendante" (ou une fonction à part) qui indiquerai par un booléen si j'ai déjà l'ID et ensuite si je n'ai pas l'ID j'ajoute mon élément. Là tu te retrouves avec le fait que tu peux ajouter l'élément un certain nombre de fois, dès qu'un ID est différent (exemple si le 1er ID de la boucle est différent de l'ID à ajouter, tu l'ajoutes; tu passes à l'indice suivant, si l'ID est encore différent, bah tu l'ajoutes encore une fois, ..)

          Pour le 2nd problème, fait le en pas à pas et vérifies les indices et la présence de l'élément de cet indice dans ta liste


          Bonjour, tout d'abord merci à vous pour votre réponse.

          J'ai un peu de mal à visualiser ce que vous me conseillez de faire pour le 1er problème.

          Pour ce qui est du deuxième problème, en le faisant avec un point d'arrêt voici ce qui sort : 

          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2020 à 17:25:49

            Pour le 1er problème, imaginons que tu as 10 éléments  (d'id 0 à 9 et pour faire simple l'élément d'indice i à l'id i) et que l'on cherche à entrer l'id 2.

            Ce que fait ton code:

            pour chaque indice allant de 0 à 9, je regarde si l'élément [indice] = 2, si oui je affiche mon message, sinon j'ajoute l'élément et je passe à l'indice suivant

            • donc indice =0, son id vaut 0; c'est différent de 2, donc j'ajoute l'élément d'id 2, je passe à l'indice suivant (puisqu'il n'y a pas de break)
            • indice = 1 maintenant, c'est toujours différent de 2, donc j'ajoute encore l'élément d'id 2, je passe à l'indice suivant
            • indice=2, c'est égale à 2, j'affiche le message, je passe à l'indice suivant
            • indice=3 c'est différent de 2, j'ajoute encore une fois l'élément d'indice 2, je passe à l'indice suivant.
            • etc etc

            Ce que je te conseille:

            Je positionne une une variable IsPresent à Faux;

            pour chaque indice de 0 à 9, je regarde si l'élément [indice] = 2, si oui je met IsPresent à Vrai et je sors de la boucle (inutile d'aller plus loin);

            si IsPresent est Faux, j'ajoute l'élément, sinon j'affiche mon message 

            Pour le 2nd problème, quelles sont les valeurs de cbAffichageClient.SelectedIndex, quels sont les indices min et max de listeRechercheClient à ce moment ?

            • Partager sur Facebook
            • Partager sur Twitter
              27 novembre 2020 à 17:44:29

              Pour le premier problème, si vous indentiez correctement votre code, cela serait vraisemblablement plus parlant.

              Ligne 27, vous initiez les bornes d'une boucle "for" mais la borne supérieure est fonction d'une collection dont vous changez le contenu eu cours de la boucle. Rien ne garantit que la borne ne soit pas vérifiez à tour de boucle. Et votre algo est claqué au sol.

              Il se passe quoi si j'essaye de remettre un element qui est en second position dans votre liste ?

              Quand i=0, on passe dans le else ligne 33, donc on ajoute une deuxième le second élément, il est en 2ème ET 3ème éléments, puis quand i=&, on passe dans le if ligne 29, on se prend le message d'erreur sur le 2ème élément mais on l'a déjà ajouté : GG.

              Idem avec l'ajout d'un simple second élément et si on fait l'assertion d'une évaluation de la condition en fin de boucle.

              Quand i=0, pas de collision avec le premier terme, on passe dans le else ligne 33, on ajoute donc un 2ème élément dans la collection : évaluation de la condition en fin de boucle : on a maintenant un second élément dans la collection, on passe de nouveau dans la boucle avec i=1 => On passe dans le if ligne 29 donc message d'erreur.

              Comme l'indique @umfred, vérifiez que l'élément n'est pas dans la collection PUIS vous l'insérer.

              Pour le 2ème problème, lisez le message d'erreur et les "Conseils de dépannage" qui sont des plus explicites.

              Vérification de la valeur de "cbAffichageClient.SelectedIndex" ??? , parce que "-1", ça fait pas du bien par où ça passe.

              On n'a pas le code de la classe "PlClient", mais lui demander de supprimer des trucs juste après sa création, en lui passant une collection dont on ne sait rien, etc... ça sent pas la conception "soignée".

              C'est plus que perfectible en clarté tout ça, et ça vous éviterait tous ces bugs à la con.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                27 novembre 2020 à 18:12:20

                umfred a écrit:

                Pour le 1er problème, imaginons que tu as 10 éléments  (d'id 0 à 9 et pour faire simple l'élément d'indice i à l'id i) et que l'on cherche à entrer l'id 2.

                Ce que fait ton code:

                pour chaque indice allant de 0 à 9, je regarde si l'élément [indice] = 2, si oui je affiche mon message, sinon j'ajoute l'élément et je passe à l'indice suivant

                • donc indice =0, son id vaut 0; c'est différent de 2, donc j'ajoute l'élément d'id 2, je passe à l'indice suivant (puisqu'il n'y a pas de break)
                • indice = 1 maintenant, c'est toujours différent de 2, donc j'ajoute encore l'élément d'id 2, je passe à l'indice suivant
                • indice=2, c'est égale à 2, j'affiche le message, je passe à l'indice suivant
                • indice=3 c'est différent de 2, j'ajoute encore une fois l'élément d'indice 2, je passe à l'indice suivant.
                • etc etc

                Ce que je te conseille:

                Je positionne une une variable IsPresent à Faux;

                pour chaque indice de 0 à 9, je regarde si l'élément [indice] = 2, si oui je met IsPresent à Vrai et je sors de la boucle (inutile d'aller plus loin);

                si IsPresent est Faux, j'ajoute l'élément, sinon j'affiche mon message 

                Pour le 2nd problème, quelles sont les valeurs de cbAffichageClient.SelectedIndex, quels sont les indices min et max de listeRechercheClient à ce moment ?

                J'ai modifié, est-ce que ceci est ce que vous me conseillez de faire ? 

                private void btnAjouterClient_Click(object sender, EventArgs e)
                        {
                            bool isPresent = false;
                            try
                            {
                                DtoClient dtoClient = new DtoClient(txtIdClient.Text, txtNomClient.Text, txtPrenomClient.Text);
                                for (int i = 0; i < listeRechercheClient.Count; i++)
                                {
                                    if (listeRechercheClient.Count == 0)
                                    {
                                        cbAffichageClient.Items.Add(dtoClient.NomClient + " " + dtoClient.PrenomClient);
                                        cbClientLocation.Items.Add(dtoClient);
                                        listeRechercheClient.Add(dtoClient);
                                        PlClient plClient = new PlClient();
                                        string messageAjoutClient = plClient.AjoutClientPl(dtoClient);
                                        MessageBox.Show(messageAjoutClient);
                                    }
                                    else
                                    {
                                        if (listeRechercheClient[cbAffichageClient.SelectedIndex].IdClient == txtIdClient.Text)
                                        {
                                            MessageBox.Show("L'id existe déjà");
                                            isPresent = true;
                                            break;
                                        }
                                        else
                                        {
                                            cbAffichageClient.Items.Add(dtoClient.NomClient + " " + dtoClient.PrenomClient);
                                            cbClientLocation.Items.Add(dtoClient);
                                            listeRechercheClient.Add(dtoClient);
                                            PlClient plClient = new PlClient();
                                            string messageAjoutClient = plClient.AjoutClientPl(dtoClient);
                                            MessageBox.Show(messageAjoutClient);
                                            isPresent = false;
                                        }
                                    }
                                }
                                
                                    
                            }
                            catch
                            {
                                MessageBox.Show("Une erreur s'est produite");
                            }
                        }

                Merci encore à vous !

                bacelar a écrit:

                Pour le premier problème, si vous indentiez correctement votre code, cela serait vraisemblablement plus parlant.

                Ligne 27, vous initiez les bornes d'une boucle "for" mais la borne supérieure est fonction d'une collection dont vous changez le contenu eu cours de la boucle. Rien ne garantit que la borne ne soit pas vérifiez à tour de boucle. Et votre algo est claqué au sol.

                Il se passe quoi si j'essaye de remettre un element qui est en second position dans votre liste ?

                Quand i=0, on passe dans le else ligne 33, donc on ajoute une deuxième le second élément, il est en 2ème ET 3ème éléments, puis quand i=&, on passe dans le if ligne 29, on se prend le message d'erreur sur le 2ème élément mais on l'a déjà ajouté : GG.

                Idem avec l'ajout d'un simple second élément et si on fait l'assertion d'une évaluation de la condition en fin de boucle.

                Quand i=0, pas de collision avec le premier terme, on passe dans le else ligne 33, on ajoute donc un 2ème élément dans la collection : évaluation de la condition en fin de boucle : on a maintenant un second élément dans la collection, on passe de nouveau dans la boucle avec i=1 => On passe dans le if ligne 29 donc message d'erreur.

                Comme l'indique @umfred, vérifiez que l'élément n'est pas dans la collection PUIS vous l'insérer.

                Pour le 2ème problème, lisez le message d'erreur et les "Conseils de dépannage" qui sont des plus explicites.

                Vérification de la valeur de "cbAffichageClient.SelectedIndex" ??? , parce que "-1", ça fait pas du bien par où ça passe.

                On n'a pas le code de la classe "PlClient", mais lui demander de supprimer des trucs juste après sa création, en lui passant une collection dont on ne sait rien, etc... ça sent pas la conception "soignée".

                C'est plus que perfectible en clarté tout ça, et ça vous éviterait tous ces bugs à la con.

                Merci de votre réponse,

                je suis encore en plein apprentissage, et je vous avoue que je me base sur ce que mon prof nous a montré en classe, puis j'essaie de de me débrouiller.

                J'ai regardé ce que me proposait les conseils de dépannage, et devrai-je initier mon cbAffichageClient.SelectedIndex à 0 ? 

                Merci à vous.

                -
                Edité par KingFlamini 27 novembre 2020 à 18:16:19

                • Partager sur Facebook
                • Partager sur Twitter
                  27 novembre 2020 à 18:30:18

                  toujours pas. ce que j'indiquais c'étais pour être dans le else qui faisait suite à 

                  //Si ma liste contient déjà un élément, je vais la parcourir pour éviter de rentrer un ID existant

                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 novembre 2020 à 18:38:23

                    umfred a écrit:

                    toujours pas. ce que j'indiquais c'étais pour être dans le else qui faisait suite à 

                    //Si ma liste contient déjà un élément, je vais la parcourir pour éviter de rentrer un ID existant




                    Donc dans le code de mon else qui suit que que vous avez noté, je mets mon isPresent à true et j'ajoute l'élément à ma liste ? 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 novembre 2020 à 18:48:34

                      1- dégagez-moi ces try/catch FISSA !

                      2-

                      +Ligne 7 et 8 de votre code, vous les déplacez entre la ligne 19 en la ligne 20

                      +remplacer la ligne 20 par :

                      if (listeRechercheClient[i].IdClient == txtIdClient.Text)

                      +Ligne37 de votre code, vous les déplacez entre la ligne 25 en la ligne 26

                      +Remplacer la ligne 26 par 

                      if(!isPresent)

                      Le résultat sera vraiment pas beau, mais j'ai l'impression que vous êtes complètement à l'Ouest.

                      Après, on pourra dégager cette boucle à la con avec une simple expression LINQ :

                      https://stackoverflow.com/questions/1071032/searching-if-value-exists-in-a-list-of-objects-using-linq

                      Et aussi dégager tous ces gros pâtés de code redondants, et ne faire des actions que quand les conditions préliminaires sont respectées, mais bon, faudrait déjà avoir les bases d'algorithmie.

                      P.S.: vous utilisez des concepts très évolué comme les DTO et vous coincez sur des "trucs" triviaux d'algorithmie de base. Faudrait reprendre un peu les bases, sinon, vous vous en sortirez pas.

                      -
                      Edité par bacelar 27 novembre 2020 à 18:50:47

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                        27 novembre 2020 à 19:09:50

                        bacelar a écrit:

                        1- dégagez-moi ces try/catch FISSA !

                        2-

                        +Ligne 7 et 8 de votre code, vous les déplacez entre la ligne 19 en la ligne 20

                        +remplacer la ligne 20 par :

                        if (listeRechercheClient[i].IdClient == txtIdClient.Text)

                        +Ligne37 de votre code, vous les déplacez entre la ligne 25 en la ligne 26

                        +Remplacer la ligne 26 par 

                        if(!isPresent)

                        Le résultat sera vraiment pas beau, mais j'ai l'impression que vous êtes complètement à l'Ouest.

                        Après, on pourra dégager cette boucle à la con avec une simple expression LINQ :

                        https://stackoverflow.com/questions/1071032/searching-if-value-exists-in-a-list-of-objects-using-linq

                        Et aussi dégager tous ces gros pâtés de code redondants, et ne faire des actions que quand les conditions préliminaires sont respectées, mais bon, faudrait déjà avoir les bases d'algorithmie.

                        P.S.: vous utilisez des concepts très évolué comme les DTO et vous coincez sur des "trucs" triviaux d'algorithmie de base. Faudrait reprendre un peu les bases, sinon, vous vous en sortirez pas.

                        -
                        Edité par bacelar il y a 6 minutes

                        Merci, j'ai effectué les changements que vous m'aviez conseillez et effectivement tout fonctionne.

                        Oui je suis à l'ouest, je suis en BAC2, je sors d'une année chaotique, les cours a distance ne m'aide pas du tout, et le fait que notre prof nous balance le 3tiers comme ça, de plus sans réelle base de données, m'a complètement foutu dans le flou, j'ai l'impression d'avoir tout perdu.
                        Pour les try/catch, c'est parce que mon prof aime ça, et il veut qu'on les utilise.

                        Merci à vous d'avoir perdu votre temps avec mon problème, je vais me concentrer sur mon problème d'index et de suppression dès à présent.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 novembre 2020 à 21:09:55

                          Pour compléter ce que dis bacelar:

                          1- Pour l'indentation du code, sur visual studio le raccourci ( CTRL + K + D) permet de le faire en automatique.

                          2- Les Try Catch sont réservés pour des opérations sensibles exemple : accès base de données, ouverture de fichiers etc...

                          Il est néanmoins utile dans certains cas, par exemple si un fichier est ouvert et qu'on tente de l'ouvrir alors qu'il est utilisé par un autre processus.

                          3- if(listeRechercheClient.Count == 0)

                          Ce teste n'est pas utilise dans ta boucle for, car au 1er index, i vaut 0 et il ne rentrera pas dans la boucle.

                          4- PlClient plClient = newPlClient();

                          Ce code qui est présent dans ta boucle n'est pas le meilleur amis de ta mémoire car tu risque de créer autant d'instance de pClient que de nombre d'élément du tableau. Personnellement je le déclare à null avant la condition et lui affecte new PlClient(); si c'est dans le bon cas

                          N'hésite pas à passer en privé, j'ai régulièrement les étudiants via teamviewer au autre moyen à but non lucratif. :)

                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 novembre 2020 à 17:27:23

                            MehdiKacim1995 a écrit:

                            Pour compléter ce que dis bacelar:

                            1- Pour l'indentation du code, sur visual studio le raccourci ( CTRL + K + D) permet de le faire en automatique.

                            2- Les Try Catch sont réservés pour des opérations sensibles exemple : accès base de données, ouverture de fichiers etc...

                            Il est néanmoins utile dans certains cas, par exemple si un fichier est ouvert et qu'on tente de l'ouvrir alors qu'il est utilisé par un autre processus.

                            3- if(listeRechercheClient.Count == 0)

                            Ce teste n'est pas utilise dans ta boucle for, car au 1er index, i vaut 0 et il ne rentrera pas dans la boucle.

                            4- PlClient plClient = newPlClient();

                            Ce code qui est présent dans ta boucle n'est pas le meilleur amis de ta mémoire car tu risque de créer autant d'instance de pClient que de nombre d'élément du tableau. Personnellement je le déclare à null avant la condition et lui affecte new PlClient(); si c'est dans le bon cas

                            N'hésite pas à passer en privé, j'ai régulièrement les étudiants via teamviewer au autre moyen à but non lucratif. :)


                            Merci pour votre message ! 

                            Si jamais j'ai d'autre soucis, je me dirigerais vers vous, un grand merci pour votre aide ! ^^

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Ajout/Suppression en 3tiers

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown