truc2geek

2013/10/30

Carnet d’Adresse, part 15 : v0_015 (liens personnes – groupes)

Filed under: Carnet d'adresses (Python), Programmation, Projets, Python, SQLite — Étiquettes : — truc2geek @ 00:38

Précédemment, on a créé la vue V_p_Groupe qui affiche les liens entre les groupes et les personnes, et mis à jour le champ « nb_personne » de la table T_d_Groupe, pour tous les groupes existants.
Il est temps d’afficher ces liens à l’utilisateur.

Détail d’un groupe

Le code

Dans le menu de gestion des groupes, il faut ajouter un choix permettant d’afficher la vue détaillée d’un groupe, c’est-à-dire non seulement les informations du groupe lui-même (le nom du groupe, le nombre de personnes rattachées) mais aussi la liste des personnes rattachées.

La fonction VoirDetailData() permet d’afficher cette vue.
Elle attend en argument, comme beaucoup de fonctions de cette appli, vDonneeType et vDonneeId, soit le type et l’id de la donnée à gérer. Mais à ce stade, seules les données de type « groupe » sont gérées.
07.gif

Bien sûr, pas de nouvelle fonction sans modification d’une fonction existante, pour l’appeler.
Ci-dessous, la nouvelle version de la fonction GererData() :
02.gif
03.gif

La démo

04.gif

08.gif

Détail d’une personne

On pourra afficher la vue détaillée d’une personne, à partir du menu de gestion des personnes, de la même manière, et en utilisant la même vue V_p_Groupe pour les liens personnes/groupes.

Le code

La fonction VoirDetailData devient :
09.gif
10.gif

Du côté de la fonction GererData, on propose d’afficher la donnée en détail pour les personnes en plus des groupes :
11.gif

La démo

12.gif

L’appli plante, on refait la manip en exécutant l’appli depuis l’IDE pour identifier le problème :

13.gif

C’est donc cette ligne qui plante :
14.gif

Rien de vraiment choquant, on va voir au niveau des données :

Dans la ligne de code 693, row[3] et row[4] font référence aux champs « adresse2 » et « adresse3 » :
15.gif

Le message d’erreur parle de l’objet NoneType, a priori le fait d’avoir une valeur nulle.
Dans l’adresse 9, on a des valeurs vides à la place.
Essayons d’afficher le détail de Joe Lecowboy :

16.gif

Pas d’erreur cette fois, ok.

La solution

Pour les données qui sont présentes actuellement dans la DB, il faut remplacer les valeurs nulles par des chaînes vides.
Et pour éviter que le problème se reproduise avec les futures données, il faut modifier le code qui permet de créer les données :

Les enregistrements de la table T_d_Adresse concernés sont :
19.gif

On teste dans la console, la clause WHERE qui permet de filtrer sur les enregistrements concernés :

17.gif

20.gif

On remplace les valeurs nulles par des chaînes vides, puis on vérifie :
21.gif

Tester comment est construite la requête lors de la création des données, on ajoute une ligne dans la fonction CreaData pour afficher la requête :
22.gif

On crée une adresse, sans entrer de valeurs pour les champs « adresse2 » et « adresse3 ».
On a une chaîne vide pour ces champs :
24.gif

On va voir avec SQLite Expert :
25.gif

On a bien simplement des chaînes vides, et pas de valeurs nulles, rien à modifier concernant la création des données ; reste simplement à supprimer la ligne qui affiche la requête.

Concernant la mise à jour de données, vérifier la même chose :

26.gif

27.gif

28.gif

Pour voir s’ils seront traités différemment, on valide le champ « adresse2 » sans valeur, et on met ‘/’ pour « adresse3 ».
Mais comme aucune valeur n’a été modifiée, la requête de mise à jour, UPDATE, n’a été ni exécutée ni construite.
On recommence en modifiant vraiment la valeur d’un champ :

29.gif

30.gif

Ok, la requête de mise à jour a bien été construite et exécutée, et seuls deux champs ont été mis à jour : « adresse1 » et « maj ».
La valeur des champs « adresse2 » et « adresse3 » est donc toujours une chaîne vide, normal, et donc tout va bien.
Là encore, reste simplement à supprimer la ligne de code dans MajData, qui a servi à afficher la requête.

Avec cette version de l’application, on n’a pas de nouvelles valeurs nulles dans la DB, donc pas de modif à faire au niveau du code, il faut
encore remplacer les valeurs nulles par des chaînes vides dans les autres tables :

