truc2geek

2012/11/11

Carnet d’Adresses, part 6 : v0_007

Filed under: Carnet d'adresses (Python), Programmation, Projets, Python, SQLite — truc2geek @ 02:57

Dans la version v0_007, on va coder la fonction générique CreaData() qui permettra de créer les données.

On reprend le code de la version v0_006, et il faut :

  • supprimer les fonctions GererPersonne et GererAdresse, qu’on avait simplement mises en commentaire.
  • metre à jour le sommaire, et supprimer les tags NEW, MAJ et SUPP (qui servent à repérer les modifs effectuées sur une version par rapport à la version précédente).

Vous pouvez télécharger ici cette version.

Conception

Le fonctionnement

Voici le « raisonnement » que devra suivre le code dans les grandes lignes :

  • demander à l’utilisateur de saisir une valeur pour chaque champ
  • vérifier la validité de chaque valeur
  • générer et exécuter la requête SQL de création de données

Contraintes BD

Dans le détail, un certain nombre de paramètres vont intervenir.
Pour rappel, voici l’instruction SQL par laquelle on a créé la table des adresses, nommée ‘T_d_Adresse’ :

La création de données est soumise aux contraintes de la BD :

  • il faut respecter le type de données défini pour chaque champ : texte (et nombre de caractères maximum autorisé), date, nombre…
  • pour certains champs, il est obligatoire de fournir une valeur (SQL : NOT NULL)

De plus, pour renseigner certains champs l’utilisateur doit sélectionner une valeur parmi x valeurs possibles, et non pas saisir une valeur librement.
Il faudra donc afficher à l’utilisateur la liste des valeurs possibles et lui demander d’en sélectionner une (comme il le fait pour sélectionner un élément dans un menu).
C’est le cas dans deux situations :

  • soit pour un champ texte pour lequel on a défini, par SQL lors de sa création, la liste des valeurs acceptées (on n’a pas ce cas dans cette application)
  • soit pour un champ clé étrangère : ce champ acceptera toute valeur présente dans le champ clé primaire correspondant.

Par exemple, dans le cas du champ « id_adresse » de la table « T_d_Personne » qui est une clé étrangère :
ce champ est rattaché au champ « id_adresse » de la table « T_d_Adresse » qui est une clé primaire.
Il faut donner au champ « id_adresse » de la table « T_d_Personne » la valeur du champ « id_adresse » d’un enregistrement de la table « T_d_Adresse »

Fonction Saisie, 1er essai

Le code

Cette fonction va :

  • demander à l’utilisateur de saisir une donnée
  • accepter une valeur vide uniquement si le champ n’est pas obligatoire
  • valider le type de donnée (texte, numérique, date…)

Pour l’instant on laisse de côté les dates.
Développement de cette fonction dans un nouveau fichier, pour la tester dans le shell de l’IDE :

Vous pouvez télécharger le fichier Saisie01.py ici.

Les 4 arguments attendus, dont 2 sont facultatifs, vont permettre de valider la saisie.

vType aura pour valeur ‘texte_x’, où x sera le nombre maximum de caractères possible.
vTxt sera le texte affiché à l’utilisateur pour lui dire quoi saisir.
vObl, si a True pour valeur, permet de spécifier qu’une valeur est impérativement attendue.
vDef, si est transmis, contient la valeur qui sera définie par défaut si l’utilisateur effectue une saisie vide.

lignes 17 à 20 : permet de sortir de la fonction, sans tenter de valider la saisie, si on saisit ‘__’ ; c’est utile simplement le temps du test dans le shell, on supprimera ces lignes avant d’intégrer la fonction à l’application.

lignes 22 à 24 : si une valeur doit être obligatoirement fournie et que l’utilisateur n’en fournit pas, on affiche un
message et on passe à l’itération suivante de la boucle.

lignes 26 à 36 : on vérifie la validité de la saisie pour un nombre ou un texte ; dans ce dernier cas, on extrait la valeur de vType
à partir du 7e caractère (d’indice 6, d’où [6:]), qu’on convertit ensuite en integer pour vérifier la longueur de la saisie.
Pour vérifier qu’une saisie est un nombre, on utilise la fonction isdigit().

Test dans le shell de l’IDE

Sur mon poste le fichier Saisie01.py est placé dans le dossier J:\ProgTemp\.

Ouvrir le shell, ajouter le chemin de ce dossier à la variable path, et importer Saisie01.py :

