delphi bases de donnees

67
Support de cours DELPHI Enseignante Mme DJIDEL Institut National De Formation Professionnelle Pins Maritimes Annexe Ruisseau

Upload: geniemedecin

Post on 01-Oct-2015

516 views

Category:

Documents


175 download

DESCRIPTION

tbien

TRANSCRIPT

  • Support de cours DELPHIEnseignante Mme DJIDEL

    Institut National De Formation Professionnelle PinsMaritimes Annexe Ruisseau

  • Mme DJIDEL support de cours DELPHI

    1

    Table des matiresCration de la base de donnes-------------------------------------------------------------------------------------------3Cration d'un programme exploitant une base de donnes dj cre l'aide de l'expert fiche basede donnes : -------------------------------------------------------------------------------------------------------------------6(sans l'aide de l'expert fiche base de donnes) --------------------------------------------------------------------- 10Modifier le contenu des champs par programmation. ------------------------------------------------------------ 13Se dplacer dans une base de donnes; ------------------------------------------------------------------------------ 15Cration d'un index secondaire; tri de la base ---------------------------------------------------------------------- 17Faire une recherche dans une base de donne --------------------------------------------------------------------- 20Filtrer une base de donnes --------------------------------------------------------------------------------------------- 22Utilisation d'un DataModule --------------------------------------------------------------------------------------------- 23Lier deux tables Relation matre-dtail ou relation un--plusieurs entre deux tables-------------------- 25

    Que veut on faire ?--------------------------------------------------------------------------------------------------- 25Cration des 2 tables :----------------------------------------------------------------------------------------------- 25

    Utilisation d'un DataModule ------------------------------------------------------------------------------------------ 26Connexions nos tables ----------------------------------------------------------------------------------------------- 26Liaison des deux tables------------------------------------------------------------------------------------------------- 28

    Faisons le point sur l'architecture--------------------------------------------------------------------------------- 30Test du programme -------------------------------------------------------------------------------------------------- 30

    Utilisation d'une liste de choix pour rentrer une donne--------------------------------------------------------- 32Le DBCombobox----------------------------------------------------------------------------------------------------- 32Indiquer le contenu de la liste droulante du DBComboBox ---------------------------------------------- 32Indiquer la table et le champ modifier ------------------------------------------------------------------------ 34Le DBLookUpComboBox ou comment remplir la liste l'aide d'une table --------------------------- 34Cration de la table -------------------------------------------------------------------------------------------------- 34Indiquez le contenu de la liste droulante du DBLookUpComboBox. ---------------------------------- 36Indiquez la table et le champ de cette base qui doivent tre modifis suite au choix dans cette listedroulante. ------------------------------------------------------------------------------------------------------------- 36Quelle valeur s'affiche dans le DBLookUpCombobox ? --------------------------------------------------- 36Trier, filtrer, la liste de choix -------------------------------------------------------------------------------------- 37

    SQL Structured Query Language ---------------------------------------------------------------------------------------- 38Construction d'un exemple----------------------------------------------------------------------------------------- 39

    Modification de la requte SQL l'excution. Requtes paramtres SQL. -------------------------------- 43Solution pour adapter la requte SQL une entre utilisateur sans utiliser les requtes SQLparamtres. ----------------------------------------------------------------------------------------------------------- 43

  • Mme DJIDEL support de cours DELPHI

    2

    Utilisation des requtes paramtres.---------------------------------------------------------------------------- 44Utilisation du composant TDataBase ---------------------------------------------------------------------------------- 46

    Utilisation : ------------------------------------------------------------------------------------------------------------ 47Exemple : Suppression de la demande de mot de passe ---------------------------------------------------- 48

    Utilisation d'une base ACCESS l'aide de ODBC + BDE. ----------------------------------------------------------- 49Dclaration de la base de donne dans l'ODBC :------------------------------------------------------------- 49

    Utilisation d'une base ACCESS l'aide d'ADO.----------------------------------------------------------------------- 52Connexion de la base : ---------------------------------------------------------------------------------------------- 52Test de la connection ------------------------------------------------------------------------------------------------ 53

    Utilisation des composants DbExpress pour lire une base MySQL (D6 et plus). ---------------------------- 54Introduction : ---------------------------------------------------------------------------------------------------------- 54

    Lecture d'une base MySQL existante : ----------------------------------------------------------------------------- 54Connexion la base :------------------------------------------------------------------------------------------------ 54Connection d'un ensemble de donnes (DataSet) l'aide d'un SQLClientDataSet------------------- 56Accder aux donnes. ----------------------------------------------------------------------------------------------- 57Testez.------------------------------------------------------------------------------------------------------------------- 57Rendre les donnes modifiables. --------------------------------------------------------------------------------- 58Nota :-------------------------------------------------------------------------------------------------------------------- 58Questions a qui a une rponse... :--------------------------------------------------------------------------------- 59

    Utilisation de QuickReport pour faire des impressions d'lments d'une base de donnes.------------ 60Introduction : ---------------------------------------------------------------------------------------------------------- 60Un premier programme --------------------------------------------------------------------------------------------- 60Aller plus loin avec QuickReport -------------------------------------------------------------------------------- 62

    Utilisation d'Excel comme base de donnes. ------------------------------------------------------------------------ 64Introduction : ---------------------------------------------------------------------------------------------------------- 64Constitution de notre base : ---------------------------------------------------------------------------------------- 64Accs notre base par Delphi : ----------------------------------------------------------------------------------- 66

  • Mme DJIDEL support de cours DELPHI

    3

    Cration de la base de donnes

    dernire mise jour le : mercredi 30 octobre 2002

    Ce premier programme va tre fait en deux temps :

    Cration de la base de donnes elle mme Cration du programme Delphi permettant de voir, ajouter, supprimer des

    lments de la base. Cette cration se fera l'aide de l'assistant Expert fichebase de donnes.

    Cration de la base de donnes Choisir dans le menu : Outils / Module base de donnes. Le module de

    gestion de base de donnes se charge. (Dans Delphi 2 ouvrir directement lemodule base de donnes partir du menu dmarrer de windows).

    Cration d'un alias:

    Un alias sera quivalent un chemin. Par exemple, on peut dfinir que TEST seraquivalent c:\basededonnees\mabase

    Dans le module de gestion de base de donnes, faire Outils / Gestionnaire d'aliaspuis cliquez sur le bouton Nouveau

  • Mme DJIDEL support de cours DELPHI

    4

    Dans la case Alias de la base, entrez TEST, puis cliquez sur parcourir pourentrer le chemin d'accs. Cliquez alors sur provisoire puis sur enregistrersous sans rien changer pour enregistrer le changement (l'ajout de l'alias).

    Cration de la table :

    Faire Fichier / Nouveau / Table puis choisir Paradox 7 Entrez alors la composition des champs telle que dans cette image :

    Les types reprsentent les types des valeurs associes aux champs ex: A commealphabtique ou N comme numrique. Vous pouvez voir tous les types disponiblesen cliquant avec le bouton droit dans la colonne Type. Le type + permet une

  • Mme DJIDEL support de cours DELPHI

    5

    incrmentation numrique automatique. Dans notre exemple, ce champ servirad'index primaire (cl) notre base. Ce champ permet de distinguer lesenregistrements les uns des autres. Par dfaut la base sera trie selon cette cl.Double cliquez dans la colonne index ligne Num pour dire que Num est un index.

    La taille reprsente le nombre de caractres que pourra avoir le contenu des champs( ex: ici, les noms pourront tre rentrs sur maximum 15 caractres).

    Faire enregistrer sous puis dans alias, choisir TEST. Donner un nom votrebase ex: annuaire0. Sauver.

    Vous pouvez sortir du module de gestion de base de donnes.

    Voil, votre base de donnes est cre. Il nous reste l'exploiter.

  • Mme DJIDEL support de cours DELPHI

    6

    Cration d'un programme exploitant unebase de donnes dj cre l'aide del'expert fiche base de donnes :

    dernire mise jour le : mercredi 30 octobre 2002

    Votre base de donnes doit dj tre cre. Si ce n'est pas le cas, cliquez ici

    Dans le menu de Delphi, faire Fichier / Nouveau. Dplacer les onglets l'aide despetites flches pour aller chercher l'onglet "Affaires". Pour Delphi 2, dans le menude delphi faire Base de donnes / Expert fiche.

    Une boite de dialogue s'ouvre vous demandant "Quelle type de fiche voulez vousque l'expert cre ?

    Laissez les rponses par dfaut (crer une fiche simple et crer une fiche avecTTable). Cliquez sur suite.

  • Mme DJIDEL support de cours DELPHI

    7

    Dans la case Lecteur ou nom d'alias, choisissez l'alias que nous avons cr("TEST"). Cliquez alors sur le nom de votre table (annuaire0.db). Cliquez sur suite.

    Vous devez alors indiquer quels sont les champs de la base que vous souhaitezutiliser. Vous pouvez les slectionner tous en cliquant sur le bouton ">>". Cliquezsur suite.

    Choisissez alors une disposition pour les champs

  • Mme DJIDEL support de cours DELPHI

    8

    Horizontalement ou

    Verticalement ( choisir pour avoir des rsultatssimilaires dans la suite de l'exemple) ou

    Dans une grille. Faire "suite"

    Choisir si vous voulez les libells gauche ou droite (pour l'exemple : prendre gauche)

    Faire "suite" puis terminer en laissant coch "gnrer une fiche matre" et pourgnration de fiche : "fiche seulement".

    Delphi vous a gnr une fiche :

    Votre programme est termin !!Lancez le avec F9 Vous remarquerez que vous n'avez pas le droit de modifier lechamp NumOrdre. Ce champ (rappelez vous il est en auto incrmentation), est enlecture seule.

    Ce que Delphi a fait automatiquement pour vous :

  • Mme DJIDEL support de cours DELPHI

    9

    Delphi a plac un composant TTable sur la fiche. Ce composantnous donne un accs notre base de donnes. Sa propritDataBaseName contient notre alias TEST et sa proprit TableNamecontient le nom de notre base de donnes (annuaire0.db).

    Delphi a galement insr un Composant TDataSource Cecomposant sert de canal (d'intermdiaire) entre le composant TTableet d'autres composants. Ces derniers permettent par exemple devisionner le contenu de la table. Ce sont par exemple les TDBEdit etTDBNavigator.Sa liaison avec le composant TTable est matrialispar sa proprit DataSet que Delphi a rempli pour vous avec le nomde votre composant TTable c'est dire "Table1"

    Delphi a insr autant de TDBEdit que de champ. Il les anomms Edit suivi du nom du champ. Les TDBEdit sont relis auTDataSource par l'intermdiaire de leur proprit DataSource. Delphia rempli cette proprit pour vous (en y crivant "DataSource1" quiest le nom de notre TDataSource). Delphi a galement rempli laproprit DataField avec le nom du champ de notre base de donnesdont le contenu sera afficher dans le TDBEdit.

    Delphi a insr un composantTDBNavigator ce composant permetde se dplacer parmi les enregistrements de la base de donnes etmme d'en ajouter ou d'en retirer. Ce composant est galement reli notre base de donnes par l'intermdiaire de sa proprit DataSourcequi doit contenir le nom d'un TDataSource (ici : "DataSource1").

  • Mme DJIDEL support de cours DELPHI

    10

    Exercice pratique : rajoutez sur la fiche un DBGrid (OngletContrleBD de la barre des composants de Delphi) EntrezDataSource1 dans sa proprit DataSource. Vous avez ainsi cr lepont entre le DBGrid et votre base de donnes. Observez : si vousmettez la proprit Active de votre Table1 true, vous voyezimmdiatement le contenu de votre base de donnes sous forme d'untableau dans le DBGrid ! Lancez votre programme ...

    A ce stade, votre programme doit ressembler ce source.

    (sans l'aide de l'expert fiche base dedonnes)dernire mise jour le : dimanche 26 aot 2001

    Votre base de donnes doit dj tre cre. Si ce n'est pas le cas, cliquez iciRappelez-vous le schma vu la leon prcdente :

    Dans l'onglet AccsBD, prenez un composant Table et placez le survotre fiche (Form1). Ce composant nous donne un accs notre base dedonnes.

    Entrez dans sa proprit DatabaseName le nom de votrealias (TEST si vous avez suivi la cration de la basetel que dcrite dans ce tutorial).

  • Mme DJIDEL support de cours DELPHI

    11

    Dans sa proprit TableName, entrez le nom de votretable

    Rendez actif le composant Table1 en mettant sa proprit Active "True"

    Toujours dans l'onglet AccsBD, prenez un composant DataSource etplacez le sur votre fiche. Ce composant sert de canal (d'intermdiaire) entrele composant TTable et d'autres composants. Ces derniers permettent parexemple de visionner le contenu de la table. Ce sont par exemple lesTDBEdit et TDBNavigator.

    Entrez "Table1" dans sa proprit DataSet . Celaassure sa liaison avec le composant Table.

    Il faut maintenant ajouter les composants qui vont nous permettre devisualiser et modifier notre base de donnes.

    Dans l'onglet ContrleBD, prenez un composant DBNavigator etplacez le sur la fiche. ce composant permetde se dplacer parmi les enregistrements de la base de donnes et mme d'enajouter ou d'en retirer.

    Reliez ce ContrleBD notre DataSource en affectant DataSource1 saproprit DataSource

    Toujours dans l'onglet ContrleBD, prenez un composant DBEdit etplacez le sur la fiche. Affectez sa proprit DataSource DataSource1 et sa proprit DataField au nom del'un des champs de notre base de donnes par exemple"Nom"

    Refaire la mme manip avec deux autres DBEdit et ce, pour les autreschamps de notre base (NumOrdre, Prnom et Age).

  • Mme DJIDEL support de cours DELPHI

    12

    Votre programme est termin !!Lancez le avec F9. Vous remarquerez que vous n'avez pas le droit de modifier lechamp NumOrdre. Ce champ (rappelez vous il est en auto incrmentation), est enlecture seule.

    Exercice pratique : rajoutez sur la fiche un DBGrid (Onglet ContrleBD de labarre des composants de Delphi). Entrez DataSource1 dans sa propritDataSource. Vous avez ainsi cr le pont entre le DBGrid et votre base de donnes.Lancez votre programme. Le DBGrid reprsente votre base sous forme d'untableau.

  • Mme DJIDEL support de cours DELPHI

    13

    Modifier le contenu des champs parprogrammation.

    dernire mise jour le : samedi 18 mars 2000

    Reprenez l'exemple cr prcdemment l'aide de l'expert (avec ajout du DBGrid)ou tlchargez le ici (ce source ne peut marcher que si vous avez cr votre base dedonnes conformment la leon 1)

    Il existe deux faons d'accder (lire ou crire) au contenu des champs: par le n duchamp ou par son nom.

    Accs par le n du champ

    Les objets TTable possdent un tableau de champs Fields. Attention, ce tableaucommence l'indice 0.Dans notre exemple, si on fait UneVariable:=Table1.Field[0].AsString UneVariable contiendra la valeur du premier champ.AsString est une proprit qui permet de convertir le type natif du champ en string..Il existe AsInteger, AsFloat, AsBoolean, AsCurrency, AsDateTime et AsVariant.Si on met par exemple UneVariable:=Table1.Field[0].AsFloat et si le champcontient un string, cela dclenche une exception.

    Si ce n'est dj fait : dans la clause uses de la Form2, ajoutez l'unit Dialogs (pourpouvoir utiliser un ShowMessage)

    Ajouter un bouton votre projet. Implmentez sa mthode OnClick avec la lignesuivante:

    procedure TForm2.Button1Click(Sender: TObject);begin

    ShowMessage(Table1.Fields[0].AsString);end;Lancez votre programme pour le tester...

    Par la mme mthode, vous avez un accs en criture. Ajoutez un bouton etimplmentez sa mthode OnClick avec les lignes suivantes:

    procedure TForm2.Button2Click(Sender: TObject);begin

    Table1.Edit;Table1.Fields[0].AsString:= 'coucou';

  • Mme DJIDEL support de cours DELPHI

    14

    end;

    Table1.Edit permet de se mettre en mode Edition. C'est indispensable pour pouvoirmodifier un champ.

    Lancez votre programme pour le tester...

    L'inconvnient de cette mthode est qu'il faut connatre l'emplacement des champs.Si on modifie l'ordre des champs, notre programme ne fonctionnera pluscorrectement. il est donc prfrable d'accder par le nom du champ.

    Accs par le nom du champ

    La fonction FieldByName nous permet un accs par le nom du champ :

    function FieldByName(const FieldName: string): TField;

    Cette fonction nous permet d'accder directement aux proprits et mthodesspcifiques d'un champ dont on connat le nom.

    On peut donc modifier l'implmentation de l'vnement OnClick de notre premierbouton:

    procedure TForm2.Button1Click(Sender: TObject);begin

    ShowMessage(Table1.FieldByName('Nom').AsString);end;

    et l'implmentation de l'vnement OnClick de notre second bouton :

    procedure TForm2.Button2Click(Sender: TObject);begin

    Table1.Edit;Table1.FieldByName('Nom').AsString:= 'coucou';

    end;

    Lancez votre programme pour le tester...

  • Mme DJIDEL support de cours DELPHI

    15

    Se dplacer dans une base de donnes;

    dernire mise jour le : samedi 29 janvier 2000

    Se dplacer dans la base

    Reprenez l'exemple cr prcdemment l'aide de l'expert (avec ajout du DBGrid)ou tlchargez le ici (ce source ne peut marcher que si vous avez cr votre base dedonnes conformment la leon 1)

    Le but de cette leon est de dcouvrir les procdures qui servent se dplacer dansune base de donnes sans passer par le composant DBNavigator.

    Le composant TTable dispose de plusieurs mthodes permettant de se dplacerdans la base:

    First Va au premier enregistrementLast Va au dernier enregistrementPrior Se place l'enregistrement prcdentNext Se place l'enregistrement suivant

    MoveBy(I) Se dplace de I enregistrement. Si I>0 on se dplace vers la fin de la base sinonvers le dbut.

    Par exemple, sur votre fiche, ajoutez un bouton. Affectez sa proprit caption First. Double cliquez dessus afin d'implmenter l'vnement OnClick ainsi :

    procedure TForm2.Button1Click(Sender: TObject);begin

    Table1.First;end;

    Rajoutez d'autres boutons afin de tester les autres mthodes. Pour la mthodeMoveBy, ajouter un TEdit afin de pouvoir faire varier le I.A ce stade, votre projet doit ressembler ceci : source du projet. (ce source ne peutmarcher que si vous avez cr votre base de donnes conformment la leon 1)

    Se dplacer dans la base de donnes afin d'effectuer un traitement dans unchamp

  • Mme DJIDEL support de cours DELPHI

    16

    Les modes de dplacement expliqus ci-dessus permettent galement d'examinertous les enregistrements afin d'en effectuer un traitement.

    Exemple: Nous allons mettre en majuscule tous les caractres des champs Nom.Pour cela, nous allons nous servir en plus des mthodes ci dessus, des mthodessuivantes:

    DisableControlsPermet de rendre inactif les contrles branchs cette table (acclre donc le traitement en vitantdes affichages inutiles dans nos DBEdit etc.

    EnableControls Les remet actifs

    EOF

    (End Of File) renvoie true si la table est vide, aprsun appel Last ou si un appel la mthode Nextchoue du fait que l'on est dj au dernierenregistrement. c'est ce dernier point qui nousintresse dans notre exemple. (Il existe aussi BOF:Begin Of File)

    Edit Place notre table en mode ditionFieldByName('NomChamp').AsString; Voir la leon consacre ce sujet

    Ajoutez sur votre fiche un bouton. Implmentez sa mthode OnClick :procedure TForm2.Button6Click(Sender: TObject);begin

    Table1.DisableControls;//rend inactif les contrlestry

    Table1.First; // se place sur le premier enregistrementwhile not Table1.EOF dobegin

    Table1.Edit; // se place en mode dition;

    Table1.FieldByName('Nom').AsString:=AnsiUpperCase(Table1.FieldByName('Nom').AsString);

    Table1.Next;// va l'enregistrement suivantend;

    finally // le try finally permet d'tre sur que l'on remet les contrlesactifs mme s'il y a une exeption

    Table1.EnableControls;// remet actif les contrlesend;

    Voil, c'est tout compilez, testez.... le source doit maintenant ressembler ceci : lesource du projet

  • Mme DJIDEL support de cours DELPHI

    17

    Cration d'un index secondaire; tri de labase

    dernire mise jour le : samedi 12 janvier 2002

    Reprenez l'exemple cr prcdemment l'aide de l'expert (avec ajout du DBGrid)ou tlchargez le ici (ce source ne peut marcher que si vous avez cr votre base dedonnes conformment la leon 1)

    Par dfaut, votre base de donne est trie dans l'ordre donn par notre indexprincipal c'est dire dans notre exemple, par n d'ordre.

    La cration d'un index vous permettra de trier les enregistrements selon un autreordre et de faciliter les recherches au sein de la base de donnes.

    Ajout d'un index secondaireL'ajout d'un index secondaire va se faire partir du Module de base de donnes (leprogramme qui nous avait permis de crer notre base de donnes).

    Avant de rentrer dans le ce Module de base de donnes, il faut mettre False laproprit "active" du Table1 de notre programme (si ce n'est pas dj fait) souspeine de ne pouvoir modifier la base de donnes (car dj prise par notreapplication).

    Ouvrez le Module de base de donnes (menu Outils / Module base dedonnes) puis icne de gauche "Ouverture d'une table".

    Dans la case alias, choisissez TEST et dans Nom choisissez "annuaire0.db".Choisissez Table / Restructurer. Dans la liste droulante sous "proprits dela table:" slectionnez "index secondaires".

  • Mme DJIDEL support de cours DELPHI

    18

    Cliquez sur le bouton "dfinir". En utilisant les boutons "flches gauche etdroite", vous pouvez choisir les champs qui seront indexs. Choisissez Nomet Age comme Champs indexs.

    Vrifiez que la case "maintenu" est coche. Sortez en cliquant sur OK. Donnez par exemple "Index Nom et age" comme

    nom d'index.

    Trier les enregistrements

    Pour trier les enregistrements, il suffit d'affecter

    la valeur "Index Nom et Age" la proprit IndexName de notre Table1 ou "Nom;Age" la proprit IndexFieldNames.

    Il n'y a pas besoin de compiler le programme pour voir l'effet obtenu : l'effet estimmdiat si la proprit active du composant Table1est true et ce, ds lamodification dans l'inspecteur d'objet. On remarquera que si on affecte une valeur IndexFieldNames, la valeur de IndexName est mis blanc. Rciproquement si vousaffectez une valeur IndexName, IndexFieldNames est mis blanc.

    Nos champs indexs taient dans l'ordre Nom puis Age. Par consquent, le triobtenu est un tri selon le nom. Pour les enregistrements ayant le mme nom on a untri par ge.

  • Mme DJIDEL support de cours DELPHI

    19

    On peut dfinir plusieurs index secondaires et par consquent obtenir diffrents trisen fonction de l'index utilis.

    On peut, bien sur, affecter ces proprits par programmation.

    Exemple : ajouter un bouton et implmentez sa mthode OnClick de la faonsuivante :

    procedure TForm2.Button1Click(Sender: TObject);begin

    Table1.indexName:='Index Nom et age';// tri par nom puis ge; utilisationde indexNameend;

    Ajoutez un autre bouton et implmentez sa mthode OnClick de la faon suivante :procedure TForm2.Button2Click(Sender: TObject);begin

    Table1.IndexFieldNames:='NumOrdre';//revient au tri donn par l'index principal; utilisation de

    IndexFieldNamesend;

    A ce stade, votre source doit ressembler : source

    Lancez votre programme pour le tester...

  • Mme DJIDEL support de cours DELPHI

    20

    Faire une recherche dans une base dedonne

    dernire mise jour le : samedi 12 janvier 2002

    Reprenez l'exemple cr dans la leon 6 ou tlchargez son source

    Une fonction FindKey et une procdure FindNearest permettent de rechercher unenregistrement dans une base de donnes.

    Pour FindKey comme pour FindNearest, la recherche se fait par rapport auchamp index. Si l'on veut par exemple chercher le premier enregistrementdont le champ Nom contient DUPONT, il faudra s'assurer que notre base dedonnes est indexe sur le champ Nom avant de dclencher FindKey ouFindNearest.

    FindKey recherche un enregistrement dont le(s) champ(s) correspondant l'index sont strictement gaux la (aux) valeur(s) passe(s) en paramtre.Par exemple, si l'on a index l'aide de l'index 'Nom et age':Table1.FindKey([Edit1.Text]) cherchera l'enregistrement dont la valeurcontenue dans le champ Nom est gale Edit1.Text.Rappelez vous : Nom et age est un index qui correspond dans l'ordre auxchamps indexes Nom et Age. On peut donc faire une recherche la fois surle nom et sur l'age. Table1.FindKey([Edit1.Text,10]) chercheral'enregistrement dont la valeur contenue dans le champ Nom est gale Edit1.Text et dont la valeur du champ age est gale 10.FindKey est une fonction qui renvoie true si l'enregistrement recherch a ttrouv, false sinon.

    Exemple : Dans la clause uses, ajoutez l'unit Dialogs (pour pouvoir utiliserun ShowMessage) puis placez un bouton et un TEdit (pour pouvoir entrer lenom) sur votre fiche et implmentez l'vnement OnClick du bouton de lafaon suivante :

    procedure TForm2.Button3Click(Sender: TObject);begin

    Table1.indexName:='Index Nom et age';// ainsi la recherche se fera sur le champ Nomif not Table1.FindKey([Edit1.Text]) then ShowMessage ('non trouv');// FindKey recherche l'enregistrement qui contient dans//le champ Nom le contenu de Edit1

  • Mme DJIDEL support de cours DELPHI

    21

    end;

    Pour tester la possibilit de faire une recherche sur le nom et l'age : ajouter unbouton et deux TEdit (un pour le nom (Edit2) et un pour l'age( Edit3) ) puisimplmentez l'vnement OnClick du bouton :

    procedure TForm2.Button4Click(Sender: TObject);begin

    Table1.indexName:='Index Nom et age';// ainsi la recherche se fera sur le champ Nomif not Table1.FindKey([Edit2.Text,StrToInt(Edit3.Text)])

    then ShowMessage ('non trouv');// FindKey recherche l'enregistrement qui contient dans// le champ Nom le contenu de Edit1

    end;

    FindNearest fonctionne d'une faon similaire FindKey mais il recherchel'enregistrement le plus proche de la valeur entre. Pour le tester, ajoutez unbouton et un TEdit puis implmentez son vnement OnClick :

    procedure TForm2.Button4Click(Sender: TObject);begin

    Table1.IndexFieldNames:='NumOrdre';// ainsi la recherche se fera sur le n d'ordreTable1.FindNearest([StrToInt(Edit4.Text)]);// FindNearest permet de se placer sur l'enregistrement//qui correspond au mieux au critre// ici : que le champ NumOrdre contient la valeur numrique//crite dans Edit4.Text.

    end;

    A ce stade, le source doit ressembler ceci : source.

  • Mme DJIDEL support de cours DELPHI

    22

    Filtrer une base de donnes

    dernire mise jour le : vendredi 24 aot 2001

    Reprenez l'exemple cr dans la leon 6 ou tlchargez son source

    Si ce n'est dj fait, mettez la proprit de Table1 True.

    Les proprits de TTable permettant de filtrer

    La proprit Filtered permet de rendre le filtre oprant. Placez le True La proprit Filter (de type string) permet de mettre un filtre afin de ne

    prendre en compte qu'une partie de la base de donnes.Par exemple, dans l'inspecteur d'objet, affectez la proprit Filter la chanede caractre 'D*' et mettez la proprit Filtered True. Vous ne voyez plusdans le DBGrid que les enregistrements dont le contenu du champ Nomcommence par D. Vous pouvez galement utiliser utiliser des filtres du type :Nom='D*' or Age=40

    La proprit FilterOptions permet d'indiquer si l'on veut tenir compte de lacase (majuscule minuscule). Pour cela, double cliquez sur la proprit puismettez True foCaseInsensitive. FilterOptions prend alors la valeur[foCaseInsensitive].Si par exemple vous avez mis dans la proprit Filter Nom='d*', le DBGridvous affiche tous les enregistrements dont le contenu du champ Nomcommence par D ou par d.

    Pour bien comprendre ces notions, vous pouvez tlcharger l'exemple suivant: source.

  • Mme DJIDEL support de cours DELPHI

    23

    Utilisation d'un DataModule

    dernire mise jour le : dimanche 26 aot 2001

    A l'utilisation, mettre nos composants servant atteindre nos bases de donnes (lesDataSource, Table ...) sur une ou des form se servant de ces bases peut se rvlerpas tre trs pratique.

    Delphi nous permet, si on le dsire, de regrouper tous ces composants non visuelnon pas sur une form mais sur un DataModule. A l'image d'une Form, unDataModule permet d'y dposer des composants. Le DataModule, contrairement une Form n'est pas visuel. On ne peut donc y dposer des composants visuels.Comme pour une Form, A chaque DataModule correspond une Unit.

    Concrtement, allez dans fichiers / nouveaux (suivi de autres si vous tes en D6)puis onglet Nouveaux : choisir Module de donnes

    Sur ce DataModule, vous pouvez y placer des DataSource, Table etc...

  • Mme DJIDEL support de cours DELPHI

    24

    Attention, il faut se rappeler que ce DataModule correspond une Unit (parexemple Unit2).Pour pouvoir utiliser les composants qui y sont placs partir d'une autre Unit, parexemple un DBGrid plac sur la form1, il faut placer Unit2 dans la clause Uses del'Unit comportant le DBGrid.

    usesWindows, ... Forms, Dialogs, Unit2;

    Suite du tutorial sur les DataModule venir (en construction)

  • Mme DJIDEL support de cours DELPHI

    25

    Lier deux tablesRelation matre-dtail ou relation un--plusieurs entre deux tables

    dernire mise jour le : samedi 13 octobre 2001

    Que veut on faire ?

    Supposez la cas suivant :

    Vous tes bibliothcaire et vous devez crer un programme qui gre les prts de voslivres.

    Vous avez besoin de connatre en permanence :

    Vos clients (coordonns, n de leur carte d'adhrant ...). Ces renseignementfigureront dans une table.

    Les mouvements de vos livres (qui les a emprunt, quand, sont ils rendus ...).Ces mouvements feront l'objet d'une autre table.

    Vous souhaitez, lorsque vous consultez les mouvements de vos livres, voir enmme temps les coordonns de l'emprunteur. Vous voulez donc qu' chaque foisque vous vous placez sur un enregistrement de la table contenant un mouvements,la table contenant les clients se place automatiquement sur l'enregistrementcorrespondant au client correspondant.C'est une relation un--plusieurs car un client ne correspondra qu'un seulenregistrement de la table des clients (c'est en fait un champ index). Par contre, ilpeut y avoir plusieurs enregistrements de la table des mouvements qui contiennentle mme client dans le champ correspondant.

    Cration des 2 tables :

    Pour les crer, se rfrer au tutorial sur ce sujet en conservant l'alias TEST Une pour vos clients que l'on nommera Annuaire.

    Bien mettre les champ NumClient et Nom en Index

  • Mme DJIDEL support de cours DELPHI

    26

    Une qui stockera les mouvements et que l'on nommera Mouvements

    Utilisation d'un DataModule

    Pour cet exemple, bien que ce ne soit pas indispensable, nous allons utiliser unDataModule. Placez le tel que vu dans le tutorial sur ce sujet.

    Connexions nos tables

    Sur ce DataModule, placez 2 composants Table et 2 composants DataSource

  • Mme DJIDEL support de cours DELPHI

    27

    Entrez le nom de l'Alias de notre base de donn dans le champ DataBaseName deTable1 et Table2

    Faisons pointer Table1 vers la table Annuaire.DB modifiant saproprit TableName :

    Faisons de mme pour Table2 mais en le faisant pointer vers Mouvements.DB :

    Reste "brancher" nos DataSources vers leur table respective.

    Affecter Table1 la proprit DataSet de DataSource1

    et Table2 la proprit DataSet de DataSource2

    Nous avons donc fini de placer les composants qui servent accder nos tables. Ilfaut maintenant placer des composants qui nous permettrons de visualiser, modifierces tables.

    Dans la Form1, placez deux DBGrid (Onglet ContrleBD de la palette decomposants).

    Nous allons utiliser leur proprit DataSource pour "brancher" chaque DBGrid versleur DataSource respectif. Ils pourront ainsi afficher respectivement les contenus dela Table 1 et de la Table2.

  • Mme DJIDEL support de cours DELPHI

    28

    Observez la proprit DataSource de l'un deux, Delphi ne nous en propose aucun.Normal, nos DataSources sont placs l'extrieur de notre Form1.Dans le uses de l'Unit1, il faut ajouter l' Unit2uses

    Windows, ... Forms, Dialogs, Unit2;

    Affecter DataSource1 la proprit DataSource du DBGrid1

    et DataSource2 la proprit DataSource du DBGrid2.

    Ds maintenant, mettez true la proprit Active de Table1 et Table2, vous devezvoir vos tables (sans doute vides chez vous...). Profitez-en pour lancer votreprogramme et commencer remplir la base. Pour la suite de l'exemple, faiteattention ce que les n des clients rentrs dans les mouvements correspondent un NumClient existant de l'annuaire.

    Liaison des deux tables

    Affectons DataSource2 la proprit MasterSource de Table1 (ainsi, Table1 est li DataSource2 qui lui mme est li Table2Il nous reste dsigner quel champ de Table1 servira de lien avec quel champ deTable2.

    Pour cela, cliquez sur les ... droite de la proprit MasterFields de notre Table1

  • Mme DJIDEL support de cours DELPHI

    29

    Delphi nous affiche gauche les champs index de Table1 et droite, tous leschamps de Table2.

    Cliquez sur le champ NumClient de la colonne Champs Dtail et sur NumClient dela colonne Champs matre, puis sur le bouton Ajouter.

    Le lien est fait : un enregistrement de Table2 sera li un enregistrement de Table1: celui qui a le mme n de client

  • Mme DJIDEL support de cours DELPHI

    30

    A noter que cela a chang les proprits MasterFields et IndexFieldNames deTable1. MasterFields a pris le nom du champ de Table2 (Client) qui doit tre liavec le champ de Table1 dsign par la valeur d'IndexFieldNames (NumClient).Faisons le point sur l'architecture

    Table1 et Table2 pointent respectivement vers Annuaire.DB et versMouvements.DB travers leurs proprits DataBaseName et TableName.

    DataSource1 et DataSource2 pointent respectivement vers Table1 et Table2et donc en fait vers Annuaire.DB et Mouvements.DB. Il le font par le biaisde leur proprit DataSet

    Table1, et donc en ralit la table Annuaire.DB, sait qu'il a une liaison detype matre-dtail (ou "liaison un--plusieurs" si vous prfrez) avec la tableMouvements.DB puisque l'on a plac DataSource2 dans sa propritMasterSource.

    Table1, et donc en ralit la table Annuaire.DB, sait que le champNumClient de la table Annuaire.DB et le champ Client de la tableMouvements.DB sont lis. Il le sait par l'intermdiaire de ses champsMasterFields et IndexFieldNames.

    Test du programme

    Vrifiez que les proprits Active de Table1 et Table2 sont True. Lancez leprogramme (F9). A chaque fois que l'on se dplace dans Table2, Table1 se placeautomatiquement sur l'enregistrement correspondant. Le DBGrid1 n'affiche plusque lui.

  • Mme DJIDEL support de cours DELPHI

    31

  • Mme DJIDEL support de cours DELPHI

    32

    Utilisation d'une liste de choix pour rentrerune donnedernire mise jour : samedi 13 octobre 2001

    Dans les bases de donnes, il arrive frquemment de vouloir que le choix del'utilisateur se limite un certain nombre de possibilits. Si on reprend l'exemple denotre bibliothque, on ne souhaite pouvoir entrer dans les mouvements (entres,sorties de livres) que des livres prsents dans notre inventaire. Cela vitera parexemple de saisir Delphi deux au lieu de Delphi2

    Le DBCombobox

    Le DBCombobox va nous permettre de rentrer "en dur" la liste de choix parl'intermdiaire de sa proprit Items.

    Reprenez la base de donne vue la leon 10 ou tlchargez la. Le cas chant,donnez lui "TEST" comme nom d'alias (cf leon 1 pour se rappeler comment ondonne un nom d'alias).

    Reprenez le projet construit la leon 10 ou tlchargez le.

    Ajoutez un DBCombobox (onglet ContrleBD) sur la form1

    Indiquer le contenu de la liste droulante du DBComboBox

    Il faut maintenant remplir la liste qui se droulera. Cliquez sur les ... droite de laproprit Items et rentrez la liste de livre de votreinventaire.

  • Mme DJIDEL support de cours DELPHI

    33

    Lancez le programme (F9). Cliquez sur de votre DBComboBox. Vous voyez laliste de choix se drouler.

    A ce stade, mme si vous slectionnez une valeur, cela ne rentrera rien dans votrebase de donne car on a pas encore indiqu la table et le champ qu'il faudramodifier. Si vous slectionnez une valeur, le DBComboBox restevide

  • Mme DJIDEL support de cours DELPHI

    34

    Il reste vide car ce qu'il affiche est justement la donne du champ de la tableconcerne. Pas de table indique => rien d'affich.

    Indiquer la table et le champ modifier

    Choisissez le DataSource qui correspond la table concerne l'aide de laproprit DataSource du DBCombobox (ici DataSource2).Choisissez le Champ concern l'aide de la proprit DataField (iciLivreEmprunte)

    Lancez le programme. Dplacez-vous dans le DBGrid, vous verrez que ce quis'affiche dans le DBCombobox est bien la valeur du champ LivreEmprunte del'enregistrement courant.

    Inversement, vous pouvez modifier la valeur en question par le biais de la liste dechoix du DBCombobox.

    La plupart d'entre vous sont en train de se dire que c'est bien gentil tout cela, mais ilva falloir recompiler chaque fois que l'on ajoute un livre dans l'inventaire !Effectivement, la solution DBCombobox est certainement bien pour rentrer parexemple "vrai ou faux" ou "oui ou non" et encore, si on a pas de problme delangue, mais ce n'est certainement pas la bonne solution pour grer notrebibliothque. La bonne solution est d'afficher le contenu d'un champ d'une table.C'est le rle du DBLookUpComboBox.

    Le DBLookUpComboBox ou comment remplir la liste l'aide d'une table

    Cration de la table

    Crons une nouvelle table pour notre base de donnes nommes Livres.db(voir Leon 1) :Respectez les indications suivantes. Commencez la remplir. Pour gagner dutemps, vous pouvez la tlcharger. Placez bien ce fichier dans le mme dossier queles autres tables utilises pour ce tutorial (L'alias reste ainsi valide pour cette table)

  • Mme DJIDEL support de cours DELPHI

    35

    La liste droulante du DBLookUpComboBox va tre remplie l'aide d'un champde la table livre.

    Placez un TTable (qui se nommera Table3) et un DataSource (DataSource3)sur notre DataModule.

    Connectez Table3 la Base TEST en choisissant laTable Livre

    Connectez le DataSource3 Table3 par l'intermdiaire de sa propritDataSet.

    Mettez la proprit Active du Table3 True.

    Placez un DBLookUpComboBox (onglet ContrleBD) sur laForm1. Ce composant est l'quivalent d'un DBComboBox,mais il permet de remplir la liste droulante partir d'une table.

  • Mme DJIDEL support de cours DELPHI

    36

    Indiquez le contenu de la liste droulante du DBLookUpComboBox.

    Indiquez au DBLookUpComboBox qu'il doit remplir sa liste l'aide desdonnes que lui fournira le DataSource3 : Modifiez la proprit ListSourcedu DBLookUpComboBox

    Indiquez le ou les champ afficher dans la liste droulante l'aide de saproprit ListField. Ici, par exemple, on verrales champ NumLivre et NomLivre. (Sparer les champ par un ";").

    Il faut maintenant indiquer quel champ sera transmis suite la slection parl'utilisateur d'un lment dans la liste droulante :

    Indiquez la table et le champ de cette base qui doivent tre modifis suite au choix dans cetteliste droulante.

    Exactement de la mme faon que pour le DBCombobox, indiquez quelchamp de quelle Table doit recevoir cette donne.

    .

    Le champ point par DataField doit tre du mme type que le champ pointpar KeyField.

    Lancez le programme, testez.

    Actuellement, la liste droulante apparat ainsi :

    On voit bien, dans la liste, les champs NumLivre et NomLivre.Ce qui s'affiche dans le DBLookUpComboBox est lepremier des champs dcrits par la proprit ListField et donc le champ NumLivre.Il est probable que vous prfreriez voir le nom du livre et non un simple numro.

    La proprit ListFieldIndex permet d'indiquer lequel des champs points parListField doit s'afficher dans cette partie. 0 affichera le premier (iciNumLivre) 1 affichera le 2 (ici NomLivre) etc... Pour continuer l'exemple,entrez 1 dans cette proprit ListFieldIndex.

    Quelle valeur s'affiche dans le DBLookUpCombobox ?

    Ce qui est affich dans est l'lment de la listedroulante qui a une valeur telle que, pour l'enregistrement en cours, son champ

  • Mme DJIDEL support de cours DELPHI

    37

    point par KeyField est gal la valeur du champ point par ListField. En d'autrestermes, si vous vous dplacez dans votre DBGrid, vous ne verrez une valeurs'afficher dans que si le nom du livre contenu dansl'enregistrement en cours du DBGrid existe dans la liste droulante duDBLookUpComboBox.

    Petite exprience : si vous avez suivi le cours depuis le dbut sans rien modifier,vous avez la possibilit de rentrer dans la table "Livres" des noms de livres de 30caractres alors que dans le champ "LivreEmprunte" de la table "Mouvements",vous tes limit 15 caractres. Lancez le programme, et slectionnez dans la listedroulante un nom de livre suprieur 15 caractres. Seulement les 15 premierscaractres du nom sont pris par la table "LivreEmprunte" et donc seulement les 15premiers caractres apparaissent dans le DBGrid. Rsultat, on a pas la mme chanede caractre dans "NomLivre" que dans le champ "LivreEmprunte". On ne verradonc pas de valeur s'afficher dans leDBLookUpComboBox

    Il est vident que pour un cas rel, il aurait fallu que le nombre de caractresautoriss pour LivreEmprunte et NomLivre soit le mme.

    Il aurait mme mieux valu, dans le champ LivreEmprunte, non pas stocker le nomdu livre mais un numrique correspondant au champ NumLivre de la table Livres.On aurait alors mis NumLivre dans la proprit KeyField duDBLookUpComboBox avec toujours LivreEmprunte dans la proprit DataField.

    Trier, filtrer, la liste de choix

    Pour trier la liste de choix, il suffit d'utiliser un index. Crez par exemple un indexsecondaire nomm IndexNomLivre indexant le champ NomLivre (cf leon 6)affectez IndexNomLivre la proprit IndexName de table3. Si vous relancez leprogramme, la liste de choix est trie par ordre alphabtique.

    Pour des filtres / tris plus subtils, vous pouvez utiliser un Query au lieu de la table3.Pour plus d'explications et mieux comprendre les Query : cf Leon 11

    Source du programme

  • Mme DJIDEL support de cours DELPHI

    38

    SQL Structured Query Languagedernire mise jour : lundi 15 octobre 2001

    SQL est un langage d'interrogation de bases de donnes relationnelles telles queOracle, Sybase, Microsoft SQL Server, Access etc...

    Le propos de ce tutorial n'est pas de donner une vue exhaustive de ce langage maisd'indiquer comment utiliser ce langage avec Delphi. Un site de rfrence pour lelangage SQL :http://perso.wanadoo.fr/philippe.notez/sql/sql.htmVous pourrez aussi utiliser le constructeur SQL fournis avec Delphi.

    Souvenez-vous, une architecture d'accs une base de donnes telles qu'on l'a vueprcdemment tait de ce style:

    Table1 est reli la base de donne par l'intermdiaire de sa propritDataBaseName et TableName. Table1 reprsente donc directement une table.

    DataSource1 est reli des donnes par l'intermdiaire de sa proprit DataSet.

    Les composants tels que les DBGrid qui voudront accder aux donnes le feront autravers du DataSource.

    On vient de voir que SQL est un langage d'interrogation des bases de donnes.C'est donc un composant qui se "place" entre la base de donnes et le DataSource.Query1 "reprsente" les donnes au mme titre que Table1 reprsentait desdonnes. DataSource permet de les exploiter; d'y accder.

  • Mme DJIDEL support de cours DELPHI

    39

    En cliquant sur la proprit SQL du Query1, on va pouvoir entrer nos requtes SQLqui permettront de filtrer joindre etc...

    Construction d'un exemple

    Dans cet exemple, on considrera que vous avez dj cr votre base de donnes etque son alias se nomme TEST. La base de donnes utilise est celle de laleon "lier 2 tables"

    Commencez un nouveau projet. Ajoutez-y un DataModule Placez-y un DataSource et un Query (onglet AccsBD)

  • Mme DJIDEL support de cours DELPHI

    40

    Affectez TEST la proprit DataBaseName de Query1 Affectez Query1 la proprit DataSet de DataSource1. D'o le nouveau

    schma

    : Il faut maintenant pouvoir afficher les valeurs que nous renverra la base suite

    une requte SQL.Placez un DBGrid sur la Form1.Dans l'unit1, dclarez l'Unit2 dans le Uses.Affectez DataModule2.DataSource1 sa proprit DataSource.

    Cliquez droite de la proprit SQL de Query1

    Entrez une requte SQL. Par exemple

  • Mme DJIDEL support de cours DELPHI

    41

    qui permettra de slectionner et donc d'afficher via le DBGrid tous leschamps (*) de la table mouvements en filtrant pour ne voir que le client 1002

    Pour voir le rsultat, il suffit de mettre la proprit Active du Query1 True.

    Rsultat :

    Pouvoir modifier les donns d'une table affich par l'intermdiaire d'une reqte SQL

    Si vous testez le programme actuel, vous verrez qu' l'excution, il vous estimpossible de modifier les donnes. Pour pouvoir les modifier, il faut mettre laproprit RequesLive True. Attention, seuls les donnes issu d'une requte SQLsimple pourront tre modifies. En particulier, les requtes faisant appel plusieurstables ne permettront pas la modification des donnes.

    Version Entreprise uniquement :

    Une autre faon de faire pour rentrer les requtes SQL dans la proprit SQLduQuery1 est de se servir du constructeur SQL. Pour cela, cliquez avec le bouton dedroite sur le composant Query1 puis slectionnez Constructeur SQL.

  • Mme DJIDEL support de cours DELPHI

    42

    Les entres ci-dessus vont nous donner la requte suivante :

  • Mme DJIDEL support de cours DELPHI

    43

    Modification de la requte SQL l'excution.Requtes paramtres SQL.dernire mise jour : samedi 15 dcembre 2001Retour au sommaire

    Reprenons l'exemple du chapitre portant sur le SQL.

    Nous avions donner l'exemple de requte :

    SELECT client FROM mouvements WHERE livreemprunte="Delphi2"Cette requte est fixe en dur dans le programme. Il serait souhaitable de pouvoirpermettre par exemple l'utilisateur de rentrer le nom du livre recherch dans unEdit.

    Solution pour adapter la requte SQL une entre utilisateur sans utiliser les requtes SQLparamtres.

    Une des solutions, est de lire par exemple un Edit puis de fabriquer une nouvellerequte SQL par un simple traitement de chane de caractre du type :

    DataModule2.Query1.SQL.Add( 'SELECT * FROM mouvements');DataModule2.Query1.SQL.Add ('WHERE Upper(LivreEmprunte) LIKE

    "'+UpperCase(Edit1.Text) +'%"');

    Cette requte affichera les enregistrements de la table mouvements dont le contenude Edit1.Text mis en majuscule sera gal au dbut du champ LivreEmprunte mis enmajuscule. Concrtement, si Edit1.Text vaut "delphi", la dernire ligne de larequte SQL contenu dans Query1.SQL vaudra :

    WHERE Upper(LivreEmprunte) LIKE "delphi%");

    Par consquent, les livres Delphi 1, Delphi2 etc seront affichs.

    Pour tester cet exemple, partez de l'exemple que vous avez construit au chapitreportant sur le SQL. Ajoutez un bouton sur la fiche puis implmentez sonvnement OnClick comme suit :

    procedure TForm1.Button1Click(Sender: TObject);begin

    DataModule2.Query1.Active:=False;DataModule2.Query1.SQL.Clear;DataModule2.Query1.SQL.Add( 'SELECT * FROM mouvements');

  • Mme DJIDEL support de cours DELPHI

    44

    DataModule2.Query1.SQL.Add ('WHERE upper(LivreEmprunte) LIKE"'+UpperCase(Edit1.Text) +'%"');

    DataModule2.Query1.Active:=True;end;

    Utilisation des requtes paramtres.

    Nous allons rentrer, dans la proprit SQL de notre Query, une requte contenantun paramtre. Il suffira de modifier le contenu de ce paramtre pour avoir unerequte adapte l'entr d'une valeur dans un Edit.

    La premire chose faire est de rajouter un paramtre dans la liste des paramtresde notre Query. Ce paramtre pourra alors tre utilis dans une requte SQL.

    Dans la DataModule, cliquez sur le Query puis, cliquez droit sur Params puissur Ajouter un lment.

    Dans l'inspecteur d'objet, Affectez ParamNomLivre sa proprit Name Mettez la proprit DataType FtString.

    Dans la proprit SQL du Query, entrez :SELECT *FROM mouvementsWHERE Upper(LivreEmprunte) LIKE :ParamNomLivre

  • Mme DJIDEL support de cours DELPHI

    45

    Notez les points (:) devant ParamLivre. En SQL, cela indique que ce qui suit est unparamtre. SQL remplacera, avant d'effectuer la requte, :ParamNomLivre par lecontenu de ce paramtre.

    Notre programme n'aura plus qu' s'occuper de changer la valeur du paramtreParamLivre (atteignable par Quey1.Param[0] ) pour faire varier la requte SQL.

    Pour cela, ajoutez un bouton sur form1 et implmentez sa mthode OnClickcomme suit :

    procedure TForm1.Button2Click(Sender: TObject);begin

    DataModule2.Query1.Active:=False;DataModule2.Query1.Params[0].AsString :=UpperCase(Edit1.Text)+'%';DataModule2.Query1.Active:=True;

    end;

    Lancez le programme entre une valeur dans l'Edit, testez...

    Sources du programme

  • Mme DJIDEL support de cours DELPHI

    46

    Utilisation du composant TDataBase

    Retour au sommaire

    Jusqu' prsent, nous utilisions une architecture simplifie dans laquelle lescomposants Table pointaient directement sur des tables de la base de donnes parl'intermdiaire de ses proprits DataBaseName et TableName.

    Pour plusieurs raisons, il peut tre judicieux faire pointer les composants TTablenom pas directement vers 'une base mais par l'intermdiaire d'un composantTDataBase.

    Par exemple, lorsque notre base comporte un grand nombre de table il sera plusfacile de changer d'Alias dans cette nouvelle architecture (une seule proprit d'unseul composant modifier)

    En fait, TDatabase permet, dans une application de base de donnes, de contrlerprcisment la connexion avec une base de donnes base sur le BDE.

    Utilisez un objet TDatabase quand une application de base de donnes base sur leBDE ncessite l'une des options suivantes sur la connexion avec une base dedonnes :

    Connexion persistante avec la base de donnes. Accs personnalis un serveur de bases de donnes. Contrle des transactions. Alias BDE spcifique l'application

    Il n'y a pas vraiment d'inconvnient l'utilisation de cette architecture. Elle al'avantage de faciliter certaines volution de votre programme.

  • Mme DJIDEL support de cours DELPHI

    47

    A noter que pour du SQL, le sghma suivant est tout fait valable :

    Utilisation :

    Placez les 3 composants suivants sur votre form ou votre DataModule:

    Proprits de DataBase1 :

    Donnez un "nom de base de donnes" en modifiant la proprit DataBaseName ducomposant DataBase1. Ce nom ne correspond pas un alias existant. Ce peut trece que vous voulez, n'importe quelle chane de caractre. Par exemple "toto" ou"BaseTest". Choisissons pour l'exemple BaseTEST

    Indiquez DataBase1 la base de donnes qu'il devra utiliser.

    Proprits de Table1

    Pour le composant Table1, d'habitude, on entrait directement l'alias de la base danssa proprit DataBaseName. Cette fois ci, nous allons rentrer le "nom de base dedonnes" que l'on avait informe pour la proprit DataBaseName du DataBase1(ici, "BaseTest").Cliquez droite de la proprit DataBaseName du Table1. Vous verrez qu'il vouspropose de BaseTest.C'est ainsi que vous crez la jonction entre le Table1 et le DataBase1.

  • Mme DJIDEL support de cours DELPHI

    48

    Il faut, comme d'habitude, lui indiquer la table de cette base que l'on va vouloirexploiter. Modifier la proprit TableName comme suit :

    Proprits de DataSource1

    Pas de nouveaut, choisir Table1pour sa proprit DataSet.

    Test

    Placez par exemple un DBGrid et connectez le DataSource1 en choisissantDataSource1 dans la proprit DataSource du composant DBGrid1.

    Mettez True la proprit Active de Table1 et vous verrez le contenu de votre tabledans DBGrid1.

    Exemple : Suppression de la demande de mot de passe

    On a vu que le composant TDataBase reprsente la base de donnes. On peut doncpar l'intermdiaire de ses proprits modifier certains comportements. Par exemple,si on utilise une base Access, on peut faire en sorte qu'il ne nous demande plus lemot de passe s'il n'y en a pas besoin.

    Pour cela, il suffit de mettre la proprit LoginPrompt False.

  • Mme DJIDEL support de cours DELPHI

    49

    Utilisation d'une base ACCESS l'aide deODBC + BDE.dernire mise jour : mardi 16 avril 2002Retour au sommaire

    Une des solutions pour utiliser une base Access est de passer par le BDE et ODBC.

    Dclaration de la base de donne dans l'ODBC :

    Allez dans le panneau de configuration de Windows (Dmarrer, Paramtre,Panneau de configuration).

    Cliquez sur Choisissez l'onglet System DSN

    Cliquez sur Add, Slectionnez "Microsoft Access Driver (*.mdb)".

  • Mme DJIDEL support de cours DELPHI

    50

    Cliquez sur Terminer. Entrez un nom dans "Data Source Name" (ici TestOdbcBdeAccess) Entrez une description (ici Test) Cliquez sur Select pour choisir votre fichier base de donne (ici test.mdb) et

    enfin cliquez sur OK

    A partir de cet instant, on en est rammen au cas normal d'utilisation du BDE. Eneffet, allez dans l'administrateur BDE (Panneau de configuration/ administrateurBDE). TestOdbcBdeAccess y est bien prsent.

  • Mme DJIDEL support de cours DELPHI

    51

  • Mme DJIDEL support de cours DELPHI

    52

    Utilisation d'une base ACCESS l'aided'ADO.Dernire mise jour : mardi 16 avril 2002Retour au sommaire

    Une des solutions pour utiliser une base Access est de passer par ADO.

    Connexion de la base :

    Placez un composant ADOConnection (Onglet ADO) sur la Form. Cliquez sur la proprit ConnectionString

    Cliquez sur Construire... Choisissez dans l'onglet fournisseur "Microsoft Jet 4.0 OLEDB

    Provider" puis cliquez sur suivant.

    Slectionnez votre base de donnes Access.

  • Mme DJIDEL support de cours DELPHI

    53

    Cliquez sur "tester la connexion" Si vous n'avez pas de mot de passe votre base, placez la proprit

    LoginPrompt de votre ADOConnection False. Cela vitera qu'il ne vouspose la question du mot de passe.

    Validez pour sortir. Vrifiez que la proprit connected de l'ADOConnection est True.

    Placez un composant ADOTable Slectionnez ADOConnection1 pour sa proprit Connection. ADOTable1

    est alors reli notre base par l'intermdiaire de ADOConnection1. Slectionnez le nom de votre table dans sa proprit TableName. Rendez-le actif via sa proprit Active.

    Enfin, placez un DataSource reli notre ADOTable via sa propritDataSet

    Test de la connection

    Placez un DBGrid Reliez le la source de donne grce sa proprit

    DataSource Vous devez voir apparatre le contenu de votre Table. Si ce n'est pas le cas,

    vrifiez la proprit connected de l'ADOConnection et la proprit Active del'ADOTable.

  • Mme DJIDEL support de cours DELPHI

    54

    Utilisation des composants DbExpress pourlire une base MySQL (D6 et plus).Retour au sommaire

    Introduction :

    Bon, j'ai pas mal galr pour russir faire quelque chose qui donne satisfaction.Les composants DBExpress sont relativement nouveaux pour moi. L'aide n'est pastrs explicite et je n'ai rien trouv de satisfaisant sur le net. Bref, pas mal dettonnements. Il faut donc considrer ce tutorial comme tant en BtaTest. Je suispreneur de toutes les observations. Je m'interroge en particulier sur 2 trucs (voir enfin de cette page).

    Depuis la version 6 (pro et +), Borland a introduit des composants DbExpress. Cescomposants permettent entre autres d'attaquer des bases MySQL.

    Le site http://phidels.com tant entirement bas sur du PHP + MySQL, j'ai voulutester la chose.

    Pr-requis :

    Avoir une version de Delphi qui possde les composants DbExpress (D6 proet +)

    Avoir MySQL install sur votre poste. Personnellement, je l'avais install viale "pack" EasyPHP (gratuit) sur http://www.easyphp.org/ Pour tlchargeruniquement MySQL : http://www.mysql.com/

    Avoir cr une base de donnes qui vous servira de support l'exemplesuivant.Personnellement, pour ce genre de manip, j'utilise phpMyAdmin livr avecEasyPHP.

    Lecture d'une base MySQL existante :Connexion la base :

    Comme d'habitude, on va construire un exemple.

  • Mme DJIDEL support de cours DELPHI

    55

    Ouvrez Delphi, commencez un nouveau projet. Allez, on va prendre de bonnes habitudes, on va ouvrir un DataModule.

    (Fichier, Nouveau, Module de donnes). Sur ce Module de donnes, placez un composant

    SQLConnection.Dans la "vue arborescente des objets", on voit notre SQLConnection maisavec un point d'interrogation devant. Normal, il n'est pour l'instant connect

    aucune base. Vrifiez que votre votre serveur MySQL est lanc.

    Double cliquez sur votre SQLConnection

    Cliquez sur pour crer une nouvelle connexion Donnez MYSQL comme nom de pilote. Choisissez un nom pour votre

    connexion (ici : testmysql) Dans le champ Database, placez le nom de votre base de donne (ici

    MaBaseMySQL). Il faut se rappeler que le nom d'une base de donnes enMySQL est en ralit le nom du dossier dans lequel sont placs ses fichiers.

    Dans le champ HostName, entrez le nom rseau de l'ordi qui contient labase. Si c'est l'ordi sur lequel tourne le programme, vous pouvez mettrelocalhost comme nom.

    Effacez la valeur qui se trouve dans le champ LocaleCode. ( noter qu'unlecteur m'a fait la remarque suivante : Sans mettre un nom de user, la manipplante, alors qu'en mettant simplement le user root, la connexion sefait. Chez moi, pas besoin...

  • Mme DJIDEL support de cours DELPHI

    56

    Cliquez sur afin de tester la connexion. Vous devez obtenir

    :

    A noter que le point d'interrogation a disparu et queDelphi a rempli pour vous, entre autres, les champs ConnectionName,DriverName... de votre SQLConnection.

    Si vous n'en avez pas besoin et si vous ne souhaitez pas voir s'afficher laboite de dialogue demandant l'utilisateur et le mot de passe, mettrez Falsesa proprit LoginPrompt.

    Connection d'un ensemble de donnes (DataSet) l'aide d'un SQLClientDataSet

    Placez un SQLClientDataSet sur le DataModule

    Indiquez-lui, via sa proprit DBConnection, qu'il doit utiliser votreSQLConnection pour se connecter labase .

    Placez un SELECT dans la proprit CommandText du SQLClientDataSet.Par exemple : SELECT * FROM unetableo unetable est une table de votre base.

  • Mme DJIDEL support de cours DELPHI

    57

    Accder aux donnes.

    L, on en est un stade dj vu dans les autres tutoriaux BDD : Placez un DataSource sur notre dataModule et le connecter notre

    SQLClientDataSet via sa propritDataSet.

    Actuellement, le diagramme de nos connexions correspond ceci

    :

    Sur votre fiche (Form1) placez un DBGrid et un DBNavigator. Dans le uses de la form1, ajoutez le nom de l'unit corespondant votre

    DataModule2 (Unit2 si vous n'avez rien renomm) Dans la proprit DataSource du DBNavigator, slectionez votre

    DataSource. Dans la proprit DataSource du DBGrid, slectionez votre DataSource.

    Testez.

    Vrifiez que la proprit Connected de votre SQLConnection est True. Placez laproprit Active de votre SQLDataSet True. Vous devez voir vos DBEdit seremplir.

    i vous avez un message d'erreur du style ,vrifiez la clef LocaleCode en double cliquant sur le SQLConnection (l'effacer).Vrifiez galement la valeur de LocaleCode dans la proprit Params duSQLConnection (l'effacer).

  • Mme DJIDEL support de cours DELPHI

    58

    Pour tre plus propre, et prendre de bonnes habitudes, remettez Connecteddu SQLConnection False. Cela fait galement passer la proprit Active duSQLDataSet False.

    Dans l'vnement OnShow de la fiche Form1, placez le code suivant :

    procedure TForm1.FormShow(Sender: TObject);begin

    DataModule2.SQLConnection1.Connected:=True;DataModule2.SQLClientDataSet1.Active:=True;

    end;

    Rendre les donnes modifiables.

    Actuellement, si vous modifiez une donne dans votre DBGrid, vous aurez beaucliquer sur le V (validation) du DBNavigate, lorsque vous fermez le programme etque vous l'ouvrez de nouveau, vous voyez que vos modifications n'ont pas tcrites dans la base.

    Ajoutez un bouton sur votre fiche. Implmentez son vnement OnClick commesuit :

    procedure TForm1.Button1Click(Sender: TObject);var MaxErrors:integer;begin

    MaxErrors:=1;{extrait de l'aide : MaxErrors indique le nombre maximum d'erreurs

    tolrespar le fournisseur avant d'interrompre l'opration d'actualisation.Initialisez MaxErrors 1 pour indiquer qu'il n'y a pas de limiteau nombre d'erreurs.}{Pour MySQL, ce que l'on m'a dit, MySQL ne tolre qu'une seule

    erreur.}DataModule2.SQLClientDataSet1.ApplyUpdates(MaxErrors);

    end;

    En cliquant sur le bouton, les lments modifis iront vers la base de donnes.

    Nota :

    Dans cette configuration, si vous voulez ajouter un DBEdit ou autres DBMemo survotre fiche, pour le connecter, il faudra, comme pour le DBGrid, slectionner ledatasource pour sa proprit DataSource. Il faudra aussi slectionner le champ quevous voulez voir, et ce via sa proprit DataField.Attention, vous ne pourez voir les champs slectionnables dans la liste de choix etdonc vous ne pourrez slectionner ce champ que si le SQLConnection1.connected

  • Mme DJIDEL support de cours DELPHI

    59

    est true et le SQLClientDataSet1.Active est true (les modifier dans l'inspecteurd'objet. Une fois la manip faite, les remettre False.)Questions a qui a une rponse... :

    Je l'ai dit au dpart, il faut donc considrer ce tutorial comme tant en BtaTest. Jesuis preneur de toutes les observations. Je m'interroge en particulier sur 2 trucs :

    Pourquoi, dans le DBNavigator, lorsque l'on clique sur , on a un messaged'erreur :

    A quoi sert exactement la clef LocalCode ?

  • Mme DJIDEL support de cours DELPHI

    60

    Utilisation de QuickReport pour faire desimpressions d'lments d'une base dedonnes.Retour au sommaire

    Introduction :

    QuickReport est un ensemble de composants dits parqusoft http://www.qusoft.com/ qui permettent d'imprimer des tats issus de vosbases de donnes. QuickReport est fourni avec les Delphi pro et +

    Un premier programme

    La page de base. Placer un logo et un titre:

    Commencez un nouveau projet, Placez un composant QuickReport, Dveloppez sa proprit Bands. Placez HasTitle True.

    Une bande apparat en haut de la page du composant QuickReport

    Le contenu de cette bande apparatra sur la premirepage de notre rapport.

    Placez un TQRLabel dans cette bande. Mettez par exemple 'Titre du rapport'dans sa proprit Caption. Ajustez comme vous le dsirez sa proprit Color,Font etc...

  • Mme DJIDEL support de cours DELPHI

    61

    Cliquez avec le bouton droit de la souris sur le QuickRep. Cliquez surPrvisualiser.

    Pour amliorer votre Premire page, vous pouvez ajouter une image(typiquement le logo de votre compagnie). Placez un TQRimage dans labande. Ajustez sa taille. Choisissez votre image via la proprit Picture etenfin, placez si besoin sa proprit Stretch true.

    Afficher les donnes de la base de donnes.

    Nous allons ajouter une bande qui affichera ces donnes. Pour cela,dveloppez la proprit Bands du QuickRep1 et placez la proprit

    HasDetail True. Il va falloir indiquer cette Bande ce que l'on veut voir y apparatre. Plus

    particulirement, les donnes de quelle Table de quelle Base de Donnes.Pour l'exemple, nous allons utiliser la base de donnes dmo de Delphi.

    Placez un composant TTable sur la Form1. Choisissez l'alias DBDemospour sa proprit DataBaseName et customer.dbpour sa proprit TableName. .

    Placez un QRDBText dans la bande Dtail.

    .

    Il faut maintenant indiquer que le contenu du QRDBText sera unenregistrement contenu dans la table. Slectionnez Table1 pour la propritDataSet du QRDBText et Company pour sa proprit SataField.

  • Mme DJIDEL support de cours DELPHI

    62

    Faites un clic droit sur le TQuickReport. Slectionnez 'Prview'. Vous

    obtenez On a bien notre image et notretitre en haut. La bande dtail apparait avec le premier enregistrement denotre table et pour le champ slectionn (company). La bande se rpteautant de fois que l'on a d'enregistrement. Dans la prvisualisation, vouspouvez aller voir toutes le pages.

    Entranez-vous formater un peu tout a : On peut jouer sur les couleurs, lespolices, rajouter du texte....

    Lancer la prvisualisation et l'impression l'excution

    Ajoutons deux boutons : Un pour la prvisualisation et un autre pourl'impression directe.

    Implmentons leurs vnemenyts OnClick ainsi :

    procedure TForm1.Button2Click(Sender: TObject);begin

    QuickRep1.Preview;end;

    procedure TForm1.Button1Click(Sender: TObject);begin

    QuickRep1.Print;end;

    Testez, a marche...

    Aller plus loin avec QuickReport

    Double cliquez sur le notre QuickRep1. Vous obtenez la fentre "Paramtresde l'tat"

  • Mme DJIDEL support de cours DELPHI

    63

    Mettez 2 "nombre de colonnes". Cliquez sur Appliquer puis surPrvisualiser. Vous verrez que vos rsultats apparaissent maintenant sur 2colonnes.

    Cochez Bas de page et En-tte de page. Cliquez sur OK. vous verrez queDelphi vous a ajout 2 bandes. Placez un QRLabel sur chacune de cesbandes. Donnez une valeur distincte dans leur caption respectif, par exemple"Bas de page" et "Entete de page". Lancez une prvisualisation. Vousconstatez que vos pages ont maintenant une entte et un pied de page. Anoter que les deux bandes auraient pu tre ajoutes en placant deux QRBandsur le TQuickRep et en donnant respectivement leur proprit BandTypeles valeurs rbPageHeader et rbPageFooter.

    Toujours dans la fentre Paramtres de l'tat, cochez En-tte de colonne etrcapitulatif. Dans chacune des 2 bandes qui viennent d'tre cres, placezun QRLabel de faon pouvoir voir, l'aide d'une previsualisation ce queQuickReport en fait. Vous constaterez que l'entte de colonne, comme sonnom l'indique est plac en haut de chaque colonne de chaque page. Lercapitulatif est plac la fin du document.

    Charger le source de l'exemple

  • Mme DJIDEL support de cours DELPHI

    64

    Utilisation d'Excel comme base de donnes.Retour au sommaire

    Introduction :

    Microsoft nous met disposition un Driver ODBC pour Excel. Ne rvons pas, celane va pas remplacer SQL Serveur ou autre. Par contre, cela peut tre trs pratiquepour rcuprer des donnes d'une feuille Excel vers une autre base de donnes.

    Constitution de notre base :

    Ouvrez une nouvelle feuille Excel et entrez les libells suivants :

    Ces libells correspondent des ttes de colonne. Ce sont les nom des champs denotre table. Les lignes sous cette ligne seront nos enregistrements.

    Remplissez la colonne indice (par exemple 1 sur la ligne 1 2 sur la ligne 2etc..). L'important est de ne pas avoir deux lignes identiques.

    Donnez un nom la zone constitue de cette ligne et des lignes en dessousqui reprsenteront nos enregistrements :Insertion / Nom / Dfinir

    Donnez un nom notre table : ici, TableAnnuaire.

  • Mme DJIDEL support de cours DELPHI

    65

    Sauvez votre Feuille Excel par exemple sous baseexcel.xls.

    Dans Dmarrer / Panneau de configuration, cliquez sur Dans l'onglet "source de donnes utilisateur", cliquez sur "ajouter" et

    slectionnez le driver Microsoft Excel Driver:

    Cliquez sur "Terminer" Remplissez les Edit comme suit :

  • Mme DJIDEL support de cours DELPHI

    66

    Cliquez sur Options et dcochez lecture seule Cliquez sur slectionnez un classeur et indiquez le chemin et le nom de votre

    fichier excel. Cliquez sur OK.

    Accs notre base par Delphi :

    Pour viter des messages d'erreur, laissez l'Excel ouvert avant de charger etde lancer l'exemple.

    On est maintenant ramen au cas classique d'accs une Base de donnespar Delphi. Si vous le souhaitez, vous pouvez tlcharger le source del'exemple