Sign in Join
Wiki copytemporary

Lazarus Tdbf Tutorial/fr: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Lazarus Tdbf Tutorial/fr

OldNewLine
1+---
2+[[Portal:Databases|**Portail de la base de données**]]
3+Références: · [[Databases/fr|Information générale]] · [[Database libraries/fr|Bibliothèques]] · [[Database field type/fr|Types de champ]] · [[Data Controls tab/fr|Contrôles]] · [[Lazarus DB Faq/fr|FAQ]] · [[SqlDBHowto/fr|Comment faire en SQL ?]] · [[Working With TSQLQuery/fr|Travailler avec TSQLQuery]] · [[How to write in-memory database applications in Lazarus/FPC/fr|Applications de base de données en mémoire]] · Tutoriels/articles pratiques : · [[Lazarus Database Overview/fr|Vue d'ensemble]] · [[SQLdb Tutorial0/fr|0 - Configuration de la base de données]] · [[SQLdb Tutorial1/fr|1 - Commençons]] · [[SQLdb Tutorial2/fr|2 - Edition]] · [[SQLdb Tutorial3/fr|3 - Requêtes]] · [[SQLdb Tutorial4/fr|4 - Modules de données]] · [[SQLdb Programming Reference/fr|Référence de programmation SQLdb]] · Bases de données · [[Advantage Database Server/fr|Advantage]] \- [[MySQLDatabases/fr|MySQL]] \- [[mssqlconn/fr|MSSQL]] \- [[postgres/fr|Postgres]] \- [[Firebird/fr|Interbase]] \- [[Firebird/fr|Firebird]] \- [[Oracle/fr|Oracle]] \- [[ODBCConn/fr|ODBC]] \- [[TParadox/fr|Paradox]] \- [[SQLite/fr|SQLite]] \- dBASE \- [[MS Access/fr|MS Access]] \- [[Zeos tutorial/fr|Zeos]]
4+
5+
6+# Vue d'ensemble
7+
8+Ce tutoriel a pour but de vous donner les bases du développement d'une application intégrant une base de données en utilisant le composant [TDBF](<https://tdbf.sf.net>) (de Micha Nelissen) sous Lazarus. Vous pourrez y trouver de la documentation complémentaire sur le composant TDBF. Cette page a été créée par [ Tony Maro](</User:Tonymaro> "User:Tonymaro") mais d'autres contributions sont bienvenues !
9+
10+Dans Lazarus, le composant DbfLaz fait usage du code du TDbf de FPC.
11+
12+### Documentation
13+
14+Pour de la documentation complémentaire en PDF, allez sur le site [SourceForge](<https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371>). Il peut être utile de garder ce pdf à côté de ce document pendant la lecture.
15+
16+Ce article Wiki sert comme documentation supplémentaire pour les nouvelles fonctionnalités hors de la documentation d'origine.
17+
18+### Alternatives et problèmes connus
19+
20+Les alternatives d'emploi de bases de données incorporées sont Firebird embedded (avantage : facilement évolutif vers le client/serveur), SQLite (avantage : déploiement simple), ou ZMSQL (utilisant des fichiers CSV ; avantage : n'est requis que du code Pascal).
21+
22+Problèmes connus: Le code de TDBF manque de mainteneur depuis lmongtemps. Actuellement (octobre 2013), à la fois le projet SourceForge en amont (se concentrant sur Delphi) et les développeurs FPC de bases de données envisagent de résoudre de nouveau les bugs TDBF. Les correctifs du tronc FPC demandent à être fusionnés avec la version SourceForge, et inversement.
23+
24+Problème courant : veuillez voir les bugs dans le traqueur de bug, en particulier <http://bugs.freepascal.org/view.php?id=22177>.
25+
26+#### Limitations
27+
28+ * TDBF définit l'encodage de la base de données en fonction de la langue du système d'exploitation (vous pouvez choisir le vôtre en définissant LanguageID ; voyez la documentation). Le déplacement d'une base de données vers un autre ordinateur qui ne prend pas en charge cet encodage peut amener à une base de données en lecteur seule. _Note : Étudier si cela s'applique à Tablelevel 7 (Visual DBase) et 25/30 (Foxpro / Visual Foxpro)_
29+ * Aucun des formats DBF utilisé ne prend en charge l'encodage en Unicode (qu'il s'agisse de UTF-8, UTF-16 ou UTF-32). On peut contourner le problème en utilisant es champs binaires, mais vous perdez la possibilité de trier, etc.
30+ * L'indexation d'un fichier DBase avec [ixCaseInsensitive] ne fonctionne pas actuellement.
31+ * Pas encore de prise en charge de l'intégrité référentielle dans les formats de fichier qui la permettent (DBase VII, Visual FoxPro).
32+ * Pas de prise en charge (maintenant et toujours) pour les fichiers .dbf chiffrés : le mécanisme de chiffrement de DBase IV est de toutes façon plutôt faible. Veuillez utiliser une des méthodes de chiffrement cités au dessous.
33+
34+FPC 2.6.x et antérieur :
35+
36+ * Sur les processeurs ARM, le code TDBF est connu pour ne pas fonctionner du fait de problème d'alignement du bus. Ceci est abordé dans la version de développement/tronc de FPC.
37+ * Le choix de niveau de table FoxPro (25) produira des fichiers qui ne peuvent pas être lus par les pilotes de Visual Foxpro. Cela a été corrigé dans la version de développement/tronc de FPC.
38+
39+### Pas besoin d'installation
40+
41+Le paquet DbfLaz est installé par défaut à la fois dans FPC et Lazarus. Le paquet DBFLaz utilise le TDbf et les unités associées dans la FCL (_Free Component Library_) de Free Pascal. En d'autres mots, aucun besoin d'installer quoique que ce soit si vous disposer d'une assez récente version de Lazarus.
42+
43+### Que contient TDBF ?
44+
45+TDBF permet d'accéder aux tables de dBase et aux bases de données de FoxPro sous Lazarus (entre autres). Il autorise la lecture, l'écriture et la création de table dBase III+, dBase IV, Visual dBase VII et FoxPro. Il n'est pas nécessaire de rajouter de bibliothèques ou de moteurs de base de données additionnels. Posez simplement TDBF sur votre formulaire et vous aurez un accès instantané à un environnement de base de données multi-plateforme. TDBF fonctionne sous Windows et Linux en utilisant Lazarus.
46+
47+### Que faut-il mettre dans votre clause Uses
48+
49+Si vous utilisez le composant visuel DBF dans Lazarus, ce dernier mettra Dbf dans vos clauses Uses. Si vous utilisez FPC (en mode console) seulement, vous pouvez le mettre vous-mêmes. D'autres unités pratiques sont `db` pour le support des DataSet et `Dbf_Common` pour des choses telles que les définitions de type de champ.
50+
51+Ainsi, vous obtiendrez :
52+```
53+uses Dbf, db, Dbf_Common;
54+```
55+
56+# Comment créer une nouvelle table de base de données ?
57+
58+Il y a une application de bureau pour les bases de données pour Lazarus (ouvrez le projet dans votre in répertoire Lazarus tools/LazDataDesktop). Vous pouvez créer un nouveau dictionnaire de données pus créer le code pour définir les fichiers DBF basés sur ce dictionnaire. À partir de maintenant (Juillet 2011), ce processus est encore un peu compliqué (NdT : non vérifié).
59+
60+Une autre option est d'utiliser Calc d'OpenOffice ou de LibreOffice et enregistrer votre classeur comme un fichier .dbf.
61+
62+Vous pouvez aussi (sur Windows - marche avec Wine aussi) essayer cette application : [[1]](<http://www.dirfile.com/cdbf_explorer.htm>).
63+
64+En tout cas, nous allons illustrer la création d'une nouvelle base de données dans le code ci-dessous.
65+
66+### Définir le chemin
67+
68+Une bonne idée est de mettre la/les base(s) de données dans un répertoire. Cela simplifie grandement les sauvegardes. Il y a deux manières de paramétrer le chemin :
69+
70+ * Vous pouvez définir le chemin complet en utilisant la propriété FilePathFull,
71+ * ou vous pouvez définir un chemin relatif au chemin courant de l'application avec FilePath.
72+
73+Par exemple, définir "FilePath" à l'exécution à "data/" utilisera un sous-répertoire juste au-dessous du dossier de exécutable. La définition de la propriété "FilePathFull" à "/var/data/" placera tout à cet emplacement exact, ignorant l'emplacement de l'application. Un exemple :
74+```
75+MyDbf.FilePathFull := '/location/to/my/data'; //Directory where all .dbf files will be stored
76+ MyDbf.TableName := 'customers.dbf'; // note: is the .dbf really required?
77+```
78+
79+### Choisir un niveau de table
80+
81+Par défaut, TDBF créera des tables au format dBase IV. Bien que très compatible, il peut y avoir des spécificités que vous souhaitez utiliser et qui ne sont pas supportés par ce format. Par exemple pour un support de l'incrément automatique des champs, vous devrez employer un format plus récent. Les types de table sont :
82+
83+ * 3 dBase III+
84+ * 4 dBase IV
85+ * 7 Visual dBase VII
86+ * 25 FoxPro
87+
88+**Niveau de table** | **Compatibilité avec le produit de base** | **Prise en charge des champs auto-incrémentés** | **Limite de longueur de champ** | **Remarque**
89+---|---|---|---|---
90+Level 3 | dBase III+ | Non | 10 caractères [[2]](<http://www.clicketyclick.dk/databases/xbase/format/dbf.html#DBF_STRUCT>) | Plutôt obsolète mais c'est un format très simple. Pratique pour les utilisation en-mémoire.
91+Level 4 | dBase IV | Non | 10 caractères [[3]](<http://www.clicketyclick.dk/databases/xbase/format/dbf.html#DBF_STRUCT>) | Etait très populaire. Base pour les fichiers de forme de GIS (.shp)
92+Level 7 | Visual dBase VII | Oui | 32 caractères [[4]](<http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm>) |
93+Level 25 | FoxPro | Oui | 10 caractères [[5]](<http://www.dynamic.com/v7/what-are-limitations-foxpro-full-isam-file>) [[6]](<http://www.foxite.com/archives/foxpro-field-names-0000066805.htm>) | FoxPro ; compatible avec FoxPro pour DOS et Visual FoxPro. Note: l'implémentation dans FPC 2.6.2 produit des fichiers qui ne peuvent pas être lus par les pilotes FoxPro !
94+Level 30 | Visual FoxPro | Oui | Normalement 10 caractères [[7]](<http://www.dynamic.com/v7/what-are-limitations-foxpro-full-isam-file>) [[8]](<http://www.foxite.com/archives/foxpro-field-names-0000066805.htm>) Non pris en charge par FPC :en utilisant un fichier DBC (conteneur de base de données) : 27 caractères | Pas encore dans FPC 2.6.2 ; seulement dans le version de développement en cours
95+
96+Voyez le bug [[9]](<http://bugs.freepascal.org/view.php?id=20134>) pour plus d'information sur les limitations de longueur de champ.
97+
98+Pour choisir un format il suffit simplement d'initialiser la propriété TableLevel de façon approprié :
99+```
100+MyDbf.TableLevel := 7; //Visual dBase 7
101+```
102+
103+### Ajouter des champs
104+
105+La façon de créer des champs pour votre nouvelle table à l'exécution, est très proche de l'ancienne norme de Delphi. Une fois que vous avez défini vos propriétés FilePath, TableLevel, et TableName, utilisez la propriété FieldDefs pour mettre en place votre structure. Par exemple :
106+```
107+MyDbf.FilePathFull := '/location/to/my/data';
108+ MyDbf.TableLevel := 7;
109+ MyDbf.TableName := 'customers.dbf'; // note: is the .dbf really required?
110+ With MyDbf.FieldDefs do
111+ begin
112+ Add('Id', ftAutoInc, 0, True);
113+ Add('Name', ftString, 80, True);
114+ End;
115+```
116+
117+Le type des champs se définie comme suit - ceux en gras sont actuellement pris en charge par le code DBF. Voyez les [[Database field type/fr|types de champ de donnée]] pour une explication sur les types :
118+
119+ * ftUnknown
120+ * **ftString**
121+ * **ftSmallInt**
122+ * **ftInteger**
123+ * **ftWord**
124+ * **ftBoolean**
125+ * **ftFloat**
126+ * **ftCurrency** (Pris en charge seulement avec le niveau de table 25)
127+ * **ftBCD** (Pris en charge seulement avec le niveau de table 25)
128+ * **ftDate**
129+ * ftTime
130+ * **ftDateTime** : Sans doute le type recommandé pour stocker des valeurs ftDate ou ftDateTime. Au moins dans FoxPro, semble stocker les millisecondes aussi.
131+ * **ftBytes** (Pris en charge seulement avec le niveau de table 25)
132+ * ftVarBytes
133+ * **ftAutoInc**(Pris en charge seulement avec les niveaux de table 7 et 25)
134+ * **ftBlob**
135+ * **ftMemo**
136+ * ftGraphic
137+ * ftFmtMemo
138+ * ftParadoxOle
139+ * **ftDBaseOle**
140+ * ftTypedBinary
141+ * ftCursor
142+ * **ftFixedChar**
143+ * **ftWideString**
144+ * **ftLargeInt**
145+ * ftADT
146+ * ftArray
147+ * ftReference
148+ * ftDataSet
149+ * ftOraBlob
150+ * ftOraClob
151+ * ftVariant
152+ * ftInterface
153+ * ftIDispatch
154+ * ftGuid
155+ * ftTimeStamp
156+ * ftFMTBcd
157+
158+### Ajouter des champs en conception
159+
160+Utilisez la propriété `FieldDefs` pour créer des champs en conception - cela remplace l'appel `FieldDefs.Add` du dessus. Il est important de reamarquer que la propriété `StoreDefs` doit être mise à True pour stocker les définitions dans le fichier .lfm et les rendre disponibles quand la table est créée plus tard à l'exécution.
161+
162+### Allez-y, créez-le !
163+
164+Une fois que vous avez défini les champs que vous souhaitez employer dans votre nouvelle table, vous pouvez passer à l'étape suivante et la créer avec :
165+```
166+MyDbf.CreateTable;
167+```
168+
169+# Comment ajouter des index à une table ?
170+
171+Si votre base de données a beaucoup d'enregistrements, il y a de grandes chances que vous souhaitiez définir des index de manière à ce que les recherches soient plus rapides. Pour changer la structure d'index d'une table, il faut un accès exclusif à la table - que nous avons de toute façon au moment de la création.
172+```
173+MyDbf.Exclusive := True;
174+ MyDbf.Open;
175+```
176+
177+Maintenant, il ne reste plus qu'a ajouter l'index.
178+```
179+MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
180+ MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
181+ MyDbf.Close;
182+```
183+
184+# Expressions
185+
186+Les index et les filtres peuvent utiliser des expressions selon la [documentation de TDbf](<http://sourceforge.net/projects/tdbf/files/TDbf%20documentation/TDbf%20documentation%201.1/>).
187+
188+Pour plus de détails sur les filtres, voyez dessous.
189+
190+## Index/filtre sur des chaînes
191+
192+Les chaînes demande à être encadrées/délimitées par des guillemets (") ou des apostrophes (').
193+
194+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Remarque:** Dans les versions de FPC antérieures à la 3.0 : l'utilisation des apostrophes dans votre filtre ne fonctionne pas (voir l'exemple du dessous). Voir la page des nouveautés de FPC 3.0 : [[FPC New Features 3.0|FPC_New_Features_3.0#TDBF.2C_bufdataset_.28and_descendents_such_as_TSQLQuery.29_allow_escaped_delimiters_in_string_expression_filter]].
195+
196+
197+
198+```
199+// We have a field called CUSTOMER
200+ // let's delimit with double quotes
201+ // (of course, double up single ' in string to make FPC happy)
202+ MyDBF.Filter:='CUSTOMER = "Felipe''s Bank" ';
203+ // another tricky one, let's delimit with single quotes. Of course,
204+ // we'll need to double these up for FPC to interpret these correctly
205+ MyDBF.Filter:='CUSTOMER = ''Jim "Mighty" McLanahan'' ';
206+
207+ // If we have both a ' and a " in our string, we're in trouble.
208+ // the example below only works on FPC 2.7.1+
209+ MyDBF.Filter:='CUSTOMER = "Felipe''s ""Mighty"" Bank" ';
210+
211+ MyDBF.Filtered:=true;
212+```
213+
214+## Limite des index à des chaînes de 100 caractères
215+
216+Les expressions d'index qui retourne une chaîne ne doivent pas dépasser une longueur de 100 caractères ; utilisez SUBSTR pour éliminer les caractères en trop, p.ex. :
217+```
218+MyDbf.AddIndex('SOMEFANCYINDEX',
219+ 'DTOS(DATEFIELD)+SUBSTR(LONGFIELD,1,10)+SUBSTR(LONGFIELD2,1,20)', []);
220+```
221+
222+## Index/filtre sur des TDateTimes
223+
224+Pour définir un index sur un champ date/time, utilisez une expression d'index et la fonction DTOS :
225+```
226+MyDbf.AddIndex('PUBLISHDATEIDX', 'DTOS(PUBLISHDATE)', []);
227+```
228+
229+Le filtrage est similaire - remarque : apparemment, vous devez entourer la valeur de chaîne que vous comparez avec des guillemets doubles. Voyez ci-dessous pour des détails sur la fonction DTOS ; de façon basique vous avez besoin de formater la date en YYYYMMDD:
230+```
231+// we have a field named MODIFIED here:
232+ MyDBF.Filter:='DTOS(MODIFIED) > "20051231"';
233+
234+ // if you want to compare datetime, that can be done:
235+ // everything later than 2 January 2006, 4:34PM
236+ MyDBF.Filter:='DTOS(MODIFIED) > "20060102 163400"';
237+
238+ MyDBF.Filtered:=true;
239+```
240+
241+P.ex., si vous voulez filtrer un TDbf sur un champ Date en utilisant une valeur sélectionnée depuis une DBlookupComboBox.
242+```
243+var
244+ mydate: String;
245+ begin
246+ mydate := formatdatetime('yyyymmdd', strtodate(DBLookupComboBox.Text));
247+ Filter := 'DTOS(DATE) = ' + AnsiQuotedSTR(mydate,'"');
248+ end;
249+```
250+
251+## Index/filtre opérateurs/fonctions
252+
253+Les fonctions prises en charge (depuis la documentation mentionnée plus haut) :
254+
255+**Opérateur/fonction** | **Description**
256+---|---
257++ | Concatène deux chaînes, ou ajoute deux nombres
258+* | Multiplie deux nombres
259+/ | Divise deux nombres
260+= | Compare deux chaînes, nombres or booléens pour l'égalité
261+<> | Compare deux chaînes, nombres or booléens pour l'inégalité
262+< | True si le premier argument est inférieur au second argument
263+<= | True si le premier argument est inférieur ou égal au second argument
264+> | True si le premier argument est supérieur au second argument
265+>= | True si le premier argument est supérieur ou égal au second argument
266+NOT | Inverse la valeur de vérité de son argument (à droite)
267+AND | Retourne True si ses deux arguments booléens sont vrais
268+OR | Retourne False si ses deux arguments booléens sont faux (soit aussi retourne True si l'un des deux est vrai)
269+STR(num[,size,precision]) | Convertit un nombre `num` en une chaîne avec en option une taille et une précision `num`: nombre à convertir `size`: le nombre total de caractères en sortie `precision`: le nombre de chiffres après la virgule
270+DTOS(date) | Convertit une date en un chaîne selon le format YYYYMMDD
271+SUBSTR(str,index,count) | Extrait une sous-chaîne depuis une chaîne `str` depuis la position `index` et la longueur `count`
272+UPPER(str) | Retourne l'équivalent en majuscules de la chaîne `str`
273+LOWER(str) | Retourne l'équivalent en minuscules de la chaîne `str`
274+
275+# Et vous obtenez...
276+
277+L'exemple ci-dessous crée une nouvelle table "clients" à partir du code. Ceci est naturellement à faire qu'une seule fois, dans la mesure ou la table est déjà créée, il ne vous reste plus qu'à l'OUVRIR, inutile donc de la recréer. ;-)
278+```
279+{$MODE OBJFPC}
280+ Program DatabaseTest;
281+ { We will require the following units be in the USES clause: }
282+ uses Dbf, db, Dbf_Common;
283+ { The Dbf is put there when you drop the TDbf on a form... }
284+ { but you will need db for the DataSet object and Dbf_Common }
285+ { for things such as the field type definitions }
286+ var
287+ MyDbf: TDbf;
288+ begin
289+ MyDbf := TDbf.Create(nil);
290+ try
291+ { use relative path to "data" directory }
292+ MyDbf.FilePath := 'data/';
293+ { we want to use Visual dBase VII compatible tables }
294+ MyDbf.TableLevel := 7;
295+ MyDbf.Exclusive := True;
296+ MyDbf.TableName := 'customers.dbf';
297+ With MyDbf.FieldDefs do begin
298+ Add('Id', ftAutoInc, 0, True);
299+ Add('Name', ftString, 80, True);
300+ End;
301+ MyDbf.CreateTable;
302+ MyDbf.Open;
303+ MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
304+ { add a secondary index }
305+ MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
306+ MyDbf.Close;
307+ finally
308+ MyDbf.Free;
309+ end;
310+ end;
311+```
312+
313+# Fichiers d'index externes
314+
315+TDBF supporte également le stockage d'index secondaires dans des fichiers séparés. Ceci peut être utile si on s'attend à ce que la base de données soit très grande. Les fichiers d'index secondaires sont créés de manière presque identique aux index normaux, mais ont l'extension '.ndx' :
316+```
317+MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
318+```
319+
320+
321+Chaque fois que TDBF est ouvert, le dossier d'index doit être chargé :
322+```
323+MyDbf.OpenIndexFile('custname.ndx');
324+```
325+
326+
327+Et les index doivent être référencé avec l'extension :
328+```
329+MyDbf.IndexName := 'custname.ndx';
330+```
331+
332+
333+Les fichiers d'index sont compactés séparément :
334+```
335+MyDbf.CompactIndexFile('custname.ndx');
336+```
337+
338+NdT : cette solution multi-fichier a cependant l'inconvénient de demander plus de ressources système (fichiers ouverts).
339+
340+# Comment lier TDBF aux composants ad hoc
341+
342+Les exemples ci-dessus montrent comment créer une nouvelle table de base de données à partir du code. Utiliser cette table est bien plus simple.
343+
344+Les composants ad hoc sous Lazarus (tel que TDbEdit) peuvent être liés à un composant TDataSource en utilisant leurs propriétés "DataSource" et "DataField". Le composant TDataSource gère la communication entre le moteur de base de données et les composants de données ad hoc. Un TDataSource lié au composant TDBF utilise sa propriété "DataSet". La connexion ressemble à ceci :
345+```
346+TDbEdit-------
347+ |
348+ TDbEdit------|-->TDataSource-->TDbf
349+ |
350+ TDbNavigator--
351+```
352+
353+
354+Soyez sûr(e) d'avoir bien défini les propriétés FilePath (ou FilePathFulll), TableLevel, et TableName de votre composant TDBF avant de l'appeler.
355+```
356+TDbf.Active := True;
357+```
358+
359+
360+Il y a beaucoup plus à dire sur la programmation des bases de données sous Lazarus. Vous pouvez vous référer à une ancienne documentation de Delphi concernant les bases de données car les concepts fondamentaux n'ont pas changé depuis des années.
361+
362+# Relations avec la table principale (Master table)
363+
364+La vraie puissance dans la programmation de base de données commence quand vous avez des tables multiples qui se mettent en référence. Bien que TDBF ne supporte pas encore l'intégrité référentielle, il supporte néanmoins un rapport maître/détail entre TDBF.
365+
366+Quand une relation est faite entre deux tables, on obtient :
367+```
368+[customers]
369+ Id <----|
370+ Name |
371+ Phone |
372+ Address |
373+ | The CustID in invoices references a customer primary field
374+ [invoices] |
375+ Id |
376+ Amount |
377+ CustID -----| * This field indexed as "idxcustid"
378+```
379+
380+
381+Lorsque vous voulez montrer toutes les factures pour un client donné, la table de détail (factures) reste automatiquement synchro avec la table principale (clients).
382+
383+Sur les factures le composant de TDBF a placé ce qui suit :
384+```
385+InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
386+ InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf
387+ InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index
388+```
389+
390+## Searching and Displaying a data set by using filters
391+
392+[Simon Batty](</User:Svbfieldview.net> "User:Svbfieldview.net \(page does not exist\)")
393+
394+Dans cet exemple j'ai cherché à lister tous les titres pour un auteur et afficher le résultat dans un TMemo :
395+```
396+Dbf1.FilePathFull := '/home/somelocatio/database_location/'; // path to the database directory
397+ Dbf1.TableName := 'books.dbase'; // database file (including extension)
398+ DbF1.Open;
399+ memo1.Clear; // clear the memo box
400+
401+ Dbf1.FilterOptions := [foCaseInsensitive]; // set FilterOptions before Filter !
402+ Dbf1.Filter := 'AUTHOR=' + QuotedStr('anauthor'); // AUTHOR is the field name containing the authors
403+ // Note that we need to surround the value with double quotes: "James Joyce"
404+
405+ Dbf1.Filtered := true; // This selects the filtered set
406+ Dbf1.First; // moves the the first filtered data
407+ while not dbf1.EOF do // prints the titles that match the author to the memo box
408+ begin
409+ memo1.Append(Dbf1.FieldByName('TITLE').AsString); // TITLE is the field name for titles
410+ dbf1.next; // use .next here NOT .findnext!
411+ end;
412+ Dbf1.Close;
413+```
414+
415+Remarquez que vous pouvez utiliser Ddf1.FindFirst pour obtenir le premier enregistrement dans l'ensemble filtré, puis utiliser Dbf1.Next pour vous déplacer à travers les données. J'ai trouvé que l'utilisation de Dbf1.FindNext fait que le programme se bloque.
416+
417+# Exemple d'application – Navigateur de Base de données
418+
419+J'ai écrit une application simple qui emploiera TDBF pour ouvrir et montrer des tables de base de données en utilisant le composant dbGrid. L'exécutable Linux avec les sources du projet qui devraient se compiler sans problèmes sous Windows est disponible à l'adresse : [tony.maro.net](<http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1>)
420+
421+# Filters
422+
423+Il y a dexu façons d'utiliser les filtres :
424+
425+ * utiliser des filtres d'expression
426+ * écrire un gestionnaire d'événement pour OnFilterRecord ; si vous voulez montrer l'enregistrement, mettez Accept à True.true.
427+
428+Dans les deux cas, mettez la propriété Filter à True pour activer le filtrage.
429+
430+Exemple : Imaginez que vous avez une base de données qui identifie les produits par un code, par exemple, B019, et que vous ayez besoin de filtrer uniquement les produits qui ont ce code et qu'un état est généré par LazReport.
431+
432+Supposons que votre objet DBF est appelé TDBF1 et le champ avec les codes produit est appelé "product_no".
433+
434+## Expression de filtres
435+
436+Implémentez le filtrage en utilisant une expression de filtrage comme ceci :
437+```
438+TDBF1.Filter := 'product_code = "B019"'; //string type field; string constants should be quoted by ' or "
439+ TDBF1.Filtered := true;
440+```
441+
442+
443+
444+```
445+TDBF1.Filter := 'product_code = "B*"'; //partial match filter; filters all products which code begins with B
446+ TDBF1.Filtered := true;
447+```
448+
449+Filtrer sur des champs multiples :
450+```
451+// Needs to be tested. If it works, please remove this line.
452+ MyDBF.Filter:='LASTNAME;FIRSTNAME';
453+```
454+
455+Adapté depuis : post de forum [[10]](<http://forum.lazarus.freepascal.org/index.php/topic,23090.msg137401.html#msg137401>)
456+
457+Voici un exemple de l'utilisation d'une valeur de DBLookupCombobox dans un instruction de filtre (où NAME est le champ du DBF) :
458+```
459+Filter := 'NAME=' + QuotedStr(DBLookupcomboBox1.Text);
460+```
461+
462+Voici deux exemples d'utilisation des deux ComboBox dans une instruction de filtre composé (i.e. deux champs) (où NAME et TYPE sont des noms de champ d'un DBF) :
463+
464+Dans cet exemple, vous allez combiner ("and") les deux valeurs.
465+```
466+// unfortunately, this will fail whenever the user types a ' in TypeComboBox.Text...
467+ Filter := 'NAME=' + QuotedStr(DBLookupcomboBox1.Text) + ' and TYPE=' + QuotedStr(TypeComboBox.Text);
468+ Filter := Format('NAME="%s" and TYPE="%s"',[DBLookupcomboBox1.Text, TypeComboBox.Text]);
469+```
470+
471+Un exemple d'utilisation d'un ComboBox qui fournit le nom de champ pour le filtre et qui le compare à la valeur dans le ComboBox de recherche (_lookup_) :
472+```
473+Filter := FieldComboBox.Text + '=' + QuotedSTR(DBLookupcomboBox1.Text);
474+```
475+
476+Dans cet exemple, le FieldCombobox est alimenté par code avec les noms des champs depuis le DBF :
477+```
478+// fill the combobox with Field Names
479+ for i:=0 to Dbf.FieldCount-1 do
480+ FieldComboBox.Items.Add(Dbf.Fields[i].FieldName);
481+```
482+
483+Veuillez voir la section #Expressions plus bas pour la liste des expressions prises en charge ainsi que d'autres exemples.
484+
485+## Evénement OnFilterRecords
486+
487+Pour utiliser cette méthode, vous avez besoin d'écrire une fonction.
488+
489+Dans votre code principal, écrivez quelque chose comme ceci :
490+```
491+OnFilterRecord := @TestOnFilterProc; //instruct tdbf to lead all records past your OnFilterProductCode procedure
492+ Filtered := True; //actually enable filtering
493+```
494+
495+Puis écrivez votre gestionnaire d'événement :
496+```
497+procedure TTestCursorDBBasics.TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
498+ begin
499+ // Filter out everything except product_no=B019
500+ Accept := Copy (Trim (Dataset.FieldByName ('product_no'). AsString),1,4) = 'B019';
501+ end;
502+```
503+
504+Tous les enregistrements qui donnent une valeur False à Accept ne seront pas affichés dans l'état car filtrés.
505+
506+### Filtre sur les valeurs nulles
507+
508+(NdT : la notion de valeurs nulles est en soi sujet à discussion, cela correspond plutôt à un état de la données, en dehors de ces valeurs). Vous pouvez utiliser cette méthode pour ne montrer que les valeurs vides (nulles), quelque chose que vous ne pouvez pas faire avec la propriété `Filter`.
509+
510+Un exemple - supposant que vous avez un champ appelé orderdate :
511+```
512+procedure TTestCursorDBBasics.TestOnFilterProc(DataSet: TDataSet; var Accept: Boolean);
513+ begin
514+ // Show only empty order dates
515+ Accept := Dataset.FieldByName('orderdate').IsNull;
516+ end;
517+```
518+
519+Plus généralement, l'emploi des filtres par l'événement OnFilterRecord permet la mise en œuvre de filtre plus élaborés que la propriété Filter ne le permet.
520+
521+# Compacter et reconstruire des tables
522+
523+Quand un enregistrement est supprimé, il n'est pas vraiment enlevé de la table physique. Périodiquement vous devez "compacter" une table pour récupérer cet espace perdu. Ceci doit être fait en mode exclusif.
524+```
525+MyDbf.Exclusive := True;
526+ MyDbf.Open;
527+ MyDbf.PackTable;
528+ // let's also rebuild all the indexes
529+ MyDbf.RegenerateIndexes;
530+ MyDbf.Close;
531+ MyDbf.Exclusive := False;
532+```
533+
534+# Chiffrement
535+
536+Apparemment au moins DBase IV et 5 prennent en charge une sorte de chiffrement (il y a un drapeau de chiffrement dans la structure de la table), mais le mot de passe est dans le DBF lui-même le rendant non sécurisé, (voyez [[11]](<http://www.antionline.com/archive/index.php/t-236215.html>)).
537+
538+Il y a d'autres options si vous voulez chiffrer vos données. Voyez ici la [de forum surle chiffrement de DBase](<http://www.lazarus.freepascal.org/index.php/topic,15422.msg83016.htm%7Cdiscussion>).
539+
540+## Chiffrement au niveau du système d'exploitation
541+
542+Vous pouvez utiliser un système de fichier chiffré tel que TrueCrypt (conteneurs) pour chiffrer le dossier où la base de données est stockée.
543+
544+## Chiffrer le fichier DBF
545+
546+Vous pouvez utiliser des flux (p.ex. le code du flux chiffré Blowfish fourni par Lazarus/FPC) pour chiffrer les données (toutes les tables etc) en stockant le fichier non chiffré p.ex. en mémoire, puis en l'écrivant sur le disque :
547+
548+ 1. Ouvrir votre fichier dans un TFileStream.
549+ 2. Déchiffrez le TFileStream vers un nouveau flux, YourDecryptedStream
550+ 3. Tdbf.UserStream:= YourDecryptedStream; //Remarque : cela ne déchiffrera pas les fichiers .dbt/memo ! Utilisez **UserMemoStream** pour cela (dans FPC le tronc de développement depuis Mai 2013 seulement)
551+ 4. Tdbf.Storage:=stoMemory;
552+ 5. Tdbf.Open;
553+
554+Une fois terminé :
555+
556+ 1. Tdbf.Close
557+ 2. Chiffrez YourDecryptedStream vers TFileStream
558+ 3. Libérez les flux
559+
560+Du code détaillé peut être trouvé dans le forum mentionné plus haut. Des gens qui auraient implémenté ceci sont les bienvenus pour adapter cet article avec du code qui marche.
561+
562+## Chiffrer le champ de donnée
563+
564+Vous pourriez aussi choisir de chiffrer le champ de donnée en implémentant les événements OnGetText et OnSetText pour chiffrer/déchiffrer le contenu du champ.
565+
566+# Prendre conscience que
567+
568+Actuellement il n'y a aucun support de l'intégrité référentielle, ni de cryptage possible des fichiers au format .dbf.
569+
570+# Logiciel tierce partie
571+
572+ * [MyDbf Studio](<http://mydbfstudio.altervista.org/>) est un outil d'administration pour gérer vos tables dBase. Il est entièrement écrit avec Lazarus et est basé sur le composant TDbf.
573+ * [[12]](<http://vlad-karpov.narod.ru/Components.html#VK%20DBF>) sont des composants Delphi pour les fichiers DBF.
574+ * Composant Open Source VKDBF de Vlad Karpov's : [[[13]](<http://sourceforge.net/projects/vkdbf/?source=directory>)]
575+
576+# Voir aussi
577+
578+ * [[TDbf/fr|TDbf]]
579+ * [[fpdbfexport/fr|fpdbfexport]] Exporte toutes sortes de DataSet vers des fichiers DBF.
580+ * Voyez l'exemple dbftool inclus dans dans FPC 2.7.1+: création, utilisation de fichiers DBF et export de données en utilisant db export (aussi téléchargeable via <http://svn.freepascal.org/svn/fpc/trunk/packages/fcl-db/examples/>)
581+ * [[Contacts Database/fr|Contacts Database]] Autre exemple de base de données.
582+ * [[Example: TDbf \(creating table and indexes, selecting of index\|Example: TDbf (creating table and indexes, selecting of index)/fr]]/fr> "Example: TDbf \(creating table and indexes, selecting of index\)/fr \(page does not exist\)")
583+
584+---
585+*From the Free Pascal wiki, page "Lazarus Tdbf Tutorial/fr", as the Internet Archive kept it on 2025-03-15, last changed on 2020-02-19. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history