le shell trouve bien la fonction Saisie, et nous indique les arguments attendus :

1er test :
saisie facultative d’un nombre, sans valeur par défaut :
la valeur ‘jkl’ est refusée : ok
la valeur ‘123’ est acceptée : ok
la fonction Saisie se comporte comme attendu pour ce test, et a bien retourné la valeur de la saisie :

2e test :
saisie facultative d’un nombre, avec une valeur par défaut :

oups… j’ai transmis une valeur pour vDef, et rien pour vObl ; et visiblement Python n’aime pas ça.
On recommence en transmettant False pour vObl :

L’appel est correct, mais on peut noter un premier point à corriger : le problème d’encodage entouré en rouge ci-dessus.

La fonction Saisie a bien refusé la valeur non numérique ‘aze’.
Par contre, quand j’ai validé sans avoir rien saisi, la fonction Saisie aurait dû prendre en compte la valeur par défaut, ici ’33’ ; or elle ne l’a pas fait, sûrement parce que c’est mal codé, ou pas codé… Ca nous fait un 2e point à corriger.

3e test :
saisie obligatoire d’un nombre, sans valeur par défaut :

Tout est ok pour ce 3e test : l’absence de saisie est refusée, tout comme la saisie de lettres.

4e test :
saisie obligatoire d’un texte de 10 caractères maximum :

Tout est ok pour ce 4e test : l’absence de saisie est refusée, et la longueur maximum de 10 caractères est respectée.

Fonction Saisie, 2e essai

Le Code

On a 2 points à corriger :

  • l’encodage sur ‘valeur par défaut’
  • la valeur par défaut doit être prise en compte

Pour corriger le 1er point, on ajoute simplement un ‘u’ sur la ligne n° 13

Pour corriger le 2e point :
lignes 22 à 28, un bloc if qui :
si une valeur par défaut a été transmise et que la saisie est vide : on prend la valeur par défaut
sinon, si la saisie est obligatoire et que la saisie est vide : on passe directement à l’itération suivante

Voici le code :

Le fichier Saisie02.py est disponible ici.

Test

On va reproduire les mêmes tests que pour Saisie01.py et en ajouter.

1er test :
saisie facultative d’un nombre, sans valeur par défaut :

Ce 1er test est ok : la saisie de lettres est refusée.

2e test :
saisie facultative d’un nombre, avec une valeur par défaut :

2e test b :
saisie facultative d’un nombre, avec une valeur par défaut :

Ce test 02 b est ok : c’est bien le nombre saisi qui est pris en compte.

3e test :
saisie obligatoire d’un nombre, sans valeur par défaut :

Ce 3e test est ok.

4e test :
saisie obligatoire d’un texte de 10 caractères maximum :

Ce 4e test est ok.

5e test :
saisie obligatoire d’un texte de 4 caractères maximum, avec une valeur par défaut, contenant un caractère accentué pour tester :

On réessaie :

La fonction Saisie est ok, on l’intègre à l’application et on crée la fonction CreaData.

Fonction CreaData

Le code

On va commencer par coder une première version de CreaData, dans laquelle les traitements seront basiques et seules les données de type ‘adresse’ seront traitées.

Fonction GererData

C’est au niveau de GererData qu’on va bloquer l’appel de la fonction CreerData pour les données de type ‘personnes’ et ‘groupes’.
Voici la fin de la fonction : on a simplement remplacé les deux lignes suivantes par les lignes 346 à 352 :

vSuite = raw_input(‘creer ‘ + vDonnee + ‘. traitement a coder…’)
Principal()

Test

On place dans le même dossier cette version v0_007 et la BD, on lance l’application :

On entre « 1 » pour aller au menu principal, puis « 3 » pour aller au menu de gestion des adresses :

On entre « 1 » pour créer une adresse, puis renseigne les champs :

Dès qu’on valide le dernier champ, on est redirigé vers le menu principal :

Pour vérifier si l’adresse a bien été créée, on retourne vers le menu de gestion des adresses :

Ok, l’adresse a bien été créée.

Outro

A ce stade on n’a pas encore une fonction générique de création de données comme prévu, mais on en a déjà une version artisanale
fonctionnelle codée pour les adresses.

La version v0_007 est disponible ici.

La prochaine étape sera d’atteindre l’objectif initialement fixé pour celle-ci.

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

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :