truc2geek

2013/05/07

Carnet d’Adresse, part 10 : v0_011 (SuppData, DataLiee ; suite)

Précédemment, on s’est aperçu que Python 2.6.5 utilise la version 2.5.9 de SQLite, qui ne gère pas l’intégrité référentielle.
Cette fois, on va donc installer Python 2.7, vérifier que l’appli fonctionne comme avant, et coder la suppression des données.

Python 2.7

Sur mon poste, c’est la version 2.7.3 de Python que j’ai installée.

A ce jour, la dernière version de Python disponible dans la branche 2.x est la 2.7.4.
Pour un PC sous Windows 64 bits, télécharger l’installeur MSI encadré ci-dessous :
01.gif

L’installation ne devrait pas poser de problème.

tester l’application

On copie l’application dans un dossier de test, on la lance.
06.gif

pas de problème pour l’instant, on va essayer de créer une adresse :
05.gif

on valide et on est bien redirigé vers le menu « Principal », on vérifie que l’adresse a été enregistrée :
07.gif

Pas de problème, l’appli fonctionne sous Python 2.7 sans modification.

tester l’intégrité référentielle

On lance le même test que dans l’article précédent, soit la fonction TestSuppDonneeLiee, qui tente de supprimer l’adresse 9 alors que la personne 9 est rattachée à cette adresse.

rappel du code :
10.gif

11.gif

on lance le test, qui s’exécute puis on est redirigé vers le menu ‘principal’, où on entre ‘3’ pour afficher le menu des adresses :
12.gif

L’adresse 9 n’est plus listée : elle a été supprimée par le test… donc on n’a toujours pas d’intégrité référentielle.

On modifie la fonction de test, pour y inclure la requête que l’on exécute dans le shell pour activer l’intégrité référentielle :
PRAGMA FOREIGN_KEYS = ON
13.gif

on lance le test :

l’application plante, on la relance pour afficher les adresses :
14.gif

ok, cette fois l’adresse n’a pas été supprimée, c’est le bon résultat mais il faut éviter le plantage.
On essaie avec un bloc try – except :
16.gif

17.gif

on crée une fonction qui sera chargée d’exécuter les instructions SQL :
19.gif

la fonction TestSuppDonneeLiee devient :
20.gif

voici ce que donne l’exécution :
21.gif

dans toute l’appli, on utilisera cette fonction ExeSql pour exécuter les requêtes de type INSERT, UPDATE et DELETE.
Pour l’instant, hormis la fonction TestSuppDonneeLiee, une seule requête d’un de ces types est utilisée : à la fin de la fonction CreaData, qui devient :
22.gif

on supprime la fonction de test TestSuppDonneeLiee, et on modifie la fonction Principal.
Cette version est la v0_010_01, elle est disponible ici et le fichier CarnetAdresse.db est disponible ici.

la suppression des données

Par exemple pour les adresses :
à partir du menu de gestion des adresses, l’utilisateur pourra entrer « 3 9 » pour supprimer l’adresse à HELETTE :
08.gif

il faut alors :

  • vérifier si la donnée est rattachée à d’autres, auquel cas on ne peut pas la supprimer
  • si la donnée est supprimable, demander à l’utilisateur de confirmer
  • effectuer la suppression
  • informer l’utilisateur du résultat

déterminer si la donnée est liée

voici une ébauche de la fonction SuppData, qui doit recevoir deux informations :
de quel type est la donnée qui doit être supprimée (une personne, une adresse…)
quel est l’identifiant de la donnée
23.gif

La fonction chargée de vérifier si la donnée est liée :
A partir du type de donnée, obtenir :

  • le nom du champ qui est la clé primaire de cette table, car les clés étrangères reprennent le nom des clés primaires
  • la liste des tables qui reprennent ce type de donnée ; la table ‘T_d_Personne’ pour les adresses par exemple

pour chaque table, chercher si au moins un enregistrement est lié à la donnée qu’on veut supprimer
renvoyer l’information soit que la donnée n’est pas liée, soit qu’elle est liée et préciser à combien de tables et lesquelles.

On a déjà une fonction qui donne des informations concernant un type de donnée, c’est InfoData, qui gère :

  • le nom de la table
  • la requête SQL à utiliser dans la fonction GererData

On va compléter la fonction InfoData pour qu’elle puisse renvoyer les informations nécessaires à la fonction SuppData :
24.gif

Seulement dans le cas où le tuple contient une seule valeur, celle-ci doit être suivie d’une virgule, comme ici :
25.gif

Pour les données ‘personne’ et ‘groupe’, on a pour l’instant défini aucune table liée, ce qui est bien sûr faux mais on modifiera plus tard.

Le code de la fonction DataLiee :
33.gif

Après avoir récupéré le nom de la clé primaire et la liste des tables liées, on regarde si la variable vTableAval est de type string.
C’est utile car InfoData retourne, pour la liste des tables liées, soit la chaîne ‘Aucun’ soit un tuple contenant le nom de la (des) table(s).
voici un test effectué dans le shell de l’IDLE Python pour tester le type d’une chaîne :
38.gif

On code la première partie de la fonction SuppData, qui pour l’instant ne fait qu’appeler DataLiee et afficher un message si la donnée n’est pas supprimable :
34.gif

On ouvre les tables T_d_Adresse puis T_d_Personne avec SQLite Expert :
30.gif

29.gif

Les adresses 1, 2, 3, 4 et 9 sont liées à des personnes, et les autres (5 à 8) sont donc supprimables.

on teste en demandant la suppression de l’adresse 1 ; cette suppression devrait être refusée :
35.gif

le résultat est ok, maintenant on demande une suppression qui devrait être acceptée avec l’adresse 5:
36.gif

là aussi le résultat est ok : cette adresse est bien considérée comme supprimable.

la suite de SuppData

40.gif

tester la suppression d’une adresse de l’adresse 1, qui devrait être refusée :
41.gif

Le test est ok : la suppression est refusée, et on est redirigé vers le menu Principal.

tester la suppression de l’adresse 5, qui devrait être acceptée :
43.gif

Le test est ok : l’adresse a été supprimée.

On retourne dans le menu de gestion des adresses pour vérifier :
44.gif

ok, l’adresse a bien été supprimée.

Conclusion

la suppression des données est fonctionnelle.
L’application est disponible ici, et la BD ici.

La prochaine étape sera de permettre la mise à jour des données.

Publicités

Laisser un commentaire »

Aucun commentaire pour l’instant.

RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Propulsé par WordPress.com.

%d blogueurs aiment cette page :