Difference between revisions of "Lazarus Tdbf Tutorial/fr"

From Lazarus wiki
Jump to navigationJump to search
Line 21: Line 21:
  
 
==== Limitations ====
 
==== Limitations ====
* * *  A FINIR * * *
+
* 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)''
* TDBF sets database encoding based on OS language settings (you can choose your own by setting LanguageID; see documentation). Moving a DB to another computer that does not support the encoding may lead to a read-only database. ''Note: investigate whether this applies to Tablelevel 7 (Visual DBase) and 25/30 (Foxpro/Visual Foxpro)''
+
* 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.
* None of the DBF formats used support Unicode encoding (whether UTF-8, UTF-16 or UTF-32). There may be a workaround using binary fields, but then you lose sorting abilities etc.
+
* L'indexation d'un fichier DBase avec [ixCaseInsensitive] ne fonctionne pas actuellement.
* Indexing a DBase file with [ixCaseInsensitive] currently does not work.
+
* 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).
* No support yet for referential integrity in file formats that support it (DBase VII, Visual FoxPro).
+
* 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.
* No support (now or ever) for internally encrypted .dbf files: the DbaseIV encryption mechanism is quite weak anyway. Please use one of the encryption methods mentioned below.
 
  
FPC 2.6.x and lower:
+
FPC 2.6.x et antérieur :
* On ARM processors, the TDBF code is known not to work due to bus alignment issues. This is being addressed in the FPC development/trunk version.
+
* 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.
* Choosing the FoxPro tablelevel (25) will produce files that cannot be read by Visual Foxpro drivers. This has been fixed in the FPC development/trunk version.
+
* 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.
  
 
=== Pas besoin d'installation ===
 
=== Pas besoin d'installation ===

Revision as of 07:26, 22 June 2017

Deutsch (de) English (en) español (es) français (fr) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Portail de la base de données

Références:

Tutoriels/articles pratiques :

Bases de données

Advantage - MySQL - MSSQL - Postgres - Interbase - Firebird - Oracle - ODBC - Paradox - SQLite - dBASE - MS Access - Zeos

Vue d'ensemble

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 (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 mais d'autres contributions sont bienvenues !

Dans Lazarus, le composant DbfLaz fait usage du code du TDbf de FPC.

Documentation

Pour de la documentation complémentaire en PDF, allez sur le site SourceForge. Il peut être utile de garder ce pdf à côté de ce document pendant la lecture.

Ce article Wiki sert comme documentation supplémentaire pour les nouvelles fonctionnalités hors de la documentation d'origine.

Alternatives et problèmes connus

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).

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.

Problème courant : veuillez voir les bugs dans le traqueur de bug, en particulier http://bugs.freepascal.org/view.php?id=22177.

Limitations

  • 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)
  • 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.
  • L'indexation d'un fichier DBase avec [ixCaseInsensitive] ne fonctionne pas actuellement.
  • 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).
  • 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.

FPC 2.6.x et antérieur :

  • 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.
  • 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.

Pas besoin d'installation

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.

Que contient TDBF ?

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.

Que faut-il mettre dans votre clause Uses

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.

Ainsi, vous obtiendrez :

uses Dbf, db, Dbf_Common;

Comment créer une nouvelle table de base de données ?

Car il n'y a encore aucune interface de création de "base de données" sous Lazarus, nous devons créer une nouvelle base de données directement dans le code.

Définir le chemin

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. Vous pouvez définir le chemin complet en utilisant la propriété FilePathFull, ou vous pouvez définir un chemin relatif au chemin courant de l'application avec FilePath. 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.

Choisir le format

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 :

  • 3 dBase III+
  • 4 dBase IV
  • 7 Visual dBase VII
  • 25 FoxPro

Pour choisir un format il suffit simplement d'initialiser la propriété TableLevel de façon approprié.

Ajouter des champs

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 :

MyDbf.FilePathFull := '/location/to/my/data';
MyDbf.TableLevel := 7;
MyDbf.TableName := 'customers.dbf'; // note: is the .dbf really required?
With MyDbf.FieldDefs do
begin
  Add('Id', ftAutoInc, 0, True);
  Add('Name', ftString, 80, True);
