Vous êtes sur la page 1sur 59

GUIDE DE FORMATION

C ou rs W inD ev N um ro 0
Que fait-on avec WinDev ?

WinDev est un AGL (Atelier de Gnie Logiciel). Il vous perm et de dvelopper des applications dans tous les domaines : Gestion (Comptabilit, Paie, Finances, Com merce, Stock, ) Industrie (robots, caisses, automates, balances, lecteur de badge, supervision, ...) Mdical MultiMedia Internet Accs distant Les applications WinDev accdent toutes les bases de donnes, relationnelles ou non du m arch. Toutes les bases de donnes sont supportes. WinDev est livr en standard avec Hyper File , une puissante base de donnes relationnelle, dj utilise sur des millions de sites ! WinDev est un outil de dveloppement complet qui intgre tous les outils ncessaires au cycle de ralisation dune application. Contrairement dautres langages de dveloppement traditionnels, il nest pas ncessaire de chercher et de rajouter des modules pour pouvoir concevoir, tester et installer une application. Le L5G (Langage de 5me Gnration) de WinDev, le W-Langage, vous tonnera par sa sim plicit : quelques heures suffisent pour apprhender le langage, une sem aine suffit en gnral pour matriser toute sa puissance ! WinDev permet de suivre, tape par tape, de la conception la finalisation, le cycle complet du dveloppe- ment dune application. WinDev propose certainement lenvironnem ent de travail le plus puissant, le plus facile et le plus intgr du march ! Vos quipes creront facilement de superbes applications. Lditeur de fentres de WinDev est 100% WYSIWYG ("Ce que vous voyez est ce que vous aurez"). Il perm et de raliser facilement de superbes fentres relies aux donnes.

Connatre

Aucun

C ou rs W inD ev N um ro 5
Objectifs : tudes des Sockets, communication rpartie Rappels de notions rseaux, Tcp/ip, Ports.

Grce ce nouveau TP nous allons rentrer dans le monde merveilleux de la communication distante via rseau. Cette jolie introduction pour vous faire comprendre que ce support va nous apprendre faire discuter 2 (ou plusieurs ) Ordinateurs entre-deux. Nous allons employer les Sockets et les threads. Commenons par dfinir ces 2 termes : Les Sockets : Une Socket est dfinie comme une extrmit dune communication. Une paire de processus (ou de Threads ) communiquant sur un rseau emploie une paire de sockets, une pour chaque processus. Un socket est constitu dune adresse IP concatne un numro de port. En gnral les sockets utilisent Une architecture Client/serveur. Le serveur attend des requtes entrantes du client en coutant un port spcifique. Ds Rception dune requte, il accepte une connexion du socket du client. Les serveurs implmentant des services particuliers (par exemple, Telnet, ftp, mail, http), coutent des ports bien connus (Telnet coute le port 23, un serveur ftp le port 21, un serveur web [Http] le port 80 ). Les ports infrieurs 1024 sont considrs comme connus et sont utilisables pour les services standards. Lorsquun thread client commence une requte de connexion, il se voit assigner Un port par la machine hte. Ce port est un nombre suprieur 1024. Par exemple, lorsquun client de lhte X dadresse IP 192.168.5.20 souhaite tablir une connexion avec un serveur Web (qui coute le port 80) dadresse 192.168.6.10, lhte X peut se voir affecter le port 1625. La connexion est constitue dune paire de sockets : (192.168.5.20 : 1625) sur lhte X et (192.168.6.10 : 80) sur le serveur Web. Un thread peut tre peru comme un flot de contrle lintrieur dun processus. Dans notre cas il joue le rle dinterface entre les 2 ordinateurs, interceptant les donnes transmises. Notre exercice consistera crer 2 excutables, un client et un serveur. Le serveur sera en attente de rception de message et le client essayera de se connecter au serveur et de lui envoyer des messages. Pour cela il nous faudra 2 projets un pour le client, un pour le serveur
Je vous rappelle que plus on avance au fil des TP moins je dtaille les fonctionnalits que je considre comme Devant tre acquises. Donc si ce stade vous prouvez des difficults reprenez les cours prcdents.

P artie Serveu r
Vous allez commencer par crer un nouveau projet nomm Serveur . Nous ne travaillerons pas sur des fichiers donc faites en sorte de n'utiliser aucune analyse. Nous naurons besoin que dune fentre que vous nommerez Depart et qui sera la premire fentre du projet. Faites en sorte quelle ressemble celle ci :

