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 :

Meilleures Méthode pour la mise à jour des données SQLITE


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2018
    Messages : 8
    Par défaut Meilleures Méthode pour la mise à jour des données SQLITE
    Bonjour Tout le Monde;

    Dans mon application Python - PyQt5 - , j'ai à ajouter, modifier et supprimer des données SQLITE, pour les données maitre- détails je coince sur la bonne manière de mettre à jour les données lors de l'ajout, suppression ou modifications des lignes détails déjà existants d'un enregistrement maitre existant. les données du maitre-détails sont affichées dans des composants visuels comme QLineEdit, QTableWidget, QLabel ..etc; et lorsque l'utilisateur clique sur valider les modification, je supprimer les lignes détails et l'enregistrements maitre, puis j'insère les modifications comme nouveaux enregistrements.
    cette méthode méthode marche bien, mais je pense qu'elle n'est pas correcte et pas cohérente.
    merci de m'éclairer sur la bonne manière de gérer les opérations CRUD de maitre-détails.
    .

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 677
    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 677
    Par défaut
    Salut,

    Citation Envoyé par azizsaadi06008 Voir le message
    cette méthode méthode marche bien, mais je pense qu'elle n'est pas correcte et pas cohérente..
    Une méthode / pattern de programmation peut se coder "avec" Python... Déjà il faudrait savoir de quoi on parle car si çà m'a l'air de vieux trucs Windows, un peu de précision serait bienvenu. Et enfin si on poste dans un forum Python, c'est qu'on a du code à montrer pour illustrer...

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par azizsaadi06008 Voir le message
    lorsque l'utilisateur clique sur valider les modification, je supprimer les lignes détails et l'enregistrements maitre, puis j'insère les modifications comme nouveaux enregistrements.
    cette méthode méthode marche bien, mais je pense qu'elle n'est pas correcte et pas cohérente..
    Exact, pas correcte. Imagine que ta ligne "détail" soit elle-même maître d'un 3° sous-ensemble... En supprimant la ligne cela supprime par ricochet tous les enregistrements dont elle est maître (mode cascade).
    Une modification dans ton IHM doit se traduire par une modification en bdd. sqlite accepte les ordres SQL standards tels que update donc tu peux parfaitement modifier en bdd l'information modifiée dans l'IHM.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2018
    Messages : 8
    Par défaut
    Merci pour vos réponses ;
    l'idée de Sve@r me semble logique, donc sur la fenêtre maitre-détails je donne la main à l'utilisateur de modifier/ajouter/supprimer les lignes détails puis une fois il valide les modifications je met à jour les données de l'enregistrement maitre, puis j'essaie de mettre a jour chaque enregistrement des lignes détails si en retour y'a une exception indiquant que l'enregistrement n'existe pas alors j'insère la ligne comme nouveau enregistrement., la prochaine fois , je vais illustrer ses étapes avec des lignes de code .....@+

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par azizsaadi06008 Voir le message
    puis j'essaie de mettre a jour chaque enregistrement des lignes détails si en retour y'a une exception indiquant que l'enregistrement n'existe pas alors j'insère la ligne comme nouveau enregistrement.
    Tu peux savoir dès la saisie si l'information existe déjà (modification) ou est nouvelle (insertion).
    Personnellement dans mes IHM j'affiche l'existant mais je programme le clic droit de la souris avec un menu évènementiel contenant "ajouter". Là une ligne vierge s'ouvre permettant d'insérer une nouvelle ligne détail.
    Ensuite donc je sais si les informations viennent des lignes déjà présentes (update) ou de lignes vierges (insert)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juillet 2018
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2018
    Messages : 8
    Par défaut
    Bonjour tout le monde
    j'ai suivi lidée de Sve@r,
    Voila ma fenêtre IHM : Nom : fenetre IHM.jpg
Affichages : 143
Taille : 56,1 Ko
    j'ai ajouter une colonne à ma QTABELWIDGET qui stock l'état de la ligne que je vais rendre par la suite invisible, au chargement des lignes de la base de données j'affecte un "0" à cette colonne,
    si l'utilisateur modifie la ligne a travers le bouton Modifier la cellule passe à "1" , si l'utilisateur ajoute une nouvelle ligne a travers le bouton Nouveau la cellule d'état de la ligne passe à "2" voici la fenêtre de modification ou d'ajout d'une ligne :
    Nom : fenetre IHM 2.png
