Partage
  • Partager sur Facebook
  • Partager sur Twitter

Implémenter 10 arguments sur une classe de 7 arg.

    25 novembre 2021 à 23:24:22

    Bonjour,

    J'ai une classe comportant 7 attributs, soit 7 arguments. Au sein de ma form2 je créer une facture dans un fichier texte, à ce moment j'ajoute 3 "attributs" qui sont au final des résultats de calcules. 

    Voici le code de création du fichier : 

            private void btGenerFact_Click(object sender, EventArgs e)
            {
                try
                {
                    string NomFile = @"C:\Users\Lucas_2\Documents.facture.txt";            //chemin d'accès à changer en fonction du PC utilisé
    
                    using (StreamWriter Fichier = File.CreateText(NomFile))
                    {
                        Fichier.WriteLine("Facture achat : ");
    
                        Fichier.WriteLine("id | ref  | fam         | unit | quant | pu ttc  | rem € | tva € | remise % | pa ht");
    
                        foreach (Article item in _calcfact)
                        {
                            Fichier.WriteLine("{0}  | {1} | {2} | {3}   | {4}     | {5}    | {6}    | {7}  | {8}    | {9} ", 
                                item.idarticle, item.reference, item.famille, item.unite, item.quantite, item.prixunitaire, item.remise, 
                                Article.prixTVA(item.prixunitaire), Article.remisepourcent(item.prixunitaire, item.remise),
                                Article.prixachatnet(item.prixunitaire, Article.prixTVA(item.prixunitaire)));
                        }
    
                        double somF = 0;
    
                        foreach (Article item in _calcfact)
                        {
                            somF += item.prixunitaire;
                        }
                        Fichier.WriteLine("\nTOTAL TTC : {0}", somF);
                    }
                    System.Diagnostics.Process.Start(NomFile);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Ajouter un dossier C:/Temp/ ", "Erreur création fichier");
                }
            }

    Voici le code de mes calcules programmées dans les constructeurs de la classe article et appeler lors de la création du fichier :

    public static double prixTVA(double prixunitaire)
            {
                double prixtva = 0;
    
                prixtva = prixunitaire * 0.2;
    
                return Math.Round(prixtva, 2);
            }
    
            public static double remisepourcent(double prixunitaire, double remise)
            {
                double pourcentrem = 0;
    
                pourcentrem = (remise * 100) / prixunitaire;
    
                return Math.Round(pourcentrem, 2);
            }
    
            public static double prixachatnet(double prixunitaire, double tva)
            {
                double prixnet = 0;
    
                prixnet = prixunitaire - tva;
    
                return prixnet;
            }

    Voici le constructeur de ma classe article comportant 7 arguments : 

            public Article(string idarticle, string reference, string famille, string unite, int quantite, double prixunitaire, double remiseeuro)
            {
                _idarticle = idarticle;
                _reference = reference;
                _famille = famille;
                _unite = unite;
                _quantite = quantite;
                _prixunitaire = prixunitaire;
                _remiseeuro = remiseeuro;
            }

    J'aimerais pouvoir retourner les ces 10 arguments dans une DatGridView, via ma classe article. Comment ne pas avoir le message d'erreur "Aucune surcharge pour la méthode 'Add' n'accepte les arguments" 

    Pour finir voici la ligne de code générant le message d'erreur :

            private void initcommande(BindingList<Article> _artcommande)
            {
                foreach (Article item in _calcfact)
                {
                    _artcommande.Add(item.idarticle, item.reference, item.famille, item.unite, item.quantite, item.prixunitaire, item.remise,
                        Article.prixTVA(item.prixunitaire), Article.remisepourcent(item.prixunitaire, item.remise),
                        Article.prixachatnet(item.prixunitaire, Article.prixTVA(item.prixunitaire)));
                }
            }

    Comment surcharger cette classe d'articles ? Ou que proposez-vous comme parade ?

    Merci d'avance, 

    Lucas.

    -
    Edité par LuK0000 25 novembre 2021 à 23:25:12

    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2021 à 10:40:53

      Vous devriez architecturer un peu plus votre projet pour différencier la partie affichage de la partie métier.

      Votre classe "Article" fait partie de ma couche métier et pas de l'affichage.

      Dans la partie affichage, vous ne devriez manipuler qu'un DataSet représentant les Articles gérés par la couche métier.

      Il y a tout ce qu'il faut dans la classe DataSet et dans ses classes satellites pour créer des "colonnes" avec des valeurs "calculées".

      P.S.: Pensez à remplacer vos méthodes statiques "prixTVA" ..., par des propriétés de la classe "Article".

      P.P.S.: ne confondez pas attribut et champs (surtout en .NET, où attribut a un sens très précis), et ne confondez pas argument et paramètre, SVP.

      P.P.P.S.: Virez-moi ce try/catch totalement merdeux !!!

      -
      Edité par bacelar 26 novembre 2021 à 10:42:20

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        26 novembre 2021 à 11:04:54

        bacelar a écrit:

        Vous devriez architecturer un peu plus votre projet pour différencier la partie affichage de la partie métier.

        Votre classe "Article" fait partie de ma couche métier et pas de l'affichage.

        Dans la partie affichage, vous ne devriez manipuler qu'un DataSet représentant les Articles gérés par la couche métier.

        Il y a tout ce qu'il faut dans la classe DataSet et dans ses classes satellites pour créer des "colonnes" avec des valeurs "calculées".

        P.S.: Pensez à remplacer vos méthodes statiques "prixTVA" ..., par des propriétés de la classe "Article".

        P.P.S.: ne confondez pas attribut et champs (surtout en .NET, où attribut a un sens très précis), et ne confondez pas argument et paramètre, SVP.

        P.P.P.S.: Virez-moi ce try/catch totalement merdeux !!!

        -
        Edité par bacelar il y a 15 minutes

        Le projet ne semble par architecturé car je n'ai qu'affiché des morceaux de code. 

        L'énoncé demande à avoir des méthodes statique dans une classe à part pour ces calcules. 

        Je vais me renseigner sur ces différences (attribut et champs).

        Ce try/catch m***eux ???? Prenez conscience que certaines personnes effectues encore des études. Ainsi l'enseignant impose certaine chose ! Merci. A ce sujet vous utiliserez plus un if/else générant un message d'erreur ? (sous forme de messagebox)

        A mon sujet, pouvez-vous m'éclairer sur l'ajour de colonnes avec valeurs calculées dans  une DataGridView ?

        Merci,

        Lucas.

        -
        Edité par LuK0000 26 novembre 2021 à 11:15:43

        • Partager sur Facebook
        • Partager sur Twitter
          26 novembre 2021 à 12:36:34

          >Le projet ne semble par architecturé car je n'ai qu'affiché des morceaux de code.

          Pas besoin d'avoir tout le code pour voir quand des choses qui n'ont rien à foutre ensemble sont ensembles.

          Il me faut tout le code pour dire si le projet est bien architecturé, mais pas pour savoir qu'il ne l'est pas.

          Vous êtes débutant et vous faites des erreurs de débutant, comme tout le monde. Il n'y a pas de "problème" à cela.

          J'espère juste que vos prof. ne vous laisseront pas les poursuivre. (Malheureusement, pas mal de prof. sont bien pire que les débutants, car ils ne se remettent pas en question)

          >L'énoncé demande à avoir des méthodes statique dans une classe à part pour ces calcules.

          C'est assez étrange comme approche. Votre prof. a peut-être un truc derrière la tête, ou est peut-être allergique à la POO (ce qui est dommage pour un langage comme C#).

          "méthodes statique", en C#, contrairement au C ou au C++, ça ne veut rien dire de précis. En faire des méthodes statiques de la classe Article ou de la classe statique "FourreTout_ParceQueJaiRienComprisAlaPoo" (comme laisse apparaître votre implémentation), c'est pas la même chose. Et rien n'empêche l'implémentation des Properties de la classe Article d'utiliser ces "méthodes statiques", si votre prof. a des pulsions irrépressibles de "factorisation".

          >Je vais me renseigner sur ces différences (attribut et champs).

          https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/field

          https://docs.microsoft.com/fr-fr/dotnet/csharp/programming-guide/concepts/attributes/

          >Prenez conscience que certaines personnes effectues encore des études. Ainsi l'enseignant impose certaine chose !

          Et ?

          Etes-vous sûr que l'enseignant vous oblige à "catcher" tous les types d'exceptions possibles, même des StackOverflow, et d'indiquer systématiquement que c'est un problème de répertoire "C:\Temp" manquant ???

          Moi, je suis à peu près sûr du contraire et que vous avez très mal interprété les "exigences" du professeur.

          Le meilleur try/catch, c'est "pas de try/catch" car c'est lui qui permet de faire le maximum de choses "intéressantes" (framework de gestion d'erreurs, dump post-mortem, watchdogs, etc, ...). Si vous vous emmerdez à en ajouter un, faites le correctement (au moins un minimum).

          >A ce sujet vous utiliserez plus un if/else générant un message d'erreur ?

          Les exceptions, c'est pour les cas exceptionnels (ne me remerciez pas). Si un cas d'erreur est exceptionnel, c'est "legite" de le gérer avec des exceptions (correctement typées et circonstanciés, SVP), mais je ne suis pas sûr qu'invoquer systématiquement un bout émissaire "C:\Temp" soit très "legite".

          Si c'est un cas "classique" d'erreur et que cela vient d'une entré "utilisateur", if/else s'impose (la messageBox, quand on n'est dans une couche qui n'a aucun rapport avec l'affichage, c'est très mal venu => try/catch mal placé).

          Si c'est lié à un problème de programmation (pré-conditions, etc...), les asserts seraient plus justifiés.

          >A mon sujet, pouvez-vous m'éclairer sur l'ajour de colonnes avec valeurs calculées dans  une DataGridView ?

          La manière de faire la plus "correct" est fonction de la nature de ces valeurs : que pour l'affichage, pour l'implémentation des règles métiers, etc...

          Méthode bourrin que pour l'affichage :

          https://docs.microsoft.com/fr-fr/dotnet/api/system.data.datacolumn.expression?view=net-6.0

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            26 novembre 2021 à 15:46:05

            D'accord merci pour cette aide ça l'air de fonctionner jusqu'au moment où ........ rien ne s'affiche dans la DataGridView ....... 

            Explication :

            Une autre erreur (sans message et sans code survient). Je travaille sur 2 formes distinctes. Sur la première le code fonctionne (à quelques lignes prêts, mais le principe est là). 

            Cependant sur ma deuxième forme la datagrid n'affiche rien .... quand j'effectue mon code sur la form1 avec les mêmes noms, elle retourne les données voulu. Avez-vous déjà eu ce soucis ? 

            Pourquoi avec les mêmes syntaxes, les mêmes using, le code fonctionne sur une forme mais pas l'autre ?

            Merci ! 

            -
            Edité par LuK0000 26 novembre 2021 à 15:46:31

            • Partager sur Facebook
            • Partager sur Twitter
              26 novembre 2021 à 16:33:36

              Comme je prends la peine d'architecturer le projet, si c'est un problème dans les données métiers, les 2 formulaires auraient le même problème.

              Si un seul des formulaires a un problème, c'est que c'est dans le code du formulaire et pas dans le code métier qu'est vraisemblablement le problème.

              Mais si vous n'avez toujours pas pris la peine d'architecturer votre application en couche, le problème peut être n'importe où dans votre formulaire "tout en 1".

              >Une autre erreur (sans message et sans code survient)

              Vous devriez faire attention au contenu de la fenêtre "Sortie" de Visual Studio, les problèmes de DataBinding y sont listés au moment d'une session de debugging.

              Une part non négligeable du contenu de la classe Form est gérée par le Designer Graphique de Formulaire. Si vous n'avez pas les mêmes contrôles et composants d'un formulaire à l'autre et pas configuré les mêmes événements de la même manière, c'est normal qu'un même code ne fonctionne pas du tout de la même manière dans un formulaire ou dans un autre.

              Comme il ne me serait jamais venu à l'esprit de faire du copier-coller d'implémentation entre un formulaire et un autre, parce que la factorisation liée au principe DRY me préserve de tout usage du moindre "copier-coller". L'héritage et les custom control permettent de ne jamais faire de copier-coller "à la con".

              Donc, je ne vois pas par quelle magie vous voudriez que du code dans un formulaire devrait fonctionner dans un autre, bien au contraire. Chaque formulaire est un contexte de code bien différent et donc, à moins de le faire exprès, un code dans un formulaire n'a aucune raison de fonctionner dans un autre.

              Avez-vous pris les précautions pour que cette "greffe" de code fonctionne ?

              Moi, je ne fais jamais de "greffe", c'est trop compliqué (à maintenir) pour rien.

              Montrez vos codes et les messages dans la fenêtre "Sortie", SVP.

              -
              Edité par bacelar 29 novembre 2021 à 3:00:27

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              Implémenter 10 arguments sur une classe de 7 arg.

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown