MIAGE 2ème année Delphi et Kylix D. Mailliet 91 Table1.delete; // si moins de 3
MIAGE 2ème année Delphi et Kylix D. Mailliet 91 Table1.delete; // si moins de 3--> sur le dernier Table1.Active := False; // erreur si aucun readln; end. H. Base de données texte Une base de données texte est un répertoire Un fichier de description dans ce répertoire schema.ini Autant de fichiers textes que de tables Il est possible de changer type de base à tout moment sans recompiler les programmes précédents ! Il suffit de changer l’association nom physique en gardant le même nom logique C Ch ha an ng ge em me en nt t d de e t ty yp pe e d de e b ba as se e Avec une BD texte, on ne peut pas définir d’indexes I. Base de données et SQL : 1. insertion program query_ins; {$APPTYPE CONSOLE} uses sysutils, dbtables, db, Forms; var requete:tquery; begin requete:=tquery.create(application); requete .Active := false; requete .DatabaseName := 'ess_bd'; requete.Close; requete.SQL.Clear; requete.SQL.Add('insert into matable (numero,nom,prenom) values (10,''tata'',''titi'')'); requete.execSQL; end. 2. suppression program query_supr; {$APPTYPE CONSOLE} uses sysutils, dbtables, db, Forms; var requete:tquery; begin requete:=tquery.create(application); requete .Active := false; requete .DatabaseName := 'ess_bd'; requete.Close; requete.SQL.Clear; requete.SQL.Add('delete from matable where nom=''tata'''); requete.execSQL; end. Utilisation de l’unité Forms nécessaire à l’initialisation de l’application en vue de l’initialisation des objets OLE Nom d’un répertoire vide créé précedemment MIAGE 2ème année Delphi et Kilix D. Mailliet 92 Les 5 lignes ci-contre sont les valeurs des propriétés des différents objets. Il est donc possible de n’écrire aucune ligne de code et de se passer de l’événement et de la méthode associée à FormActivate 3. exploration program query_lire; {$APPTYPE CONSOLE} uses sysutils, dbtables, db, Forms; var requete:tquery; i:byte; begin requete:=tquery.create(application); requete.Active := false; requete.DatabaseName := 'ess_bd'; requete.Close; requete.SQL.Clear; requete.SQL.Add('select * from matable '); requete.open; for i:=0 to requete.Fieldcount-1 do write(requete.Fields[i].FieldName:10, ' '); writeln; while not requete.eof do begin for i:=0 to requete.Fieldcount-1 do write(requete.Fields[i].value:10, ' '); writeln; requete.Next; end{while}; readln; end. J. Utilisation classique des TABLEs Placer sur une « form » : TdataSource, Ttable, TDBGrid : type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBGrid1: TDBGrid; procedure FormActivate(Sender: TObject); … procedure TForm1.FormActivate(Sender: TObject); Begin DBGrid1.DataSource := DataSource1; DataSource1.DataSet := Table1; Table1.databaseName := 'ess_bd'; Table1.TableName := 'matable'; // Query1 Table1.Active := true; // ou encore :Table1.open; end; Composants BD 1. Fiche type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBText1: TDBText; Type TForm1 = class(TForm) DataSource1: TDataSource; Table1: TTable; DBGrid1: TDBGrid; MIAGE 2ème année Delphi et Kylix D. Mailliet 93 DBEdit1: TDBEdit; DBNavigator1: TDBNavigator; procedure FormActivate (Sender: TObject); end; var Form1: TForm1; Implementation {$R *.DFM} procedure TForm1.FormActivate(Sender: TObject); begin DataSource1.DataSet := Table1; Table1.databaseName := 'ess_bd'; Table1.TableName := 'matable'; DBNavigator1.DataSource := DataSource1; DBText1.DataSource := DataSource1; DBText1.DataField:='numero'; DBEdit1.DataSource := DataSource1; DBEdit1.DataField:='nom'; Table1.Active := true; end; L. Tables Maître/détailSoit une base de données relationnelle créée avec Access (par exemple), les liens ODBC ont étés effectués : M. BD Tables DBGrid1.DataSource := DataSource1; DataSource1.DataSet := Table1; Table1.databaseName := 'bd_rel'; Table1.TableName := 'produits'; DBGrid2.DataSource := DataSource2; DataSource2.DataSet := Table2; Table2.databaseName := 'bd_rel'; Table2.TableName := 'fournisseurs'; // Table1.MasterSource:= DataSource2; // Table1.MasterFields:='Ref_fournisseur' ; Table2.Active := true; Table1.Active := true; Les 7 premières lignes et les 2 dernières permettent de créer 2 tables indépendantes! MasterSource et MesterFilds permettent de lier 2 tables Malheureusement les lignes de codes NE CONVIENNENT PAS Il faut obligatoirement utiliser l’inspecteur d’objet pour remplir toutes les propriétés précédentes. Propriété de table1 MIAGE 2ème année Delphi et Kylix D. Mailliet 94 procedure TForm1.FormActivate(Sender: TObject); begin DBGrid1.DataSource := DataSource1; DataSource1.DataSet := Query1; Query1.databaseName := 'ess_bd'; Query1.SQL.clear; Query1.SQL.add('select nom from matable'); Query1.Active := true; end; La liaison précédente num-fournisseur->ref-fournisseur de table1 donne pour chaque fournisseur la liste des produits Il est possible de définir à la place une liaison ref-fournisseur-> num-fournisseur dans table2 pour obtenir le fournisseur pour chaque produit Bien entendu c’est l’un ou l’autre sous peine de référence circulaire! N. Composant BD 1. QUERY 2. Améliorations de la présentation des colonnes d’une grille (DBGrid) Inspecteur d’objet : propriétés de DB Grid MIAGE 2ème année Delphi et Kylix D. Mailliet 95 TQuickRep TTable TQRLabel TQRDBText Obligatoi- rement dans la Bande détail Pour Répétition des enregistrements TQRBand TQRDBText : propriétés à renseigner DataField : nom du champ dont on veut visualiser les enregistrements DataSet : nom du Ttable Ttable : propriétés à renseigner DatabaseName TableName Les propriétés liant les Ttables et les Tquickrep sont les mêmes que pour les TDbGrid. 3. Les filtres : effet comparable à SQL Inspecteur d’objet : propriétés de Ttable ?Filter peut contenir une chaîne du genre : nom=‘par*’ or num-ref >17 ?Si Filtred = true, le filtre est actif ?foCaseInsensitive = true? majuscules et minuscules indifférentes O. Impressions de rapportsLes propriétés liant les Ttables et les Tquickrep sont les mêmes que pour les TDbGrid. Bien que la propriété Visible n’apparaît pas dans la liste, elle existe. On utilisera les méthodes Preview et Print P. Compléments sur les DBGrid et transtypage en DrawGrid procedure TForm1.Button1Click(Sender: TObject); var i, j: Integer; s: string; begin if DBGrid1.SelectedRows.Count>0 then with DBGrid1.DataSource.DataSet do for i:=0 to DBGrid1.SelectedRows.Count-1 do begin GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i])); for j := 0 to FieldCount-1 do begin if (j>0) then s:=s+', '; s:=s+Fields[j].AsString; end; Listbox1.Items.Add(s); s:= ''; end; end; Il suffit d’ajouter un bouton à l’exemple du paragraphe XVI (Utilisation classique des TABLEs) page 89 MIAGE 2ème année Delphi et Kylix D. Mailliet 96 Et de donner la valeur TRUE à l’ « options » dgMultiSelect du DBGrid qui permet de sélectionner plusieurs lignes (comme son nom l’indique). On remarquera que l’on n’accède pas directement aux cellules de la grille : un DBGrid ne possède pas comme les autres Grid de propriété Row et col ; mais aux éléments sélectionnés par l’intermédiaire de la DataSource. L’utilisateur pouvant changer l’ordre des colonnes, ce ne serait pas une bonne idée d’accéder à une cellule par ses coordonnées . Il est cependant possible d’accéder directement aux cellules en transtypant une DBGrid en DrawGrid Label1.Caption := Format ( 'ligne: %2d; colonne: %2d', [TdrawGrid (DbGrid1).Row, TdrawGrid (DbGrid1).Col]); Label2.Caption :=DbGrid1.Columns.Grid.Fields[TdrawGrid (DbGrid1).col-1].AsString ; Label3.Caption :=DbGrid1.Columns.Grid.Fields[0].AsString ; for i:= 1 to DbGrid1.FieldCount-1 do Label3.Caption :=Label3.Caption+', '+ DbGrid1.Columns.Grid.Fields[i].AsString ; L’exemple précédent indique dans le : ?? Label1 : les numéros de ligne et de colonne de l’élément sélectionné. ?? Label2 : le contenu de la cellule sélectionnée ?? Label3 : le contenu de la ligne sélectionnée Q. Table XML 1. Le programme L’exemple suivant crée une table sous forme de fichier au format XML et en fait la « lecture » : Le programme ci-dessous utilise des éléments visuels ou non créés dynamiquement. Dans une application réelle, on crérait un projet, avec une fiche (Form) sur laquelle on déposerait une TDBGrid, TdataSource, TclientDataSet, TopenDialog, TsaveDialog, TDBNavigator ,Tbutton et Tedit puis on renseignerait les propriétés dans l’inspecteur d’objet tel que c’est fait par lignes de code dans le programme : program TableXML; uses Windows, Messages,SysUtils,Variants,Classes,Graphics,Co ntrols, Forms,Dialogs,DB,DBClient,Grids,DBGrids; CONST nomFic='\ess.xml'; var Form1 :TForm; DBGrid1: TDBGrid; DataSource1: TDataSource; ClientDataSet1: TClientDataSet; rep_de_l_applic:string; procedure creerTable; Begin ClientDataSet1.Active:=False; ClientDataSet1.FieldDefs.Clear; with ClientDataSet1.FieldDefs.AddFieldDef do begin Name:='Champ1'; DataType:=ftString; Size:=20; end; with ClientDataSet1.FieldDefs.AddFieldDef do begin Name:='Champ2'; DataType:=ftInteger; end; ClientDataSet1.CreateDataSet; End; procedure Ajout_enregistrement(ch1:string;ch2:integer); begin ClientDataSet1.Append; ClientDataSet1.FieldValues['champ1'] := ch1; ClientDataSet1.FieldValues['champ2'] := ch2; ClientDataSet1.Post; end; begin // Récupération du répertoire de l'application rep_de_l_applic:=ExtractFileDir(paramstr(0)); // Création d'une table avec 2 enregistrements ClientDataSet1:= TClientDataSet.Create(nil); creerTable; Ajout_enregistrement('abcd',12); Ajout_enregistrement('efg',34); // Destroy n'est pas nécessaire puisqu'on réutilise ClientDataSet1 Clientdataset1.SaveToFile(rep_de_l_applic+no mFic,dfxml); MIAGE 2ème année Delphi et Kylix D. Mailliet 97 ClientDataSet1.Destroy; // Lecture de la table : ces 2 parties (? ?) sont indépendantes Application.Initialize; Application.CreateForm(TForm, Form1); dbgrid1 := TDBGrid.create(Form1); DataSource1:= TDataSource.Create(Form1); ClientDataSet1:= TClientDataSet.Create(Form1); Form1.Left := 0; Form1.Top := 0; Form1.Width := 688; Form1.Height := 453; dbgrid1.parent:=Form1; dbgrid1.Align := alClient; dbgrid1.DataSource := DataSource1; DataSource1.DataSet := ClientDataSet1; ClientDataSet1.Active:=false; ClientDataSet1.FileName:=rep_de_l_applic+no mFic; ClientDataSet1.Active:=true; Application.Run; end. 2. Le résultat Le programme ci-dessus crée une table sous forme de fichier Texte au format XML dont l’ouverture avec Internet Explorer 6 de Microsoft donne : En réalité le fichier texte ne comporte pas de « mise en page », Tout est sur une seule ligne, c’est IE6 qui interprète le fichier sous une forme arborescente que l’on peut développer ou non en cliquant sur les + et - : De plus en intercalant entre la première et la deuxième ligne : <?xml version="1.0" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="ess.xsl"?> <DATAPACKET Version="2.0"> et en ajoutant la feuille de style XSL ess.xsl dans le même répertoire : MIAGE 2ème année Delphi et Kylix D. Mailliet 98 on obtient avec IE5 : Ceci donne un exemple d’ « universalité » du format XML et de l’intérêt de ce type d’application utilisant Clientdataset1.SaveToFile( … ,dfxml); 3. Améliorations : On peut avantageusement remplacer les lignes rep_de_l_applic:=ExtractFileDir(paramstr(0)); Clientdataset1.SaveToFile(rep_de_l_applic+nomFic,dfxml); Et ClientDataSet1.FileName:=rep_de_l_applic+nomFic; MIAGE 2ème année Delphi et Kylix D. Mailliet 99 Par : with TSaveDialog.Create(nil) do begin DefaultExt:='xml'; Filter :='*.xml'; if execute then Clientdataset1.SaveToFile(filename) else Halt; end; Et with TOpenDialog.create(form1) do if execute then ClientDataSet1.FileName:=FileName else Halt; Ce qui permet de choisir le nom de sauvegarde du fichier … 4. Remarques Clientdataset1.SaveToFile possède 2 paramètres : Le premier de type string est le nom complet du fichier Le second est de type TDataPacketFormat, de l’unité DBClient, précise le format du fichier et est défini uploads/Industriel/ cours-delphi.pdf
Documents similaires










-
20
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jul 24, 2022
- Catégorie Industry / Industr...
- Langue French
- Taille du fichier 3.2052MB