15
COURS WINDEV NUMERO 6 14/02/2015 Accès à des bases de données tierces (Mysql) Langage Sql, Fonctions Sql de WinDev, gestion avancée des tree-view, des tables mémoire, des chaînes de caractères…

utilisation des fonctions avancées sous WinDev pour le développement avancé avec des cas pratiques

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 !