salut à tous,
Voici le contexte : avec python 3 et pyqt4, je demande à mon petit script d'accéder une BDD SQLITE3, de réaliser des calculs et de remplacer les valeurs dans les champs de la BDD.
J'ai écrit une première version en utilisant des QSqlQueryModel, ça fonctionne correctement mais c'est un peu long et du coup l'affichage est gelé, l'utilisateur doit attendre la fin du traitement. A chaque itération de la boucle while, je mets à jour les données de la BDD en préparation de l'opération suivante, ce qui je pense ajoute du temps de traitement.
voici le code avec qsqlquerymodel
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 while index <= 12: print("***calcul total crédit***") TotalCredit = self.CalculTotal("credit", index, anneeTraitee) print("total crédit du mois {}/{} : {}".format(index, anneeTraitee, TotalCredit)) print("***calcul total débit***") TotalDebit = self.CalculTotal("debit", index, anneeTraitee) print("total débit du mois {}/{} : {}".format(index, anneeTraitee, TotalDebit)) print("***calcul solde***") SoldeMois = Decimal(TotalCredit - TotalDebit).quantize(Decimal('1.00')) print("Solde du mois {}/{} : {}".format(index,anneeTraitee, SoldeMois)) #MAJ les tables credit débit et solde query = QSqlQueryModel() query.setQuery("UPDATE CreditParMois SET Total = {} WHERE NMois = {} AND Annee = {}".format(TotalCredit, index, anneeTraitee)) if query.lastError().isValid(): QMessageBox.warning(self,"requete TotalCredit",query.lastError().text()) query.setQuery("UPDATE DebitParMois SET Total = {} WHERE NMois = {} AND Annee = {}".format(TotalDebit, index, anneeTraitee)) if query.lastError().isValid(): QMessageBox.warning(self,"requete TotalDebit",query.lastError().text()) query.setQuery("UPDATE SoldeParMois SET Total = {} WHERE NMois = {} AND Annee = {}".format(SoldeMois, index, anneeTraitee)) if query.lastError().isValid(): QMessageBox.warning(self,"requete SoldeMois",query.lastError().text()) #MAJ du solde à nouveau du mois suivant #teste si le poste existe pour le mois suivant #si mois = 12 teste si le poste existe pour le mois de janvier de l'année suivante if index == 12: #permet les MAJ bilan pour le mois de décembre (ne passe qu'une fois dans la boucle) MoisSuivant = 1 anneeTraitee = anneeTraitee + 1 else: MoisSuivant = index+1 print("*** MAJ solde à nouveau {}/{} ***".format(MoisSuivant, anneeTraitee)) if MoisSuivant <= 12: if MoisSuivant >= 10: filtre ="date >= '{}-{}-01' AND date <= '{}-{}-31'".format(anneeTraitee, MoisSuivant,anneeTraitee, MoisSuivant) else: filtre ="date >= '{}-0{}-01' AND date <= '{}-0{}-31'".format(anneeTraitee, MoisSuivant, anneeTraitee, MoisSuivant) query.setQuery("UPDATE Operations SET Montant = {} WHERE IDPoste = '13' AND {}".format(SoldeMois, filtre)) if query.lastError().isValid(): QMessageBox.warning(self,"Erreur MAJ solde à nouveau pour {}/{}".format(MoisSuivant,anneeTraitee),query.lastError().text()) else: #print("MAJ solde à nouveau du mois {} ok !".format(MoisSuivant)) #il faut remettre à jour la BDD à chaque fois QSqlDatabase.database().commit() self.completed = True self.emit(SIGNAL("afficheTotaux(bool)"),self.completed) index = index + 1
Même en mettant le code dans un thread à part, ça reste lent, ça m'étonne un peu mais bon.
Donc du coup je me suis dit que peut-être en utilisant un QSqlTableModel ça fonctionnerait plus vite car la BDD ne serait mise à jour qu'à la fin de tous les traitements.
ce qui donne ce code
et là, c'est le drame, après application du filtre et du select, je n'arrive même pas à récupérer des valeurs, à priori je ne récupère rien, mes record sont égaux à None. Si quelqu'un a une idée, je preneur; peut-être avec un data/setdata ?
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 while index <= 12: TotalCredit = self.CalculTotal("credit", index, anneeTraitee) print("total crédit du mois {}/{} : {}".format(index, anneeTraitee, TotalCredit)) TotalDebit = self.CalculTotal("debit", index, anneeTraitee) print("total débit du mois {}/{} : {}".format(index, anneeTraitee, TotalDebit)) SoldeMois = Decimal(TotalCredit - TotalDebit).quantize(Decimal('1.00')) print("Solde du mois {}/{} : {}".format(index,anneeTraitee, SoldeMois)) #MAJ les tables credit débit et solde #défini le filtre pour les modèles filtre = "NMois = {} AND Annee = {}".format(index, anneeTraitee) print(filtre) modelCreditParMois.setFilter(filtre) modelDebitParMois.setFilter(filtre) modelSoldeParMois.setFilter(filtre) modelCreditParMois.select() #rempli les tables modelDebitParMois.select() modelSoldeParMois.select() print("ligne credit = {}".format(modelCreditParMois.rowCount(QModelIndex()))) #ne devrait remonter qu'une seule ligne correspondant à un mois d'une année print("ligne debit = {}".format(modelDebitParMois.rowCount(QModelIndex()))) print("ligne solde = {}".format(modelSoldeParMois.rowCount(QModelIndex()))) creditRecord = modelCreditParMois.record(0) #grace au filtre le modele ne doit contenir qu'un seul enregistrement debitRecord = modelDebitParMois.record(0) soldeRecord = modelSoldeParMois.record(0) if creditRecord.isEmpty() == False: print("valeur avant modif = {}".format(creditRecord.value(3))) #valeur du champs Total creditRecord.setValue(3, TotalCredit) print("{}".format(creditRecord.value(3))) else: print("record vide !") if debitRecord.isEmpty() == False: print("valeur avant modif = {}".format(debitRecord.value(3))) debitRecord.setValue(3, TotalDebit) else: print("record vide !") if soldeRecord.isEmpty() == False: print("valeur avant modif = {}".format(soldeRecord.value(3))) soldeRecord.setValue(3, SoldeMois) else: print("record vide !") #MAJ du solde à nouveau du mois suivant #teste si le poste existe pour le mois suivant #si mois = 12 teste si le poste existe pour le mois de janvier de l'année suivante if index == 12: #permet les MAJ bilan pour le mois de décembre (ne passe qu'une fois dans la boucle) MoisSuivant = 1 anneeTraitee = anneeTraitee + 1 else: MoisSuivant = index+1 print("*** MAJ solde à nouveau {}/{} ***".format(MoisSuivant, anneeTraitee)) if MoisSuivant <= 12: if MoisSuivant >= 10: filtreOp ="IDPoste = '13' AND date >= '{}-{}-01' AND date <= '{}-{}-31'".format(anneeTraitee, MoisSuivant,anneeTraitee, MoisSuivant) else: filtreOp ="IDPoste = '13' AND date >= '{}-0{}-01' AND date <= '{}-0{}-31'".format(anneeTraitee, MoisSuivant, anneeTraitee, MoisSuivant) modelOperation.setFilter(filtreOp) modelOperation.select() op = modelOperation.record(0) if op.isEmpty() == False: op.setValue(6, SoldeMois) #montant du solde à nouveau du mois suivant = SoldeMois else: print("record vide !") #il faut mettre à jour les tables de la BDD modelCreditParMois.submitAll() modelDebitParMois.submitAll() modelSoldeParMois.submitAll() modelOperation.submitAll() self.completed = True self.emit(SIGNAL("afficheTotaux(bool)"),self.completed) index = index + 1
l'autre point où j'aimerai un/des avis concerne l'utilisation de qsqlquerymodel ou de qsqltablemodel en termes de temps d'accès à une BDD, y-en-a-t-il un plus rapide que l'autre ?
j'espère avoir été assez clair
merci d'avance et bonne soirée
Nico
Partager