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

  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 752
    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 752
    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 835
    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 835
    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 835
    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 835
    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 : 149
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 : 153
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 835
    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 835
    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]

  8. #8
    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,

    Je vais essayer cette solution, donc avant de supprimer une ligne, je stocke l'identificateur de ligne récupérée depuis item.data(), dans disant une liste,
    marquer dans la colonne Etat ( colonne invisible dans la QTableWidget) Etat de la ligne ( "0" : Ligne sans modifications, "1" : Ligne Modifiées et "2" : Nouvelle Ligne à insérer ) puis lorsque l'utilisateur clique sur valider : je parcoure la liste des lignes à supprimer et lancer les delete, parcourir les lignes duQtableWidget voire l'etat des lignes restantes et lancer les updates et insert selon l'état de la ligne, je vais suivre cette idée et vous rendre le résultat avec des extraits du code.
    Merci beaucoup @+

  9. #9
    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
    Bonsoir Tout le Monde,
    j'ai reprogrammé mes méthodes pour utiliser les fonctions setdata() et data() et j'ai laissé tombé l''idée de la colonne 'Etat', alors l'état de la ligne détail est stockée dans le premier item de chaque ligne, au chargement des lignes de la base de donnée rien n'est stocké :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      def PopulateDetailsMandat(self, data):
            if self.mode == 1: # la fiche est en mode modification 
                self.TableLigneMandat.setRowCount(len(data))
                for (index_row, row) in enumerate(data):
                    for (index_cell, cell) in enumerate(row):
                        self.TableLigneMandat.setItem(index_row, index_cell, QTableWidgetItem(str(cell)))
    si l'utilisateur modifie ou ajoute une ligne a travers une autre fenêtre on récupère ses modifications par la méthode :
    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
     
           def recupinfos(self, liste):
            self.wind.hide()  # cache la fenêtre dialog encore affichée (elle sera fermée juste après)
            if liste[0] == 0:  # insertion
                rowPosition = self.TableLigneMandat.rowCount()
                self.TableLigneMandat.insertRow(rowPosition)
                item = QTableWidgetItem(str(0))
                item.setData(Qt.UserRole, QVariant(2))
                self.TableLigneMandat.setItem(rowPosition, 0, item)
                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]))
     
            else:  # modification
                rowPosition = self.TableLigneMandat.currentRow()
                if self.TableLigneMandat.item(rowPosition, 0).data(Qt.UserRole) != 2:
                    self.TableLigneMandat.item(rowPosition, 0).setData(Qt.UserRole, QVariant(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.mise_a_jour_ligne()
            self.somme()
            self.mise_a_jour_ligne()
    alors on stocke dans l'item 0 de la ligne un "1" pour une modification ou "2" pour une insertion
    lorsque l'utilisateur supprime une ligne , on stocke un "3" et on cache la ligne au lieu de la supprimer du TableWidget
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        def SuppLigne(self):
            if self.TableLigneMandat.rowCount() != 0:
                if self.TableLigneMandat.currentRow() == -1:
                    Dialogue_information("Veuillez selctionner la ligne à supprimer")
                else:
                    try:
                        if self.TableLigneMandat.rowCount() >= 1:
                            self.TableLigneMandat.item(self.TableLigneMandat.currentRow(), 0).setData(Qt.UserRole,QVariant(3))
                            self.TableLigneMandat.hideRow(self.TableLigneMandat.currentRow())
                        self.somme()
                        self.mise_a_jour_ligne()
                    except:
                        pass
    la méthode mise_a_jour_ligne() est là pour réordonner les lignes (1,2,3,...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        def mise_a_jour_ligne(self):
            lignes = self.TableLigneMandat.rowCount()
            numero_ligne = 1
            for i in range(lignes):
                if not (self.TableLigneMandat.item(i, 0).data(Qt.UserRole) == 3):
                    self.TableLigneMandat.item(i, 1).setText(str(numero_ligne))
                    if not (self.TableLigneMandat.item(i, 0).data(Qt.UserRole) == 2):
                        self.TableLigneMandat.item(i,0).setData(Qt.UserRole,QVariant(1))
                    numero_ligne += 1
    une fois l'utilisateur termine ses modifications clique sur ajouter pour mettre a jour la base de donnée selon l'état du premier item de chaque ligne,
    éventuellement mettre a jour les modification de l'enregistrement master :
    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
     
        def Ajouter(self):
            data = (GlobalsVars.GetExericeDeTravail(), self._numero, GlobalsVars.GetCodeGestionnaire(), self._montant,
                    self.dateMandat.text(), self.dateMandat.date().month())
            if self.mode == 0:  # c'est une insertion
                insert_mandat(data)
            else:  # c'est une modification d'un mandat
                update_mandat(self._idMandat, data)
     
            lignes = self.TableLigneMandat.rowCount()
            for i in range(lignes):
                if (self.TableLigneMandat.item(i, 0).data(Qt.UserRole) == 3):# supression de la ligne
                    if self.TableLigneMandat.item(i, 0).text() != '0': # "0" la ligne a eté crée puis supprimé sans mise a jour de la BD
                        delete_ligne_mandat(self.TableLigneMandat.item(i, 0).text())
                elif (self.TableLigneMandat.item(i, 0).data(Qt.UserRole) == 1):  # Modification de la ligne
                    print('modification de la ligne')
                    data_ligne = (self.TableLigneMandat.item(i, 1).text(), self.TableLigneMandat.item(i, 2).text(), self.TableLigneMandat.item(i, 4).text())
                    print(data_ligne)
                    update_ligne(self.TableLigneMandat.item(i, 0).text(), data_ligne)
                elif (self.TableLigneMandat.item(i, 0).data(Qt.UserRole) == 2):  # Insertion d'une nouvelle ligne
                    data_ligne = (Select_idMandat_by_num(self._numero),self.TableLigneMandat.item(i, 1).text(),
                                  self.TableLigneMandat.item(i, 2).text(), self.TableLigneMandat.item(i, 4).text())
                    insert_paiement(data_ligne)
            self.fermer()
    le code marche très bien je ne sais pas si c'est optimal ???????
    Merci a vous @.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par azizsaadi06008 Voir le message
    le code marche très bien je ne sais pas si c'est optimal ???????
    Une optimisation ne se justifie que si tu dois traiter des milliers d'infos. Là fatalement on préfèrera un code qui fait le job en 5 secondes plutôt que 15. Mais optimiser un truc qui regarde quelle ligne a été supprimée d'un QTableWidget pour lancer le delete correspondant...

    En revanche ce qui est gênant ce sont tes valeurs magiques "1" pour insertion, "2" pour modification. Regarde Qt ui utilise des valeurs nommées ex "Qt.UserRole", c'est un peu plus lisible...
    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]

  11. #11
    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
    Re Bonjour
    jai toujours cru que Qt.UserRole est une clés de valeur et non pas la valeur elle même, par exemple dans la méthode def recupinfos(self, liste) ci dessus j'ai les lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    item = QTableWidgetItem(str(0))
    item.setData(Qt.UserRole, QVariant(2))
    ici Qt.UserRole est une définition d''un rôle qui référence une donnée qui 2 , on peut bien définir un autre rôle par exemple Qt.UserRole +1 , qui pointe vers une autre donnée.....etc
    ou je me trompe ????

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par azizsaadi06008 Voir le message
    ici Qt.UserRole est une définition d''un rôle qui référence une donnée qui 2 , on peut bien définir un autre rôle par exemple Qt.UserRole +1 , qui pointe vers une autre donnée.....etc
    ou je me trompe ????
    Oui tu te trompes. Le premier paramètre de setData() indique à quoi la data est destinée. Si ce paramètre vaut 0 alors c'est une data destinée à être affichée. S'il vaut 1 c'est une data destinée à être visualisée sous forme d'icone. S'il vaut 2 c'est une data destinée à être éditée, etc.
    Et pour plus de lisibilité les programmeurs ont codé ces valeurs dans des attributs d'objet Qt avec des noms plus explicites et lisibles
    https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum
    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]

  13. #13
    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 beaucoup Sve@r , là j'ai compris et merci pour tes explications et orientations .@+

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