C e tte z o n e e s t d e stin e rec e vo ir le n u m ro d u p o rt d c o u te . C e s t u n o b je t c h am p d e s a is ie q u e v o u s n o m m e re z portip

C e s 2 b o u to n s s e ro n t n o m m s dem arre e t arrete . A v o u s d e c h o is ir q u i e s t q u i.

Ic i s a ffic h e ro n tle s p h ra s e s e n v oy e s p a r le c lie n t. C e s t u n o b je t lis te q u e v o u s n o m m e re z liste1

C e tte z o n e d e te x te n o u s in d iq u e ra s i le s e rv e u r e s t a c tif o u p a s . C e s t u n o b je t c h am p d e s a is ie q u e v o u s n om m e re z etatserveur

Analysons le fonctionnement du serveur : 1. Il faut lui donner un port a couter. 2. Il faut lancer la boucle dcoute (boucle infinie) et faire en sorte que les vnements dentrs ( demande de connexion) soient traits par des threads. 3. Une fois la connexion accepte le texte reu sera inscrit dans la liste droulante. Nous allons commencer par crer une procdure dattente ( la boucle dcoute ). Pour cela crez une procdure globale nomme attente

Voici le code que nous allons analyser.


P R O C E D UR E a tten te ( ) B O U C L E // d b u t d e la b o u c le S I S o c k etA tte n dC o n n e x io n ( " s e r v e u r " )A L O R S // s i u n e d e m a n d e d e c on n e x io n e s t e n a tte n te c a n a l e s t u n e c h a n e c a n a l= S o c k e tA c c p te ( " s e r v e ur" ) //C ette fo n c tio n p erm e t d e c r er le c a n a l d e co m m u n icatio n e n tr e la s o c k e t e ser v e u r e t la s o c k e t c lie n te . T h r e a d E x c u te th r ea d c n x ,thre a d No rm al," af fic he m e s" ,c a n a l) //L a n c e l'ex c u tio n d 'u n " th r e a d " ( M u ltita c h e (- 3 0 ) //L a f o n c tio n M u ltita c h e a v e c u n n e g a tif s u s p e n d l a p p lic a tio n FIN FIN

Vous pouvez constater que nous nous trouvons devant une boucle sans fin ou en attente dite active. A lintrieur de cette boucle une fonction WinDev (SocketAttendConnexion), est charge de vrifier si des demandes de connexion se produisent. Comme paramtres cette fonction prend un argument qui est le nom du socket ici serveur. Vous allez voir o nous allons dfinir la socket nomme serveur. Pour linstant lessentiel est de comprendre le principe de la boucle dattente active. Donc si une demande de connexion se produit pour la socket serveur on laccepte en crant un canal de communication. Vous pouvez considrer ce canal comme un tunnel ou les donnes vont transiter. La ligne : ThreadExcute (threadcnx, threadNormal,"affichemes", canal), est charge de faire en sorte que le code de la fonction affichemes soit excute comme un Thread normal appel threadcnx utilisant le parametre canal) Multitache(-30) : L'excution de l'application est suspendue durant <Temporisation> 100me de seconde. D'autres traitements peuvent tre excuts durant cette priode de temps (r-affichage ou excution d'un code de clic par exemple). Dans notre cas la boucle est gele pour permettre aux threads de sexcuter durant leurs quantums. NB : la socket sappelle serveur , le canal cre sappelle canal , le thread gestionnaire se nomme threadcnx . Maintenant nous allons nous intresser la procdure affichemes .Cest elle le cur de notre serveur puisque cest la gestionnaire dvnement. Pour ce faire crez une procdure globale affichemes (affichemes pour affiche messages).
P R O C E D UR E af fic he m e s (c a n a l) te x te e s t u n e c h a n e BOUCLE te x te = S o c k e tL it( c n a l,V r ai) a L is te A jo u te ( " lis te " ,te x te ) 1 FI N T h r e a d A r r te ( " " ,5 0 0 ) M u ltita c h e (- 3 0 )

Comme vous pouvez le constater la procdure prend comme paramtre le nom du canal reliant les 2 sockets. Je vous rappelle que cette procdure est lance en temps que thread. La fonction WinDev SocketLit lit le contenu du canal et le mets dans la variable texte. Le paramtre vrai signifie SocketLit que la dure dattente sur canal est indfinie. Une fois le message rcupr il doit tre mis dans notre liste droulante liste1 . Le reste de la procdure nappelle pas de commentaires particuliers.