Seules deux autres tables contiennent des valeurs vides : T_d_Email et T_d_Numero :

32.gif

33.gif

On reste dans SQLite Expert pour modifier les valeurs et vérifier :

34.gif

35.gif

36.gif

37.gif

Améliorer la navigation

L’application permet d’avoir la vue détaillée d’une personne ou d’un groupe, c’est bien mais à partir de la vue détaillée, on ne peut
que taper « entrée » pour aller au menu Principal :
31.gif

Ce serait bien d’avoir le choix entre :
aller au menu Principal
retourner au menu de gestion des groupes
créer un groupe
modifier le groupe qu’on a affiché en détail
supprimer le groupe qu’on a affiché en détail
afficher la vue détaillée de l’une des personnes liées à ce groupe

code pour la vue détaillée des personnes

Quand on liste les groupes auxquels cette personne est liée, on affiche leur id, pour que l’utilisateur puisse ensuite désigner celui qu’il voudra voir en détail.

Pour la saisie utilisateur, on utilise donc la fonction ValidChoix2, comme dans GererData.
Elle traite correctement la saisie et prend en arguments : la liste des actions possibles, la règle associée à chacune (pour chaque action, faut-il renseigner un id), et la liste des id acceptés :

38.gif

On déplace le code qui propose de taper « entrée » pour aller au menu Principal : il ne concerne plus que la vue détaillée des groupes.

39.gif

test

40.gif

41.gif

Pour aller au menu Principal : ok.
Pour afficher la vue détaillée d’un groupe auquel la personne est rattachée : ok.

Tester une suppression annulée :

42.gif

Tester une suppression confirmée :

43.gif

On a un problème… l’intégrité référentielle a empêché l’exécution de la requête de suppression.
A priori, la fonction qui vérifie si la donnée est supprimable est erronée, elle ne prend peut-être pas en compte la table T_p_Groupe?

C’est la fonction DataLiee :

44.gif

Lignes 858 et 859, on appelle la fonction InfoData pour récupérer des données.
Voici cette fonction :
45.gif

Le problème s’explique : pour l’information « tables liees » pour les types ‘personne’ et ‘groupe’, la fonction retourne ‘Aucun’.
Mise à jour de cette fonction :
46.gif

On teste la même manip, sauf que si la fonction DataLiee fait bien son boulot, elle devrait m’informer que je ne peux pas supprimer cette donnée ; et pour tester la suppression confirmée, il faudra donc afficher le détail d’une personne qui n’est rattachée à aucun groupe.

47.gif

Ok parfait, on a bien cette fois le message qui nous annonce que la suppression est impossible.

Maintenant le test de la suppression confirmée, avec Joe Lecowboy :
Oops, un bug…
On recommence en exécutant l’appli à partir de l’IDLE :

48.gif

La variable vListeId est utilisée alors qu’on ne lui a pas encore attribué de valeur, c’est directement dû au fait que cette personne n’est liée à aucun groupe.
Il faut placer cette ligne dans le même bloc que celui où vListeId est alimenté, mais aussi déplacer la ligne par laquelle on donne à vListeId une valeur d’initialisation, sinon l’appel à vListeChoix2 déclenchera une erreur car vListeId n’aura reçu aucune valeur.

49.gif

test :

50.gif

C’est déjà une avancée, on peut voir Joe Lecowboy. Essayons de le supprimer :

51.gif

Tout semble ok, on affiche le menu de gestion des personnes pour vérifier, Joe Lecowboy ne devrait pas y apparaître :

53.gif

Ok.

code pour la vue détaillée des groupes

55.gif

Premier test : afficher la vue détaillée d’un groupe, puis aller au menu Principal :
54.gif

Test ok.
Essayons d’afficher la vue détaillée d’un groupe, puis la vue détaillée d’une personne rattachée à ce groupe :

56.gif

Test ok.
Essayons de supprimer ce groupe ; la suppression devrait être refusée :

57.gif

Test ok.
Maintenant, une tentative de suppression d’un groupe auquel aucune personne n’est liée ; la suppression devrait être accpetée :

58.gif

La suppression semble avoir été effectuée ; on affiche le menu de gestion des groupes pour vérifier :

59.gif

Pas de trace du groupe « voisins », ok.

CarnetAdrese v0-015

Puisque les tests sont concluants, ce sera tout pour cette fois, voici les liens vers :
l’application
la DB

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 :