End;

Le type des champs se définie comme suit :

  • ftUnknown
  • ftString
  • ftSmallInt
  • ftInteger
  • ftWord
  • ftBoolean
  • ftFloat
  • ftCurrency (TableLevel 25)
  • ftBCD (TableLevel 25)
  • ftDate
  • ftTime
  • ftDateTime
  • ftBytes (TableLevel 25)
  • ftVarBytes
  • ftAutoInc (TableLevel 7 ou 25)
  • ftBlob
  • ftMemo
  • ftGraphic
  • ftFmtMemo
  • ftParadoxOle
  • ftDBaseOle
  • ftTypedBinary
  • ftCursor
  • ftFixedChar
  • ftWideString
  • ftLargeInt
  • ftADT
  • ftArray
  • ftReference
  • ftDataSet
  • ftOraBlob
  • ftOraClob
  • ftVariant
  • ftInterface
  • ftIDispatch
  • ftGuid
  • ftTimeStamp
  • ftFMTBcd

Les types en caractères gras sont actuellement supportés.

Allez-y, créez-le !

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 :

   MyDbf.CreateTable;

Comment ajouter des index à une table ?

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.

       MyDbf.Exclusive := True;
       MyDbf.Open;

Maintenant, il ne reste plus qu'a ajouter l'index.

       MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
       MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
       MyDbf.Close;

Et vous obtenez...

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. ;-)

{$MODE OBJFPC}
Program DatabaseTest;  
{ We will require the following units be in the USES clause: }
 uses Dbf, db, Dbf_Common;                                   
{ The Dbf is put there when you drop the TDbf on a form...   }
{ but you will need db for the DataSet object and Dbf_Common }
{ for things such as the field type definitions              }
var
  MyDbf: TDbf;
begin
  MyDbf := TDbf.Create(nil);
  try
    { use relative path to "data" directory }
    MyDbf.FilePath := 'data/'; 
    { we want to use Visual dBase VII compatible tables }
    MyDbf.TableLevel := 7;
    MyDbf.Exclusive := True;
    MyDbf.TableName := 'customers.dbf';
    With MyDbf.FieldDefs do begin
      Add('Id', ftAutoInc, 0, True);
      Add('Name', ftString, 80, True);
    End;
    MyDbf.CreateTable;
    MyDbf.Open;
    MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
    { add a secondary index }
    MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
    MyDbf.Close;
  finally
    MyDbf.Free;
  end;
end;

Fichiers d'index externes

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' :

    MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);


Chaque fois que TDBF est ouvert, le dossier d'index doit être chargé :

    MyDbf.OpenIndexFile('custname.ndx');


Et les index doivent être référencé avec l'extension :

    MyDbf.IndexName := 'custname.ndx';


Les fichiers d'index sont compactés séparément :

    MyDbf.CompactIndexFile('custname.ndx');

Comment lier TDBF aux composants ad hoc

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.

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 manipule 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 :

TDbEdit-------
             |
TDbEdit------|-->TDataSource-->TDbf
             |
TDbNavigator--


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.

TDbf.Active := True;


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.

Compacter et reconstruire des tables

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.

MyDbf.Exclusive := True;
MyDbf.Open;
MyDbf.PackTable;
// let's also rebuild all the indexes
MyDbf.RegenerateIndexes;
MyDbf.Close;
MyDbf.Exclusive := False;

Relations avec la table principale (Master table)

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.

Quand une relation est faite entre deux tables, on obtient :

[customers]
Id       <----|
Name          |
Phone         |
Address       |
              |  The CustID in invoices references a customer primary  field
[invoices]    |
Id            |
Amount        |
CustID   -----|  * This field indexed as "idxcustid"


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).

Sur les factures le composant de TDBF a placé ce qui suit :

InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf
InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index


Exemple d'application – Navigateur de Base de données

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

Prendre conscience que

Actuellement il n'y a aucun support de l'intégrité référentielle, ni de cryptage possible des fichiers au format .dbf.

See also