Affichages : 151
Taille : 4,6 Ko
    Cette fenêtre renvoie une liste d'information que je récupère a travers la fonction suivante :
    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 recupinfos(self, liste):
            self.wind.hide()  # cache la fenêtre dialog encore affichée (elle sera fermée juste après)
            if liste[1] ==None:
                QMessageBox.information(self," pas de modification ou insertion, Récupération des infos:","nombre 1: {}\nnombre 2: {}".format(liste[0], liste[1]))
            else:
                if liste[0]==0:# insertion
                    rowPosition = self.TableLigneMandat.rowCount()
                    self.TableLigneMandat.insertRow(rowPosition)
                    self.TableLigneMandat.setItem(rowPosition,1, QTableWidgetItem(str(rowPosition+1)))
                    self.TableLigneMandat.setItem(rowPosition,2, QTableWidgetItem(str(liste[1])))
                    self.TableLigneMandat.setItem(rowPosition,3, QTableWidgetItem(liste[2]))
                    self.TableLigneMandat.setItem(rowPosition,4, QTableWidgetItem(liste[3]))
                    self.TableLigneMandat.setItem(rowPosition,5, QTableWidgetItem("2"))
                    try:
                        (float(QTableWidgetItem(liste[3]).text()))
                        print ( ' le montant saisi est un float')
                        print(QTableWidgetItem(liste[3]).text())
                    except:
                        print("************************** ******************************")
                    self.somme()
                else: # modification
                    print(" mode modification")
                    rowPosition = self.TableLigneMandat.currentRow()
                    self.TableLigneMandat.setItem(rowPosition, 2, QTableWidgetItem(liste[1]))
                    self.TableLigneMandat.setItem(rowPosition, 3, QTableWidgetItem(liste[2]))
                    self.TableLigneMandat.setItem(rowPosition, 4, QTableWidgetItem(liste[3]))
                    if self.TableLigneMandat.item(rowPosition, 5).text()!="2":
                        self.TableLigneMandat.setItem(rowPosition, 5, QTableWidgetItem("1"))
                    self.somme()
    TableLigneMandat étant ma Qtablewidget.
    avec cette méthode j'ai l'information sur les lignes existantes non modifiées, les lignes modifiées et les lignes insérées
    mais comment je sauvegarde l'information lorsque la ligne est supprimée !!!!!!

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 800
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par azizsaadi06008 Voir le message
    mais comment je sauvegarde l'information lorsque la ligne est supprimée !!!!!!
    C'est pas mal ce que tu as fait. Tu te débrouilles bien avec Qt. Attention toutefois avec Python car pour comparer un truc avec None on n'écrit pas if truc == None mais if truc is None. Déjà parce que "None" c'est pas une valeur mais un état et surtout parce que l'opérateur "is" est le seul opérateur qui ne puisse pas être surchargé (si par exemple je surcharge l'opérateur "égal", je peux faire en sorte que tous tes tests if truc == None soient tous vrais ou faux selon mon humeur). Alors que if truc == None sera le vrai test officiel Python.

    Pour ton souci de suppression, voilà ce que tu peux faire : chaque QTableWidgetItem (la ligne donc) peut stocker une data de travail via setData(). C'est pas mal cette fonction setData() qui permet de stocker des informations de travail dans les objets Qt (quasiment tous). Juste que ça t'oblige à créer un QTableWidgetItem que tu peux ensuite insérer dans ton QTableWidget.
    Donc d'abord item=QTableWidgetItem(...) puis item.setData(Qt.UserRole, QVariant(identifiant)) avant d'insérer l'item dans le QTableWidgetItem.

    Quand tu supprimes la ligne, tu sais de quel item il s'agit. Tu peux donc réupérer l'identifiant bdd (via identifiant=item.data()) et tu peux donc lancer delete from table where nom_col=identifiant.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/02/2019, 09h24
  2. [JTable] mise à jour des données
    Par tripop dans le forum Composants
    Réponses: 3
    Dernier message: 04/02/2009, 18h52
  3. Mise à jour des données
    Par Alex063 dans le forum Access
    Réponses: 6
    Dernier message: 31/01/2006, 17h16
  4. MySqlDAC et mise à jour des données
    Par charliejo dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/01/2006, 09h25
  5. mise à jour des données toutes les semaines...
    Par Toff !!!!! dans le forum Access
    Réponses: 20
    Dernier message: 22/12/2005, 11h38

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