Vous êtes sur la page 1sur 15

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

Cours Windev numro 6


VERSION 19

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.
2.
3.
4.

Elle est gratuite.


Elle est rapide
Elle est fiable.
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 ;-))

http://www.btsig.org/

Jean-Luc Baptiste

Page 1 sur 14

Cours Windev numro 6

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-DevServer14.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.

http://www.btsig.org/

Jean-Luc Baptiste

Page 2 sur 14

Cours Windev numro 6

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

http://www.btsig.org/

Jean-Luc Baptiste

Insrez 2 boutons un
nomm
Requete,
lautre Quitter. Je
vous laisse trouver le
code du bouton
Quitter.

Page 3 sur 14

Cours Windev numro 6

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.

http://www.btsig.org/

Jean-Luc Baptiste

Page 4 sur 14

Cours Windev numro 6

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

http://www.btsig.org/

Jean-Luc Baptiste

Page 5 sur 14

Cours Windev numro 6

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. !

http://www.btsig.org/

Jean-Luc Baptiste

Page 6 sur 14

Cours Windev numro 6

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

http://www.btsig.org/

Jean-Luc Baptiste

Page 7 sur 14

Cours Windev numro 6

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 matable<>EOT 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

http://www.btsig.org/

Jean-Luc Baptiste

Page 8 sur 14

Cours Windev numro 6

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).

http://www.btsig.org/

Jean-Luc Baptiste

Page 9 sur 14

Cours Windev numro 6

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 i<>nbcol
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.
http://www.btsig.org/
14

Jean-Luc Baptiste

Page 10 sur

Cours Windev numro 6

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


Champ de saisie
nomm larequete

Bouton nomm
execute

Champ
resultat

liste

nomm

Voyons les lments :

Un champ de saisie nomm larequete dans lequel vous taperez le texte de votre requte

http://www.btsig.org/
14

Jean-Luc Baptiste

Page 11 sur

Cours Windev numro 6

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<=SQL.NbCol // de i au nombre de colonnes
texte=texte+TAB+SQLCol("requete4", i) // Je concatene
i++
FIN
ListeAjoute(resultat,texte) // Jajoute dans la liste rsultat la ligne que je viens de crer
SQLSuivant("requete4") // je passe la ligne suivante
http://www.btsig.org/
14

Jean-Luc Baptiste

Page 12 sur

Cours Windev numro 6

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".

http://www.btsig.org/
14

Jean-Luc Baptiste

Page 13 sur

Cours Windev numro 6

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 !

http://www.btsig.org/
14

Jean-Luc Baptiste

Page 14 sur