You are on page 1of 8

"Mini-lab" WinDev

Les Bases de donnes tierces

Cours WinDev Numro 6


Objectifs : 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

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 donne 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 donne 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 donc voici ladresse ou vous les trouverez : www.btsig.org.
Pour le bon droulement de ce support tlchargez et installez easyphp 1.6 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 ;-))

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, tlchargez la dll
libmysql.dll directement chez Mysql.
De plus, allez sur www.pcsoft.fr dans la rubrique tlchargement pour
tlcharger l'accs natif Mysql
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.
Jean-Luc Baptiste

www.btsig.org

Page : 1

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

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 donne 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 a 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.

Maintenant que la scne est installe, voyons les comportements des objets et ce que lon attend deux. Pour ce
connecter une base de donne Mysql nous avons besoin de divers renseignements :
Ladresse Ip de lordinateur o est situe votre base de donne 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 :
Jean-Luc Baptiste

www.btsig.org

Page : 2

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

GLOBAL
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.
NB : Le mot cl global pourrait dans ce cas l tre omis.
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.
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 de paramtre 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
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 resultat 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. !

Jean-Luc Baptiste

www.btsig.org

Page : 3

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

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 a 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 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 :
9
9
9
9
9

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 renvoi 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
Jean-Luc Baptiste

www.btsig.org

Page : 4

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

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
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(mabase,matable)
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 donne 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).
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}..Etat=Visible
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.
Jean-Luc Baptiste

www.btsig.org

Page : 5

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

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 ..Etat=Visible. Voil la procdure a fait la mise en forme. Elle sarrte et repasse la main a 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.
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 liste nomm


resultat

Voyons les lments :


9
9
9

Un champ de saisie nomm larequete dans lequel vous taperez le texte de votre requte
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.

Jean-Luc Baptiste

www.btsig.org

Page : 6

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

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,mabase)
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
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".

Jean-Luc Baptiste

www.btsig.org

Page : 7

/8

"Mini-lab" WinDev

Les Bases de donnes tierces

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 sur vous aurez besoin de commandes Sql simples du type
Drop database
Drop table
Create database.
A vous de jouer, bon courage !

Jean-Luc Baptiste

www.btsig.org

Page : 8

/8