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

Python Discussion :

Gestion de stock [Débutant(e)]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut Gestion de stock
    Bonjour à tous, j'ai besoin d'un peu d'aide pour lancer mon projet. J'aimerais savoir si mes premiers choix sont les bons. Pour info je suis débutant en python, je fais des tuto et exercices depuis 2 mois. Et je pars de 0 en programmation. Je me suis fixer un projet récemment car sans projet concret, il est plus facile de ce motiver.

    Projet: le but de mon projet est de réaliser un programme pour de la gestion de stock pour m'aider dans mon taff. Le stock est petit, une cinquantaine de référence environ.

    - Dans un premier temps le but est de gérer mes mouvements de stock et m'aider à m'indiquer quand il faut commander.
    Et des outils de recherche et modification sur les différents attributs d'un article.

    Un article a pour attribut :
    Code article / référence / désignation / famille du produit / Marque / fournisseur / qte en stock / stock mini / qte à commander / conditionnement

    Pour réaliser ce début de projet j'ai réalisé une classe "Article" ayant pour but de créer tous mes outils de gestion pour mes articles.

    De gérer ma base de donnée avec sqlite
    Et mon interface graphique avec Tkinter

    - Est ce que mes premiers choix sont bons ?
    - Pour écrire mon code j'utilise notepad++ et je le test dans l'IDLE de python. Il y a mieux comme solution ?
    - Si je veux enregistrer mes mouvements de stock, il faut mieux créer une autre base de donnée ou je gère tous mes articles dans la même ?

    Si je prends goût à la programmation de ce petit logiciel, j'aimerais dans le futur créer d'autres logiciels autour de celui là (gestion des fournisseurs, gestion des commandes founisseurs) mais chaque chose en son temps lol.

    Je vous mettrais mon début de code des mon retour de vacs.

    Merci d'avance pour votre aide

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2012
    Messages
    321
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2012
    Messages : 321
    Points : 604
    Points
    604
    Par défaut
    Bonjour,

    une seule remarque, concernant l'enregistrement des mouvements, je te conseille plutôt d'avoir une table mouvement qui t'indiquera la ref du produit commandé, la date de commande, la date de préparation et la date d'expédition, la ref de la commande, la quantité commandée, ainsi qu'éventuellement le prix unitaire du produit

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Je me suis fixer un projet récemment car sans projet concret, il est plus facile de ce motiver.
    Lapsus révélateur ? ^^

    Pour réaliser ce début de projet j'ai réalisé une classe "Article" ayant pour but de créer tous mes outils de gestion pour mes articles.

    De gérer ma base de donnée avec sqlite
    Et mon interface graphique avec Tkinter

    - Est ce que mes premiers choix sont bons ?
    - Pour écrire mon code j'utilise notepad++ et je le test dans l'IDLE de python. Il y a mieux comme solution ?
    - Si je veux enregistrer mes mouvements de stock, il faut mieux créer une autre base de donnée ou je gère tous mes articles dans la même ?
    Blague à part, ta stratégie est sans doute la bonne.

    - Une telle gestion implique une base de données, ça simplifie bien la vie. SQLite est très facile à mettre en œuvre, notamment avec Python.
    - TKinter est le framework graphique par défaut de Python. Je ne l'utilise pas car je fais du Qt, mais il devrait sans douter répondre à tes besoins.
    - Tu peux regarder de PyCharm pour l'IDE : https://www.jetbrains.com/pycharm/ La version Community est largement suffisante pour ce genre de projets.
    - Une autre base ? Sans doute pas ! Une autre table ? Probablement.

    Réfléchi en priorité aux données que tu souhaites stocker. Il faut faire une raisonnement au niveau des données et de la structure de la base avant d'avoir un raisonnement en classes Python, qui ne seront qu'une réification en objets des données stockées.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par killian68 Voir le message
    Bonjour,

    une seule remarque, concernant l'enregistrement des mouvements, je te conseille plutôt d'avoir une table mouvement qui t'indiquera la ref du produit commandé, la date de commande, la date de préparation et la date d'expédition, la ref de la commande, la quantité commandée, ainsi qu'éventuellement le prix unitaire du produit
    Merci pour vos réponses.
    Ok, je voulais dire une nouvelle table et non une nouvelle bdd. J'ai pas encore tous les bons termes ^^
    En faite moi j'achète seulement et je gère le stock des articles pour les employés. Tu as raison il me faut plus d'informations (prix, date cmd etc...)

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Bonjour,


    Lapsus révélateur ? ^^


    Blague à part, ta stratégie est sans doute la bonne.

    - Une telle gestion implique une base de données, ça simplifie bien la vie. SQLite est très facile à mettre en œuvre, notamment avec Python.
    - TKinter est le framework graphique par défaut de Python. Je ne l'utilise pas car je fais du Qt, mais il devrait sans douter répondre à tes besoins.
    - Tu peux regarder de PyCharm pour l'IDE : https://www.jetbrains.com/pycharm/ La version Community est largement suffisante pour ce genre de projets.
    - Une autre base ? Sans doute pas ! Une autre table ? Probablement.

    Réfléchi en priorité aux données que tu souhaites stocker. Il faut faire une raisonnement au niveau des données et de la structure de la base avant d'avoir un raisonnement en classes Python, qui ne seront qu'une réification en objets des données stockées.
    Oui lapsus révélateur, j'ai eu du mal à me trouver un projet intéressant. J'ai besoin d'objectif pour avancer

    OK je testerai pycharm. Il est mieux de m'habituer à développer sur Linux ou je peux rester sur Windows ?

    Pour les variables à stocker j'ai déjà une bonne idée. Il faut juste que je vérifie que je n'ai oublié aucun éléments pour plus tard.
    Je pense que j'ai pas encore bien compris toute l'utilité des classes et quand je dois ou non en utilisé une.

    J'aimerais partir le mieux possible pour avoir le moins possible à retoucher à mon code dans le futur, mais vu mon niveau actuel à mon avis ce sera inévitable lol

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    PyCharm fonctionne sous Windows et Linux. Si tu n'as pas de raison particulière de passer sous Linux, tu peux rester sous Windows.

    Ton code sera sans doute à reprendre. En revanche, tu peux sans doute trouver une structure de base de données solide et durable. J'ai eu des cours de BDD + SQL en école d'ingénieur en 2e année (sur 5, c'est-à-dire en prépa assez généraliste), à un moment où on n'avait fait que très peu de programmation et où on n'avait encore pas vue la notion d'objets. Ton niveau de code ne devrait donc pas avoir beaucoup d'influence sur ta capacité de réflexion à ce niveau là.

    Les classes sont un moyen technique de faire de la programmation orientée objet. C'est un conteneur dans lequel sont regroupées des données et des fonctions pour travailler sur ces données. Prend un "objet" de la vie de tous les jours, tu devrais assez facilement à réussir à en faire un "objet" en code : une tasse (couleur, dimensions, matériau, remplir(), vider()...), un casque-audio (marque, couleur, modèle, brancher(), débrancher(), couperSon()...), un collègue (nom, prénom, date de naissance, salaire, estSympa(), demanderUnConseil(), filerUneTacheIngrate()...)

    Une classe sert de modèle à quelque chose (la classe Collègue) et les instances sont des cas concrets de ce modèle (les variables Marcel, Pauline, Jules).

    Parti de ça, tu vas créer des classes chaque fois que tu voudras modéliser quelque chose (données + comportement éventuel). Je suis en train de travailler sur des classes pour des GUI et j'ai par exemple Drawable (draw()), EventListener (handleEvent()), Page (qui hérite des 2 précédents), Button (hérite de Drawable, possède un texte et un EventListener).

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Ok je vais bien réfléchir à ma bdd, et regarder sur le net ce que je peux trouver pour bien la structurer.

    Merci pour ces explications, j'avais bien compris les bases. Mais avec ton explication et surtout tes exemples c'est plus clair dans ma tête ^^

  8. #8
    Membre chevronné
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2013
    Messages
    485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2013
    Messages : 485
    Points : 2 151
    Points
    2 151
    Par défaut
    Ton choix me semble plutôt bon à un hypothèse prêt.
    Dans ton cas, tu souhaites que ton outil soit utilisable que en mono-poste, aucun besoin actuel ou future pour que ton outil ait besoin d'être accessible en réseau.
    Si tu n'en as pas le besoin, continu en effet avec TKinter.

    Si le fait de vouloir rendre accessible l'outil sur plusieurs machine, je t'invite à regarder Django, le serveur d'application web réalisé en python.
    L'avantage en plus: il gère très bien le mapping de base de donnée (sqlite, postgresql, mysql, oracle, ...).
    Ensuite, tu fais des interfaces web via des templates incluant des balises pythons.
    Si tu as fait un minimum de html, je t'invite à y regarder un peu plus prêt, cela peut te faire gagner pas mal de temps sur ton développement.

    Bon courage.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Bonne remarque !!!!

    Je pense qu'il serait judicieux qu'il soit multiposte (dans un réseau local) mais je n'ai pas besoin d'accès distant passant par internet. Avec pour le futur une authentification login/mdp. Je pensais mettre ma bdd sur un serveur local et que chaque poste accède à la bdd.
    Est-ce que ma solution est viable ?
    Cela peut poser des problèmes avec ma bdd et de lenteur ?

    Je vais regarder ta solution car elle a l'air intéressante. En plus j'ai déjà fait un peu d'HTML et de CSS.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Après avoir regardé vos différentes propositions, j'ai fait mon choix.
    Je vais rester sur mon idée de début avec SQLITE et Tkinter, car je pense qu'il sera plus abordable de commencer avec ces solutions (vu mon niveau de débutant).

    J'ai fait un test avec SQLITE avec ma bdd sur mon NAS est ça fonctionne bien. Donc dans un premier temps sa va me suffire je pense.

    Bktero : J'ai installé PyCharm, et il est vraiment pas mal !!! Je peux tout faire avec le même outil.
    Mon seul problème est mon niveau d'anglais, mais bon vu que j'ai besoin de le bosser c'est pas plus mal ^^

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    pour information j'ai créé 4 fichiers pour l'instant :
    - 1 fichier avec ma classe article
    - 1 avec mes fonctions
    - 1 avec mon code principal
    - 1 avec mes variables multi-fichier (pour l'instant pas grand chose, il y a juste le lien vers ma BDD)

    Ma classe:
    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
     
    class Article:
    	"""Représente un article du stock avec pour paramètre :
            - son code article
            - sa référence 
            - sa désignation
            - sa marque
            - sa famille
            - sa quantité
            - son stock minimum
            - sa quantité à commander
            """
     
    	def __init__(self, code_article, reference, designation, marque, famille, quantite, mini, a_cmd):
    		"""constructeur de la classe article avec pour attribut : code_article = code article, reference = référence, désignation = designation, 
                    famille = famille, quantité en stock = quantité, stock minimum = mini, sa quantité à commander = a_cmd"""
    		self.code_article = code_article
    		self.reference = reference
    		self.designation = designation
    		self.marque = marque
    		self.famille = famille
    		self.quantite = quantite
    		self.mini = mini
    		self.a_cmd = a_cmd
    		self.art = [self.code_article, self.reference, self.designation, self.marque, self.famille, self.quantite, self.mini, self.a_cmd]
     
    	def __str__(self):
    		"""fonction pour passer l'article en chaine de caractère"""
    		str_article = list(self.art)
    		"""copie de la liste sans référence de l'une à l'autre"""
    		c = 0
    		for x in str_article: 
    			"""permet de passer les éléments de la liste en chaine"""
    			str_article[c] = str(x)
    			c+=1
    		txt = " - ".join(str_article)
    		return txt
     
    	def ajouter_bdd(self):
    		""" permet d'ajouter l'article à la base de donnée """
    		conn = sqlite3.connect(fichierBDD)
    		cur = conn.cursor()
    		data = [(self.code_article, self.reference, self.designation, self.marque, self.famille, self.quantite, self.mini, self.a_cmd)]
    		for tu in data:
    			cur.execute("INSERT INTO article(code_article, reference, designation, marque, famille, quantite, mini, a_cmd) VALUES(?,?,?,?,?,?,?,?)", tu)
    		conn.commit()
    		cur.close()
    		conn.close()

    Mes fonctions:
    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
     
    def creer_bdd():
    	"""permet de créer la base de donnée d'un article avec :
            code_article, reference, designation, marque, famille, quantite, mini, a_cmd """
    	conn = sqlite3.connect(fichierBDD)
    	cur = conn.cursor()
    	cur.execute("CREATE TABLE article(code_article TEXT, reference TEXT, designation TEXT, marque TEXT, famille TEXT, quantite INTEGER, mini INTEGER, a_cmd INTEGER)")
    	conn.commit()
    	cur.close()
    	conn.close()
     
    def list_bdd():
    	"""fonction permettant de mettre la BDD dans une liste"""
    	conn =sqlite3.connect(fichierBDD)
    	cur =conn.cursor() 
    	cur.execute("SELECT * FROM article")
    	lst = list(cur)
    	cur.close()
    	conn.close()
    	return lst
     
    def recherche_article(codearticle):
    	conn =sqlite3.connect(fichierBDD)
    	cur =conn.cursor() 
    	t = (codearticle,)
    	cur.execute("SELECT * FROM article where code_article = ?", t)
    	a = list(cur)
    	cur.close()
    	conn.close()
    	return a[0]
    Comme je n'ai pas trop d'expérience, j'ai découpé mon code en 4 fichiers qu'en pensez vous ?
    N’hésitez pas à faire des remarques mais soyez indulgent je suis débutant

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par bilou08 Voir le message
    N’hésitez pas à faire des remarques mais soyez indulgent je suis débutant
    Vos fonctions contiennent beaucoup de lignes qui se répètent.
    creer_bdd et list_bdd travaillent sur la table "article" et pas vraiment sur la "bdd".
    ajouter_bdd est une méthode de la classe Article alors qu'on ne comprend pas pourquoi elle n'a pas sa place dans le fichier fonctions (ou pourquoi d'autres fonctions ne sont pas aussi méthodes).
    list_bdd retourne une liste de tuples alors qu'elle devrait retourner une liste d'articles.

    Cote schéma, code_article devrait être une clé primaire sinon vous risquez d'avoir des "doublons".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Vos fonctions contiennent beaucoup de lignes qui se répètent.
    creer_bdd et list_bdd travaillent sur la table "article" et pas vraiment sur la "bdd".
    Oui tu as raison, le nom est mal employé

    Citation Envoyé par wiztricks Voir le message
    ajouter_bdd est une méthode de la classe Article alors qu'on ne comprend pas pourquoi elle n'a pas sa place dans le fichier fonctions (ou pourquoi d'autres fonctions ne sont pas aussi méthodes).
    Pour être franc j'ai du mal à me dire quand une fonction doit être dans ma classe. En résumé au début je voulais tout mettre dans ma classe et j'ai changé car j'avais des problème pour mes méthodes.

    Citation Envoyé par wiztricks Voir le message
    list_bdd retourne une liste de tuples alors qu'elle devrait retourner une liste d'articles.
    Cette partie était plutôt un test pour m'apprendre à manipuler la table Article

    Citation Envoyé par wiztricks Voir le message
    Cote schéma, code_article devrait être une clé primaire sinon vous risquez d'avoir des "doublons".
    Oui justement je voulais faire ça, mais je ne trouvais plus le terme (clé primaire). Je suis débutant aussi en SQL ^^

    Merci pour les remarques, je vais corriger un peu tout ça.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    J'avance petit à petit sur mon logiciel et me forme en même temps à Tkinter et sur sqlite.

    J'ai besoin d'aide surtout sur la structure du programme, dans mon idée je veux gérer 3 fichiers ( ma class article, mon core de programme et ma GUI).
    J'ai déjà tester à part ma class article et ma GUI, maintenant il me reste juste le lien à faire dans le core

    En gros : BDD <-->class article <--> Core <--> les class de ma GUI
    Je veux que mon core gère l'ensemble des appels du programme.

    Est-ce que cette structure et une bonne ou mauvaise idée ? ^^
    Quel est la meilleur méthode pour faire le lien entre mon core et ma GUI suivant les événements de la GUI ?

  15. #15
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Pour moi, la classe Article est une partie de Core, car Core est une collection d'articles et un moyen de les manipuler. Core fournit des moyens d'ajouter et de supprimer des éléments du stock et d'afficher le contenu du stock. On voit que Core fournit des fonctions que la GUI va venir utiliser pour faire des actions. Un script ou une interaction en ligne de commandes utiliserait ses fonctions.

    La question suivante est comment représenter le stock. C'est un ensemble d'articles mais est-ce une liste ou un dictionnaire conversé en RAM qu'on viendra charger / sauvegarder de temps en temps ? Est-ce un travail direct sur la BDD ? Dans le 1er cas, on voit que Core a besoin d'un objet (encapsulation) permettant de faire load() et save(), qui pourra utiliser SQLite, MySQL, un système de fichiers custom, etc. Dans le second cas, Core fera un peu passe-plat entre le stockage et la GUI et peut-être que ce ne seront pas des objets séparés. Pour modifier la méthode de stockage, il y a aura peut-être de l'héritage (AbstractCore, CoreSQLite, CustomCore, etc).

    Il n'y a pas forcément de meilleures façons de faire. Le principal est de réfléchir un peu aux possibilités, imaginez d'autres solutions, pour construire quelque chose qui te convient.

    PS : je regarde un peu le code de ta classe Article.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Article:
    	"""Représente un article du stock avec pour paramètre :
            - son code article
            - sa référence 
            - sa désignation
            - sa marque
            - sa famille
            - sa quantité
            - son stock minimum
            - sa quantité à commander
            """
    Ta classe Article contient peut-être trop de choses si tu souhaites faire évoluer ton code par la suite. Ce n'est pas grave pour le moment mais ça ne coûte peut-être pas grand chose de séparer maintenant pour être plus souple dans le futur. Ici, Article contient une description de l'article mais aussi l'état du stock pour cet article et des ordres de commandes. Tout est ensemble. Si demain tu souhaites aussi gérer des commandes dans ta base de données, tu voudras avoir une description de l'article ainsi que les informations sur la commande, comme la quantité commandée et le prix unitaire. Tu te rends compte alors que ton objet Article va poser soucis. Peut-être faut-il :
    - Article : la description d'un article
    - EntréeDuStock : Article + quantité courante + stock minimum
    - Commande : Article + quantité à commander
    Quand tu retires des éléments d'une entrée du stock, tu mets à jour la quantité courante, tu vérifies le stock minimum à respecter et tu déclenches une commande. Article est un objet commun pour partager des informations. Cet objet pourra être utiliser pour gérer une BOM d'un produit, en allant encore plus loin.

    Je ne te dis pas de faire comme, j'essaye juste de te faire réfléchir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.art = [self.code_article, self.reference, self.designation, self.marque, self.famille, self.quantite, self.mini, self.a_cmd]
    A éviter à mon avis ! En effet, tu dupliques les données, dont l'objet consomme 2 fois plus de mémoire et surtout tes données ne seront pas synchronisées par la suite. C'est-à-dire que si tu modifies self.quantite, alors self.art ne sera pas modifié !

    PS2: si ça peut t'inspirer :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    class Article:
        """Article stores the information about an article, such as its code, name, manufacturer, etc."""
     
        def __init__(self, code: str, name: str):
            self.code = code
            self.name = name
     
        def __str__(self):
            return "Article: " + self.code + ":" + self.name
     
     
    class Stock:
        """Stock is a collection of articles and their corresponding quantities."""
     
        def __init__(self):
            self._stock = dict()
     
        def __str__(self):
            string = "Stock:\n"
            for entry in self._stock:
                string += " - "
                string += str(entry) + " --> " + str(self._stock[entry])
                string += "\n"
            return string
     
        def add(self, article: Article, quantity: int):
            self._stock[article] = quantity
     
        def get_quantity(self, article: Article):
            return self._stock[article]
     
     
    class Storage:
        """Storage gives an abstraction to a persistent storage where a Stock can be saved to or loaded from."""
        def save(self, stock: Stock):
            print("Yeah! I am saving the stock a database, file, cloud, whatever!")
     
        def load(self):
            print("Loading the stock.... but it will be empty ^^")
            return Stock()
     
     
     
    # Main program
    mug = Article("art123_a", "Coffee mug")
    sugar = Article("cane_sugar_12356", "Sugar")
    print(mug)
    print(sugar)
     
    stock = Stock()
    stock.add(mug, 3)
    stock.add(sugar, 42)
    print(stock)
     
    print("Sugar in stock: ", stock.get_quantity(sugar))
     
    storage = Storage()
    storage.save(stock)

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par bilou08 Voir le message
    Est-ce que cette structure et une bonne ou mauvaise idée ? ^^
    Quel est la meilleur méthode pour faire le lien entre mon core et ma GUI suivant les événements de la GUI ?
    Comment définir et distribuer rôles et responsabilités entre différents modules/classes a donné lieu à une littérature abondante appelés "patterns". Dans le cas d'une interface graphique, un des plus populaires est mvc et vous en avez plein d'autres.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Bktero Voir le message
    C'est un ensemble d'articles mais est-ce une liste ou un dictionnaire conversé en RAM qu'on viendra charger / sauvegarder de temps en temps ? Est-ce un travail direct sur la BDD ?
    Je travail direct sur la BDD, c'est ce qui me parait le plus logique (enfin avec ma logique de débutant lol)

    Citation Envoyé par Bktero Voir le message
    Dans le second cas, Core fera un peu passe-plat entre le stockage et la GUI et peut-être que ce ne seront pas des objets séparés. Pour modifier la méthode de stockage, il y a aura peut-être de l'héritage (AbstractCore, CoreSQLite, CustomCore, etc).
    A la base, je veux que mon fichier Core me sert de structure de programme :

    Model : avec toutes mes fonctions pour manipuler les données et faire le lien avec la BDD
    GUI : mon interface graphique pour interagir avec l'utilisateur et faire transiter les données saisies
    Core : Contient la structure du programme et qui suivant les événements de ma GUI, fait appel au model pour traiter les données. Il contrôle aussi les changements de vue.
    Et sans le vouloir, je pense que ça ressemble au MVC (mis dans le message précédent par wiztricks)

    Citation Envoyé par Bktero Voir le message
    Ta classe Article contient peut-être trop de choses si tu souhaites faire évoluer ton code par la suite. .......
    Tu as certainement raison, mais je suis plus à l'aise avec mon Article que je gère dans une seul classe avec toutes ces données. Je me rends compte qu'il y a de grande chance que je dois repartir de 0 ou toucher fondamentalement à la structure si je veux le faire évoluer. Mais je dois aussi apprendre de mes erreurs ^^ J'apprends beaucoup de chose en même temps : Python (manipuler les class, les données ..) , Tkinter, SQLite. J'essaye d'être à l'aise avec ce que j'ai écrit pour avancer dans mon programme.

    Quand je vois le code que tu m'a fait, je me dis que j'ai encore beaucoup à apprendre et surtout beaucoup manipuler pour que mon code soit plus clair et bien structurer.

    En tout cas merci pour votre aide et le temps que vous me consacrez

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bilou08 Voir le message
    Tu as certainement raison, mais je suis plus à l'aise avec mon Article que je gère dans une seul classe avec toutes ces données. Je me rends compte qu'il y a de grande chance que je dois repartir de 0 ou toucher fondamentalement à la structure si je veux le faire évoluer. Mais je dois aussi apprendre de mes erreurs ^^ J'apprends beaucoup de chose en même temps : Python (manipuler les class, les données ..) , Tkinter, SQLite. J'essaye d'être à l'aise avec ce que j'ai écrit pour avancer dans mon programme.
    Ton objectif est de faire un soft fonctionnel et d'apprendre ; le mien de te faire réfléchir. Le but n'est pas que tu appliques tout ce que je dis (et tu ne devrais pas car je n'ai qu'une très petite vision de ton problème et nullement la science infuse !), le but est que ça marche, même si tu dois par la suite tout réécrire ou presque. C'est d'ailleurs bien d'en avoir conscience de ça.


    Citation Envoyé par bilou08 Voir le message
    Quand je vois le code que tu m'a fait, je me dis que j'ai encore beaucoup à apprendre et surtout beaucoup manipuler pour que mon code soit plus clair et bien structurer.
    Avec le temps, de la rigueur et de la remise en question, tu y arriveras aussi


    Citation Envoyé par bilou08 Voir le message
    En tout cas merci pour votre aide et le temps que vous me consacrez
    De rien !

  19. #19
    Futur Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mai 2016
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2016
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Re, voici une page simplifier de ce que je suis entrain de tester avec Tkinter.

    Voici comment je voulais procéder :
    - une class Interface --> Qui est ma première fenêtre avec mon menu
    - une class Page_creer_article -->qui est ma page pour la création de mes articles

    En résumé je veux créer une interface et lancer mes différentes Frame qui représente mes différentes pages. Et masquer ou afficher mes pages suivant le besoin avec grid_forget() et grid().

    Donc j'effectue des tests pour voir si ce principe peut fonctionner. Mais il y a un truc qui m'échappe, la page creer_article s'affiche dès la mise en route du programme. Alors que je penser que seul activation du bouton dans le menu "Créer C.A." pouvait créer ma nouvelle page.
    Quelqu'un peut il m'expliquer mon erreur ?

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    from tkinter import *
    from modele import *
     
    class Interface(Tk):
        """Interface principale de l'application stock"""
        def __init__(self):
            Tk.__init__(self)
            self.geometry("725x500")
            self.title("Stock 2.0")
            self.resizable(True,True)
     
            #Menu
            menu = Menu(self)
            sous_fichier = Menu(self, tearoff=0)  # tearoff permet de ne pas détacher le menu
            menu.add_cascade(label="Fichier ", menu=sous_fichier)
            sous_article = Menu(self, tearoff=0)
            menu.add_cascade(label="Article ", menu=sous_article)
     
            #Sous menu de fichier
            sous_fichier.add_command(label="Quitter", command=self.quit)
     
            #Sous menu Article
            sous_article.add_command(label="Créer C.A.", command=Page_creer_article(self))
     
            self.config(menu=menu)
     
    class Page_creer_article(Frame):
        """page pour créer un article, s'active lors de l'appuie dans le menu Article --> créer C.A."""
        def __init__(self, parent):
            Frame.__init__(self, width=725, height=500, borderwidth=2, relief=GROOVE)
            self.parent = parent
            self.grid_propagate(0)
            self.init()
     
        def init(self):
            self.grid()
     
            #Label d'en tête
            txt_intro = Label(self, text="Merci de saisir le nouveau code article :")
            txt_intro.grid(column=0, row=0, padx=5, pady=20, columnspan=3, sticky='w')
     
            #Label pour les entrées
            txt_ca = Label(self, text="Code article :")
            txt_ca.grid(column=0,row=1, padx=5, pady=5)
     
            txt_ref = Label(self, text="Référence :")
            txt_ref.grid(column=1, row=1)
     
            txt_mar = Label(self, text="Marque :")
            txt_mar.grid(column=2, row=1)
     
            #entrée des champs du code article
            global var_ca
            var_ca = StringVar()
            self.entry_ca = Entry(self, textvariable=var_ca)
            self.entry_ca.grid(column=0,row=2, padx=5)
     
            global var_ref
            var_ref = StringVar()
            self.entry_ref = Entry(self, textvariable=var_ref)
            self.entry_ref.grid(column=1, row=2, padx=5)
     
            global var_mar
            var_mar = StringVar()
            self.entry_mar = Entry(self, textvariable=var_mar)
            self.entry_mar.grid(column=2, row=2, padx=5)
     
            #bouton pour valider l'envoi
            valider = Button(self, text="Valider le code article", command=self.creation_ca)
            valider.grid(column=0, row=6, columnspan=5, pady=50)
     
        def creation_ca(self): #actionner par le bouton valider
            """Permet d'envoyer le code article à la BDD lors de l'appuie sur "valider" """
            print("envoi du fichier article")
            art = Article(var_ca.get(), var_ref.get(), var_mar.get())
            print(art)
            try:
                art.ajt_base()
            except:
                print("Erreur !!!")
     
    if __name__ == "__main__":
        app = Interface()
        app.mainloop()

    Pourquoi ma page

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par bilou08 Voir le message
    Alors que je penser que seul activation du bouton dans le menu "Créer C.A." pouvait créer ma nouvelle page.
    Quelqu'un peut il m'expliquer mon erreur ?
    Partez d'une fonction f:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> def f(s):
    ...     print(s)
    ...
    Puis on a une fonction "g"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> def g(command):
    ...     print ('g:', command)
    ...
    Si vous utilisez la même construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> g(command=f('aaa'))
    aaa
    g: None
    >>>
    f('aaa') est évalué et son retour associé au paramètre "command".
    Le "command" du Button n'est pas une formule magique qui dit à Python:"je voudrais que cette fonction là soit appelée mais plus tard...."
    Maîtriser ces constructions de base sont indispensables car plutôt que d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            #Sous menu Article
            sous_article.add_command(label="Créer C.A.", command=Page_creer_article(self))
    et être surpris que çà ne puisse pas fonctionner, vous poseriez la question autrement: comment exécuter Page_creer_article(self) lorsqu'on appuie sur le bouton et non immédiatement.
    Comme vous jouez avec les classes, vous pourriez définir une méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            def do_creer_article(self):
                  Page_creer_article(self)
    qui réalise cette association en dur.
    Et il suffit alors d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            #Sous menu Article
            sous_article.add_command(label="Créer C.A.", command=self.do_creer_article)
    magique? non self.do_creer_article s'appelle méthode parce que c'est l'association de "self" avec une fonction do_creer_article qui pourra être appelée plus tard.

    note: ici çà fonctionne bien parce que ce n'est que "self". Dans le cas plus général, on passe par des lambda ou des closures et ce sont des mécanismes que vous trouverez dans tout bon tuto.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Gestion de stock : Formule en section Détail
    Par JeremieT dans le forum IHM
    Réponses: 4
    Dernier message: 16/12/2005, 18h02
  2. Gestion de stock CMUP après chaque entrée
    Par priest69 dans le forum Access
    Réponses: 9
    Dernier message: 13/12/2005, 11h03
  3. Gestion de stock - Prix Moyen Pondéré
    Par hugo69 dans le forum Access
    Réponses: 33
    Dernier message: 28/10/2005, 18h03
  4. Analyses du progiciel de gestion de stock COSWIN CS 5.2
    Par africanroseonlyone dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 13/10/2005, 16h01
  5. gestion des stocks
    Par gekondo dans le forum Access
    Réponses: 1
    Dernier message: 30/09/2005, 12h41

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