Continuons par le code du bouton demarre.


S I P A S S o ck e tC r e ( " s e rv e u r" ,P O R TIP ,N e tAd re s s e Ip ()) A L O R S E rr eu r("E rr eu r d e c r a tio n " + E r r eu rIn f o( e r r M e s s ag e)) E T A T S E RV E U R =" P ro b lm e lor s d u d m arra ge d u s erv e ur" SIN O N E T A T S E RV E U R= " S e rv eu r d m ar r" T h r e a d E x c u te " th r e a d 1",th r e a d N orm al,atte n te ) ( FIN

Ce code lance lexcution du serveur. La procdure WinDev SocketCrer utilise plusieurs parametres : Le nom de la socket que lon va crer. Le port sur lequel on coute. Ladresse ip du poste serveur. Comme vous le voyez la lecture de ce code si la socket serveur est cre on fait de notre procdure globaleattente un thread qui appellera lui mme le thread affichemes. Voici le code du bouton arrter
S o c k e tF erm e( " se r ve u r " ) E T A T S E RV E U R= " A rr e t d u s e rv e u r"

Voil la partie serveur est maintenant termine Il ne vous reste plus qua crer lexcutable (Menu Projet/Crerlexecutable). NB: Si vous avez des Warnings concernant une boucle sans condition de sortie ne vous en souciez pas ! Ds a prsent vous avez conu un serveur, il ne nous reste plus qua crer le client. Son rle est dessayer de se connecter au serveur et de lui envoyer des messages.

P artie C lien te
Pour le client, comme ce doit etre une application autonome, il nous faut donc crer un projet, sans analyse ayant pour nom Client. Ce projet ne contiendra quune fenetre nomme Depart. Elle ressemblera ceci :
O b je t c ha m p d e s ais ie N o m : A D R IP

Objet : Champ de saisie. Nom : messa Objet : champ de saisie. Nom : Portip

Objet : Champ de saisie. Nom : ETATCNX

Comme vous pouvez le constater le client est vraiment minimaliste. On saisit ladresse ip du serveur, le port dcoute, le message transmettre. Le bouton Connexion nous servira pour tablir la liaison, le bouton envoyer transmettra le message. Intressons nous au bouton connexion. Son rle est de nous mettre en relation avec la socket du serveur. Voici le code du bouton.
S I P A S S o ck e tC o n ne c te (" se rv eu r" , P O R T IP ,A D RIP ) A L O R S E rreu r("e rreu r d e c o n n e x io n " + E rre urIn fo(e rrM e s s a g e)) S IN O N E TA T C N X= " V o u s e te s e n lig n e " F IN

On essaye de ce connecter la socket nomme Serveur, coutant le port dfini ( PORTIP), telle adresse IP (ADRIP). Si tout ce passe bien on crit Vous tes en ligne dans le champ de saisie Etatcnx. Sinon on envoie le message derreur. Maintenant voyons le code du bouton envoyer. S I S o ck e tEcrit(" serv eu r", m e ssa) = F aux A L O R S In fo("U n pro blm e e s t surv en u") F IN On envoit un message ( le texte contenu dans le champ de saisie messa ) la socket serveur. Si ca ne fonctionne pas on affiche une boite de dialogue davertissement.

Voil tout est fini, vous pouvez compiler, crer lexcutable et tester votre client/serveur. Pour la mise en uvre vous avez besoin de lancer le serveur, le mettre en coute dun port. Ensuite vous lancez le client que vous branchez sur le port dcoute et envoyez le message. Si vous tes en rseau utilisez la bonne adresse IP du serveur

C ou rs W inD ev N um ro 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 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 Est 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 ? 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 cette leon 6 sans matriser les Tp prcdents. Je ne reviens pas sur les notions abordes dans les TP prcdents. Pour le bon droulement de ce support tlchargez et installez easyphp que vous trouverez ladresse Suivante : http://www.easyphp.org/

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.

Voici le prototype de la premire fentre que vous nommerez dpart et qui sera la premire fentre du projet.
Ic i v o u s tro u v e z 4 c h am p s d e s a is ie n o m m s : N um ip, L ogin, M d p, E tatcnx. U n b o u to n n o m m C nx. C e s c ha m p s so n t d a n s u n c h am p lib e ll d e s ty le L ib e ll-A c h e v a l_ D o u b le B , d o n t le lib e ll e s t : C o n n e x io n a u s e rv e u r M y s q l Ic i, c r e z u n c h a m p a rb re q u e v o u s n o m m e re z listebase. V o u s p o u v e z le n c a d re r p a r u n c h am p lib e ll .

A tte n tio n , ic i c e s t u n e ta b le m m o ire q u e v o u s n o m m e re z T able1 d o n t to u te s le s c o lo n n e s s o n t in v is ib le s . D a n s c e tte ta b le s e ra a ffic h le c o n te n u d e s ta b le s d e v o tre b a s e d e d o n n e M y s q l. L affic h a g e e s t a c tiv p a r u n c h o ix d e ta b le d a n s la rb re listebase. C o m m e n o us n e c o n n a is so n s p a s p rio ri le n o m b re d e c o lo n n e s d e la ta b le a a ffic h e r n o u s a llo n s em p loy e r u n e g ro s s e ru s e C h ey e n n e . O n v a c r e r u n e q u in z a in e d e c o lon n e s te x te n o m m e s c 1 ,c 2 ,c 3 ..c 1 5e t to u te s in v is ib le , c a p ito ? N o u s c r e ro n s laffic h a g e p a r p ro g ram m atio n p lu s ta rd

In s re z 2 b o u to n s u n n o m m R equ ete, la u tre Q uitter. J e v o u s la is s e tro u v e r le c o d e d u b o uto n Q u itte r.

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 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. 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 chaque bases, les tables constituantes. Dans le champ etatcnx nous mettrons un texte nous indiquant le succs de la connexion sinon lchec. Verifier que vous avez plac tous les objets et votre fentre ressemble la mienne .Vous lenregistre sous le nom de dpart .Vous la dclare comme premire fentre du projet. 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 :

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. 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. Le5eme 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 les bases.

Le rle de cette procdure est de nous remplir larbre avec les bases de donnes MySQL et les tables les composants. Voyons son code :

P R O C E D UR E lesb a s e s ( ) r e s u lta t e s t u n b o o l e n r e s u lta t= S Q L Ex e c ( " s h o w d a ta b a s e s " ," r e q u e te 1 " ) S I r e s u lta t A L O R S // L e x c u tio n d e la re q u te e s t r u s sie T A NT Q U E S Q L F e tch ( " r eq ue te1 ") = 0 A rb r e A jo ute ( lis teb a s e ," B a s e s" + T AB + S Q L L itCo l("r eq u e te1 " , 1 ) ,a D fa u t,a D fau t,S QL L itCo l( " r eq ue te1 ", 1 )) le s tab le s ( S QL L itC o l( " r eq ue te1 " , 1 )) FIN S Q L Fe rm e("r eq ue te1 " ) A r b r e D r o u le ( lis te b a s e ," Bs e s " ) a SIN O In f o ( " V o u s a v e z u n p r o b lm e d e c on n e x io n " ) N 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.
T A NT Q U E S Q L F e tch ( " r eq ue te1 ") = 0

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 hic est que tant quelle retourne 0 la lecture de l'enregistrement s'est bien passe. 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("req ue te1 " , 1 ) lit pour la requte passe en paramtre, le contenu dela colonne passe aussi en paramtre (ici 1). 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 S Q L L itC o l("re q u e te 1 ",1 )

Crez donc cette procdure


P R O C E D UR E le sta b le s ( la b a s e ) r e s u lta t e s t u n b o o l e n S Q L C o n n e c te ( N m ip ,lo g in ,m d p ,la b a s e ," M y S Q L " ) u r e su lta t= SQ L E x e c( " sh ow tab le s "," re q ue te2 " ) S I r e s u lta t A L O R S T A NT Q U E S Q L F e tch ( " r eq ue te2 ") = 0 A r b r e A jo u te ( lis te a s e ," B a s e s " + T A + la b a s e + T A B + S Q L L itC o l( " r e q u e te 2 " , b B 1 ),a D f a u t,a Df a u t,S Q L L itC o l( " r e q u e te 2 "1, ) ) FIN S Q L Fe rm e("r eq ue te2 " ) A r b r e Dr o u le ( lis te b a s e ," B a s e s " T A B + la b a s e ) + FI N

S Q L De c o n n e cte ( )

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 vous verrez le tree-view est rempli de larborescence bases de donnes + Tables. 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. 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 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 aidemand 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. 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 faitun transfert du contenu de la requte dans la table mmoire. Sauvegardez et testez votre travail. 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 :

Un champ de saisie nomm la requte 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. 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