Upload
abourizk-badi
View
16
Download
6
Embed Size (px)
DESCRIPTION
utilisation des fonctions avancées sous WinDev pour le développement avancé
Citation preview
COURS WINDEV NUMERO 6
14/02/2015 Accs des bases de donnes tierces (Mysql)
Langage Sql, Fonctions Sql de WinDev, gestion avance des tree-view, des tables mmoire, des chanes de caractres
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 1 sur 14
Cours Windev numro 6 V E R S I O N 1 9
A lheure actuelle, les bases de donnes de type Clients/Serveurs ont la faveur de plus en plus
dinformaticiens. Une de ces bases se dtache du lot, il sagit de Mysql. Cette base de donnes offre
plusieurs avantages non ngligeables.
1. Elle est gratuite. 2. Elle est rapide 3. Elle est fiable. 4. Elle est Multi-Plateforme
Le fait quelle existe sous plusieurs systmes dexploitations est apprciable, en effet lheure actuelle
beaucoup de Fournisseurs dAccs Internet vous permettent de vous connecter une base de donne, dans
la majorit des cas cette base de donne est Mysql. Pourquoi la choisissent-elles ? En fait, ils ont fait le
choix du logiciel libre, donc le systme dexploitation est Linux, comme les internautes utilisent de plus en
plus le couple Php/Mysql, cette base de donnes tait le choix technologique le plus vident faire.
Maintenant imaginez la situation suivante : Vous tes dveloppeur dans une socit qui a sur Internet un
site o les clients peuvent passer des commandes. Le site utilise Php et Mysql, comment faire pour que votre
logiciel commercial puisse rcuprer les commandes directement dans la base de donnes Mysql qui est
sur Internet ?
Je vous sens dubitatif ! Heureusement super Jean-Luc a la solution : Nous allons, ensemble, dvelopper un
logiciel de connexion une base de donne Mysql, crer des requtes, rcuprer les rsultats..Elle n'est
pas belle la vie ? Mais cependant certaines mises en garde sont ncessaires :
Je vous rappelle quil est inutile de faire ce "mini lab" sans matriser les "mini lab" prcdents. Je ne reviens
pas sur les notions abordes dans les supports prcdents.
Pour le bon droulement de ce support tlchargez et installez easyphp Devserver que vous trouverez
ladresse suivante : http://www.easyphp.org/
Durant le Mini lab, prenez le temps de comprendre ce que vous faite, aucun apprentissage efficace ne
peut avoir lieu si on se contente de copier ou imiter. Donc si vous vous sentez largu , pas de souci,
apprenez faire marche arrire et relisez. Je fais toujours en sorte que les explications soient claires, mais
nayez pas honte de ne pas comprendre immdiatement, faites leffort et vous serez toujours rcompens.
Noubliez pas lexcellente aide de WinDev (vous savez la touche F1 !)
Durant cet exercice, vous avez le droit de faire des pauses ;-))
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 2 sur 14
Attention : Si vous n'tes pas administrateur de votre ordinateur une
librairie de Mysql ne sinstallera pas correctement, il sagit de libmysql.dll, de
plus le serveur Mysql sarrtera la moindre tentative de connexion.
Autre point important : Si des erreurs rcurrentes se produisent alors que
votre code est propre et que vous utilisiez Easyphp, allez dans le rpertoire
dinstallation deasyPhp (C:\Program Files (x86)\EasyPHP-DevServer-
14.1VC11\binaries\mysql\lib) prenez la librairie libmysql.dll et copiez la dans
le dossier Exe de votre projet Windev
De plus, allez sur www.pcsoft.fr dans la rubrique tlchargement pour
tlcharger l'accs natif Mysql
Encore un point important : Si un serveur Web est dj install sur votre
ordinateur il vous faudra changer le port dcoute dapache et passer en 8080
(voir le fichier de configuration dapache.
Avant de commencer, vrifiez quEasyphp est actif (Vous devez apercevoir un E noir avec un point rouge
clignotant dans la barre des taches). Sil nest pas en fonctionnement, vous ne pourrez pas accder au
serveur MySql. Je vous laisse lire la doc fournie avec pour le faire fonctionner, cest simple.
Nous allons maintenant entrer dans le vif du sujet. Crez un nouveau projet nomm TP6 qui ne comporte
aucune analyse, normal puisque nous allons accder des donnes distantes. Ce projet comportera 2
fentres : Une orient gestion de la base Mysql, lautre sur ldition de requtes.
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 3 sur 14
Voici le prototype de la premire fentre que vous nommerez dpart et qui sera la premire fentre du
projet.
Ici vous trouvez 4 champs de saisie nomms :
Numip, Login, Mdp, Etatcnx. Un bouton
nomm Cnx. Ces champs sont dans un champ
libell de style Libell-Acheval_DoubleB ,
dont le libell est : Connexion au serveur
Mysql
Ici, crez un champ arbre
que vous nommerez
listebase. Vous pouvez
lencadrer par un champ
libell.
Attention, ici cest une table mmoire que vous
nommerez Table1 dont toutes les colonnes sont
invisibles. Dans cette table sera affich le contenu des
tables de votre base de donnes Mysql. Laffichage
est activ par un choix de table dans larbre
listebase. Comme nous ne connaissons pas priori le
nombre de colonnes de la table afficher nous allons
employer une grosse ruse Cheyenne. On va crer une
quinzaine de colonnes texte nommes
c1,c2,c3..c15 et toutes invisible, capito ? Nous
crerons laffichage par programmation plus tard
Insrez 2 boutons un
nomm Requete,
lautre Quitter. Je
vous laisse trouver le
code du bouton
Quitter.
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 4 sur 14
Maintenant que la scne est installe, voyons les comportements des objets et ce que lon attend deux.
Pour se connecter une base de donnes Mysql nous avons besoin de divers renseignements :
Ladresse Ip de lordinateur o est situe votre base de donnes Mysql. Si vous lavez sur votre
ordinateur, plusieurs possibilits soffrent vous, soit vous inscrirez dans ce champ ladresse ip de votre
ordinateur, soit localhost, soit une adresse de bouclage ex : 127.0.0.1.
Le login : Si vous venez dinstaller votre base de donne le login par dfaut est : root. Sinon
demandez un login votre administrateur rseau.
Le mot de passe : Si vous venez dinstaller Mysql sur votre poste le mot de passe par dfaut nest
pas dfini, donc cette zone restera vide, sinon contactez votre administrateur si vous nen avez pas.
Donc, lorsque ces renseignements seront saisis nous essayerons de nous connecter la base de donne via
le bouton de connexion, si la connexion russie nous remplirons larbre avec les bases Mysql et pour chaques
bases, les tables constituantes. Dans le champ etatcnx nous mettrons un texte nous indiquant le succs de la
connexion sinon lchec.
On y va ? Vous avez plac tous les objets ? Votre fentre ressemble la mienne ? Vous lavez enregistre
sous le nom de dpart ? Vous lavez dclarez comme premire fentre du projet ? Non ! ! Mais quest-ce
que vous faites ?
Nous allons avoir besoins de 2 variables globales la fentre, allez dans le code de la fentre et dans
la zone dclaration globale de dpart inscrivez ceci :
mabase,matable sont des chanes
Ces 2 variables doivent tre connues ou vues par tous les objets de la fentre, cest pour cela que lon les
dclare globales au plus haut dans le conteneur principal.
Intressons-nous maintenant au comportement du bouton de connexion. Son rle est dtablir une connexion
avec la base de donnes Mysql. Il a besoin de ladresse ip de la base, du login et du mot de passe pour
tablir le contact.
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 5 sur 14
Voici son code :
resultat est un entier
resultat=SQLConnecte(Numip,login,mdp,"","MySQL")
SI resultat=0 ALORS
etatcnx="Votre serveur Mysql n'a pas repondu"
SINON
etatcnx="Votre connexion est active"
lesbases()
FIN
SQLDeconnecte()// Une fois les traitements fait, on se dconnecte
La procdure WinDev importante est SQLConnecte son rle est de connecter l'application en cours une
base de donnes interroger par SQL. Pour cela elle a besoin des paramtres qui sont le contenu du
champ Numip, de login, du mot de passe. Le 4eme paramtre est vide (les 2 apostrophes), il est dvolu
au nom de la base de donne souhaite. Le 5eme paramtre est le type de base de donnes attaqu,
dans notre cas MySQL. Appuyez sur F1 en tant positionn sur le mot SQLConnecte et regardez dans
laide toutes les bases de donnes susceptibles dtre interfaces avec WinDev !
Cette procdure retourne un entier qui vaut 0 si la connexion na pas pu tre tablie (mauvaise adresse
ip, mauvais login, mot de passe, serveur Mysql arrtetc). Une bonne habitude prendre est de tester
la russite ou lchec dune fonction. Donc, si resultat=0 on informe lutilisateur quil y a un boulon dans le
potage. Sinon cest que tout va bien : on fait afficher dans le champ de saisie etatcnx que la connexion est
active. Pour allger le code nous allons crer une procdure locale la fentre que nous nommerons
lesbase. Le rle de cette procdure est de nous remplir larbre avec les bases de donnes MySql et les
tables les composants. Voyons son code :
PROCEDURE lesbases()
resultat est un boolen
resultat=SQLExec("show databases","requete1")
SI resultat ALORS // Lexcution de la requte est russie
TANTQUE SQLFetch("requete1") = 0
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 6 sur 14
ArbreAjoute(listebase,"Bases"+TAB+ SQLLitCol("requete1", 1),aDfaut,aDfaut,SQLLitCol("requete1", 1))
lestables(SQLLitCol("requete1", 1))
FIN
SQLFerme("requete1")
ArbreDroule(listebase,"Bases")
SINON
Info("Vous avez un problme de connexion")
FIN
Rsultat est un boolen qui va recevoir le rsultat dexcution de la procdure SQLExec. Celle-ci va
excuter la requte nomme requete1 , dont le texte associ est show databases (cette commande
Sql fait retourner lensemble des bases de donne prsentent sur votre serveur MySql).Si la requte
sexcute bien rsultat vaut vrai sinon faux.
TANTQUE SQLFetch("requete1") = 0
Cette ligne de code peut vous paratre tonnante, en fait la fonction SQLFetch ne lance pas la rcupration
de toutes les lignes du rsultat de la requte : seul l'enregistrement en cours est rcupr par la fonction
SQLFetch. Le bizarre est que tant quelle retourne 0 la lecture de l'enregistrement s'est bien passe. Il y a
des fois o la logique nest plus de ce monde ! Mais ne nous laissons pas perturber par cette petite
bizarrerie. !
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 7 sur 14
La procdure ArbreAjoute cre un tree-view avec les lments que lon va lui passer.
Dans notre cas il faut remplir avec le contenu rsultant de la requte prcdente. En fait le rsultat de la
requte est, dans ce cas-l, une table dune colonne contenant un nom de base par ligne.
SQLFetch parcourt les lignes de la table et SQLLitcol("requete1", 1) lit pour la requte passe en paramtre,
le contenu de la colonne passe aussi en paramtre (ici 1).
Je vous laisse regarder laide dArbreAjoute et comparer avec le code, vous allez vite comprendre son
fonctionnement. Nous allons donc crer un arbre affichant les bases de donnes disponibles, mais pour
chaque base il nous faut aussi insrer dans larbre les tables qui la composent. Cest le rle de la procdure
globale lestable que nous allons crer.
Comme vous le remarquez la procdure lestables prend comme paramtre le nom de la base de donne
contenu dans SQLLitCol("requete1", 1)
Crez donc cette procdure
PROCEDURE lestables(labase)
resultat est un boolen
SQLConnecte(Numip,login,mdp,labase,"MySQL")
resultat=SQLExec("show tables","requete2")
SI resultat ALORS
TANTQUE SQLFetch("requete2") = 0
ArbreAjoute(listebase,"Bases"+TAB+
labase+TAB+SQLLitCol("requete2", 1),aDfaut,aDfaut,SQLLitCol("requete2", 1))
FIN
SQLFerme("requete2")
ArbreDroule(listebase,"Bases"+TAB+labase)
FIN
SQLDeconnecte()
Comme vous pouvez le constater cette procdure rcupre comme argument une chane de caractre
(labase) contenant le nom de la base de donne traiter. Il faut ensuite se connecter cette base de
donne (ligne 3) pour demander lensemble des tables la constituant (ligne 4).Une fois la requte excute,
si elle a fonctionn, tant que des lignes existent dans le contenu du rsultat de la requte, on les ajoute au
bon endroit dans le tree-view (larbre). On ferme la requte avec la commande SQLFerme. Et on droule
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 8 sur 14
larbre pour des raisons esthtiques. Pour des raisons de scurit on utilise SQLDeconnecte() qui ferme la
connexion en cours et libre l'espace mmoire utilis par la connexion. La fonction SQLDconnecte doit
tre appele systmatiquement pour fermer la connexion, mme si cette connexion a chou
Arriv ce stade, vous pouvez tester le rsultat. Entrez les bons paramtres de connexion, appuyez sur le
bouton connexion et sous vos yeux bouriffs de surprise le tree-view est rempli de larborescence bases
de donnes + Tables. Si sous vos yeux effrays vous ne voyez rien paratre, vrifiez les points suivants :
Votre serveur est-il actif ?
Votre code est-il exempt de Bug ?
Les paramtres de connexion sont-ils free of neries ?
Vos lunettes sont-elles propres ?
.
Maintenant, ce serait super de pouvoir lister le contenu dune table dont on aurait cliqu sur le nom dans
larbre. Pour cela il faudrait rcuprer le nom de la table choisie et remplir la table mmoire. Cest tout
simple voici le code que vous allez inscrire dans la zone clic sur listebase de lobjet listebase (larbre).
resultat est une chane
resultat=ArbreSelect(MoiMme)
mabase=ExtraitChane(resultat,2)
matable=ExtraitChane(resultat,3)
SI matableEOT ET mabase EOT ALORS //Nous avons la base et la table
remplirtable(mabase,matable)
FIN
ArbreSelect(MoiMme) renvoie llment cliqu sous forme dune chaine. Le problme cest quil ne renvoie
pas la terminaison (la feuille) mais larborescence complte. Par exemple si vous cliquez sur la table clients,
contenue dans la base gestcom ayant comme racine Bases la chane resultat sera comme ceci : Bases
Gestcom clients . Les lments susceptibles de nous intresser sont Gestcom, pour le nom de la base et
clients pour la table. La fonction ExtraitChaine va nous tre dun grand secourt. On lui donne la chane
initiale et on lui dit de nous renvoyer le Xieme mot. Dans notre cas nous allons mettre dans la variable
globale mabase le deuxime terme de la chane et dans la variable matable le troisime terme. Si jamais
vous avez cliqu sur le nom de la base au lieu de cliquer sur le nom de la table, resultat sera compos de
2 mots et non de trois, dans ce cas ExtraitChaine (resultat, 3) renverra EOT. Nous allons pouvoir remplir la
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 9 sur 14
table si les 2 variables (mabase et matable) sont diffrentes de EOT. Pour allger la lecture et faciliter la
comprhension, on va donc crer un traitant de remplissage de table, la procdure remplirtable qui va
prendre 2 arguments : le nom de la base et le nom de la table.
Voici le code de remplirtable(labase,latable)
PROCEDURE remplirtable(labase,latable)
resultat est un boolen
numconnexion est un entier
texte est une chane
TableSupprimeTout(Table1)
numconnexion=SQLConnecte(Numip,login,mdp,labase,"MySQL")
texte=SQLColonne(numconnexion,latable,Faux)
SQLExec("select * from "+latable,"requete3")
SQLInfoGene()
miseenforme(texte,SQL.NbCol)
SQLTable("requete3", "Table1")
SQLFerme("requete3")
SQLDeconnecte()
Voici lexplication du code. On commence par vider la table mmoire nomm table1. Ensuite on se connecte
la base de donnes dont le nom fut pass en paramtre.
Cette ligne : texte=SQLColonne(numconnexion,latable,Faux) renvoie dans la variable texte le nom des
colonnes de la table choisie par lutilisateur dans le tree-view. Le nom des colonnes nous sera utile pour
mettre en forme la table mmoire on mettra en entte de table le nom des colonnes, ce sera plus parlant
que c1,c2,c3c15. La ligne suivante fait une requte select classique qui liste le contenu intgral dun
fichier donn (latable).
SQLInfoGene() va renseigner diverses variables sur la dernire requte lance (requete3).
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 10 sur 14
Nous ce quil nous intresse, cest de connatre le nombre de colonnes que va gnrer notre requte. Notre
table slectionne contient-elle 5 colonnes, 2, 10 ? En fait, a priori nous nen savons rien, cest pour cela
que je vous ai demand de crer une table mmoire de 15 colonnes par dfaut. Cest la variable
SQL.NbCol qui va nous dire combien la requte a de colonnes. Mais noubliez pas que SQL.NbCol ne
contient des infos quaprs lappel de SQLInfoGene()
Nous allons commencer crer lentte de la table mmoire (table1) avant dy transfrer les donnes.
Cest le rle de la procdure miseenforme(texte,SQL.NbCol)
PROCEDURE miseenforme(lescolonnes,nbcol)
i est un entier=1
nomcol,exnomcol sont des chanes
TANTQUE inbcol
nomcol=ExtraitChane(lescolonnes,i,RC)
exnomcol="C"+i
{exnomcol}..Titre=nomcol
{exnomcol}..Visible=Vrai
i++
FIN
Le but de cette procdure est de remplacer les c1,c2, c3..nbcol par un le nom de la colonne renvoy
par la requte. Nous allons donc affecter le nouveau nom lancien. Nous avons pass a la procdure 2
paramtres : Une chane contenant les noms des colonnes spars par un espace et le nombre de colonnes.
Nous avons comme impratif de renommer la premire colonne (C1) par le 1er terme contenu dans la
chane ( lescolonnes ), la deuxime colonne (C2) par le 2eme terme de la chane et cela jusqu' nbcol.
Comme vous le voyez cest ce que fait la boucle tantque.
On initialise une variable i 1, puis tant quelle est diffrente de nbcol on place dans nomcol le terme
contenu dans la chane lescolonnes lindice i. Ensuite on recre le nom de colonne bas sur lindice pour
tre en phase. La partie la plus surprenante est le fait de mettre entre accolades le nom de la colonne.
Cest ce que lon appelle une indirection, comme le nom du champ est dans une variable on fait ainsi
comprendre WinDev de traiter le contenu de la variable comme tant le nom du champ souhait. On
modifie le nom de la colonne par la constante ..Titre et on la rend visible par ..Visible=Vrai. Voil la
procdure a fait la mise en forme. Elle sarrte et repasse la main la procdure appelante : la procdure
remplirtable. Lexcution continue sur la ligne SQLTable( requete3 , Table1 ). Cette commande fait
un transfert du contenu de la requte dans la table mmoire.
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 11 sur 14
Voil le tout est jou, sauvegardez et testez votre travail. Cest super non ?
Mais tout cela serait plus magique si vous aviez une zone de saisie de requte sql pour crer des nouvelles
bases de donnes, crer des nouvelles tables, insrer des enregistrements..
Cest ce que lon va raliser maintenant, mais tout dabord voici le code du bouton requete
SI mabase"" ALORS
Ouvre(frequete,Numip,login,mdp,mabase)
SINON
Info("Choisissez une base de donne")
FIN
Si lutilisateur a cliqu sur une base du Tree-view alors on peut lancer louverture de la 2eme fentre
nomme requte. Fentre qui on passe 4 arguments de connexion : le numro ip, le login, le mot de
passe et la base sur laquelle on dsire travailler.
Voici limage de la nouvelle fentre que vous nommerez frequete
Voyons les lments :
Un champ de saisie nomm larequete dans lequel vous taperez le texte de votre requte
Champ de saisie
nomm larequete
Champ liste nomm
resultat
Bouton nomm
execute
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 12 sur 14
Un champ liste nomm rsultat dans lequel le rsultat de votre requte apparatra.
Un bouton Execute qui contient le code charg de se connecter la base MySql, de faire excuter la
requte et dafficher le rsultat.
Pour que les variables passes par le code du bouton requte de la fentre Dpart soient prisent en
compte par la fentre frequete , il faut saisir dans la zone dclaration globale de frequete la ligne
suivante :
Procedure frequete (Numip,login,mdp,labase)
Voyons de suite le code du bouton execution
i est un entier
texte est une chane
ListeSupprimeTout(resultat) // on vide la liste resultat
SQLConnecte(numip,login,mdp,labase,"MySQL")// on se connecte la base
SI larequete"" ALORS // si du texte a t frapp
SQLExec(larequete,"requete4") // on fait excuter la requte par Mysql
SQLInfoGene() // on fait gnrer les variables concernant la requte
SQLPremier("requete4") // on se positionne sur la premire ligne des donnes retournes par la requte
TANTQUE PAS SQL.EnDehors // Tant quil reste des lignes lire
i=1
texte="" // Je vais construire dans texte la ligne en concatnant les colonnes
TANTQUE i
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 13 sur 14
FIN
SQLFerme("requete4") // je dtruis ma requte
SINON
Info("Veuillez saisir une requte")
FIN
SQLDeconnecte() // Je me dconnecte
Que puis-je dire de plus ? Tout est expliqu ! Ah ! Si ! ! Le cours numro 6 est fini, je vous remercie davoir
eu la patience darriver jusquici
Je vous dis bientt pour un nouveau "lab".
Cours Windev numro 6
http://www.btsig.org/ Jean-Luc Baptiste Page 14 sur 14
Exercice applicatif
Crer un systme dadministration Mysql.
Imaginez une fentre ou lon puisse crer des bases de donnes, les supprimer, crer des tables, les
supprimer, ajouter des utilisateurs, des droits, des permissions.
Vous voyez ? Essayez de faire le plus simple et le plus ergonomique, noubliez jamais que linformaticien
nest jamais lutilisateur !
Bien sr vous aurez besoin de commandes Sql simples du type
Drop database
Drop table
Create database.
A vous de jouer, bon courage !