Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ACCES AU FORMAT DBF


Information sur la source

Catégorie :Base de Donnees Niveau : Débutant Date de création : 15/01/2003 Date de mise à jour : 15/01/2003 17:05:07 Vu : 10 961

Note :
4 / 10 - par 2 personnes
4,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note

Description

Permet d'acceder aux informations stockées dans des fichiers au format dbf, contenant du texte.
Permet d'extraire les infos par champs ( ou colonnes )

Surement à améliorer.
 

Source

  • // Auteur : eric Launay 2002
  • //
  • // contact : eric.launay@numericable.fr
  • // dans le fichier principal, ajouter {$i dbase.pas } pour inclure les fonctions de ce fichier
  • // declarer en constante nb= nombre de fichier dbf ouverts simultanement
  • // ensuite, ouvrir le fichier dbf :
  • // ex: ouvrir_table('\hello.dbf',1)
  • // le nom du fichier doit inclure le chemin, 1 = numero du fichier par rapport à nb ( maximum )
  • // Cela permet l'analyse du fichier DBf ( champs.... )
  • // Nombre de champs detectés stocké dans nombre_champs[no_f]
  • // note : maximum 18 ici
  • //
  • // Ensuite executer debut_table(1);
  • // place le pointeur au debut du fichier, après entete
  • // lire_table(1);
  • // stocke les infos des differents champs dans le tableau table_colonnes[no_f,no_c]
  • // no_f= no du fichier ( ex ici : 1)
  • // no_c= No de la colonne ( ou champs ) max 18 dans cette version
  • //
  • // la fonction fin_table(no_f) teste la fin du fichier
  • // renvoi true si oui / false sinon
  • // ceci a été testé et marche bien avec certains fichiers DBF, contenant du texte uniquement
  • // et peut surement etre amélioré.
  • // En tout cas, ca m'a évité d'utiliser les composants Borland ou Microsoft
  • { parametres pour fichiers dbf }
  • var
  • nombre_champs:array[1..nb] of integer;
  • longueur_champs:array[1..nb,1..18] of integer;
  • {18 colonnes max }
  • depart:array[1..nb] of integer;
  • ligne:array[1..nb] of integer;
  • table_colonnes:array[1..nb,1..18] of string;
  • no_fichier:array[1..nb] of integer; { no fichier ouvert }
  • limite_table:array[1..nb] of longint; { eviter depassement table : longint }
  • procedure ouvrir_table(var m:string;n:integer);
  • { structure des fichiers dbf :
  • entete : 2 lignes de 16 car.
  • definitions des champs
  • donnees : 2 lignes de 16 car. -> 1 NOM du champ + ???
  • -> 2 taille du champs(1er car)+????
  • .................................
  • Si le le premier caractere du nom du champ= return ( chr 13 )
  • alors fin de la definition des champs
  • soit : ???????????????? entete
  • ????????????????
  • NOM ???????????? Definition des champs
  • T??????????????? T=taille ( 1 caractere )
  • NOM ????????????
  • T???????????????
  • F xxxxxxxxxxxxxx F chr(13)+chr(10)+ chr(32)
  • ^ xxx début des donnees
  • Ici, debut= 2 (nbre champs) * 32 (blocs) + 2 ( chr13+chr10 ) + chr(32) }
  • var pos,l,i:integer;
  • car:char;
  • begin
  • no_fichier[n]:=fileopen(m,fmOpenRead); { en lecture seulement }
  • limite_table[n]:=fileseek(no_fichier[n],0,2); { fin de la table }
  • pos:=1;
  • l:=0;
  • fileseek(no_fichier[n],48,0); { debut de table }
  • repeat
  • fileread(no_fichier[n],car,1); { on lit 1 caractere }
  • longueur_champs[n,pos]:=ord(car);
  • fileseek(no_fichier[n],15,1); { ligne suivante, 16- 1 car. }
  • fileread(no_fichier[n],car,1); { voir si chr 13 }
  • if car<>chr(13)then
  • begin
  • pos:=pos+1;
  • fileseek(no_fichier[n],15,1); { ligne suivante, 16- 1 car.}
  • end;
  • until (car=chr(13));
  • nombre_champs[n]:=pos;
  • fileread(no_fichier[n],car,1);
  • fileread(no_fichier[n],car,1);
  • if car=chr(32)
  • then depart[n]:=(pos+1)*32+2
  • { fichier dbase correct }
  • else depart[n]:=(pos+1)*32+1;
  • { fichier modifié par excel, pas de chr(32) }
  • for i:=1 to nombre_champs[n] do
  • l:=l+longueur_champs[n,i];
  • ligne[n]:=l+1;
  • end;
  • procedure debut_table(n:integer);
  • begin
  • fileseek(no_fichier[n],depart[n],0);
  • end;
  • procedure lire_table(n:integer);
  • var i,x:integer;
  • donnee:string;
  • s:array[1..255] of char;
  • begin
  • donnee:='';
  • fileread(no_fichier[n],s,ligne[n]);
  • for i:=1 to (ligne[n]-1) do
  • donnee:=donnee+s[i+1];
  • x:=1;
  • for i:=1 to nombre_champs[n] do
  • begin
  • table_colonnes[n,i]:=copy(donnee,x,longueur_champs[n,i]);
  • x:=x+longueur_champs[n,i];
  • end;
  • end;
  • function fin_table(n:integer):boolean;
  • var i:longint;
  • begin
  • i:=fileseek(no_fichier[n],0,1); { teste si le eof=vrai }
  • if (i=limite_table[n])
  • then fin_table:=true
  • else fin_table:=false;
  • end;
// Auteur : eric Launay 2002
// 
// contact : eric.launay@numericable.fr

// dans le fichier principal, ajouter {$i dbase.pas } pour inclure les fonctions de ce fichier
// declarer en constante nb= nombre de fichier dbf ouverts simultanement
// ensuite, ouvrir le fichier dbf : 
// ex: ouvrir_table('\hello.dbf',1)
// le nom du fichier doit inclure le chemin, 1 = numero du fichier par rapport à nb ( maximum )
// Cela permet l'analyse du fichier DBf ( champs.... )
// Nombre de champs detectés stocké dans nombre_champs[no_f]
// note : maximum 18 ici
//
// Ensuite executer debut_table(1); 
// place le pointeur au debut du fichier, après entete
// lire_table(1);
// stocke les infos des differents champs dans le tableau table_colonnes[no_f,no_c] 
// no_f= no du fichier ( ex ici : 1) 
// no_c= No de la colonne ( ou champs ) max 18 dans cette version
// 
// la fonction fin_table(no_f) teste la fin du fichier 
// renvoi true si oui / false sinon

// ceci a été testé et marche bien avec certains fichiers DBF, contenant du texte uniquement
// et peut surement etre amélioré.
// En tout cas, ca m'a évité d'utiliser les composants Borland ou Microsoft

{ parametres pour fichiers dbf }

var
  nombre_champs:array[1..nb] of integer;
  longueur_champs:array[1..nb,1..18] of integer;
      {18 colonnes max }
  depart:array[1..nb] of integer;
  ligne:array[1..nb] of integer;
  table_colonnes:array[1..nb,1..18] of string;
  no_fichier:array[1..nb] of integer; { no fichier ouvert }
  limite_table:array[1..nb] of longint; { eviter depassement table : longint }

procedure ouvrir_table(var m:string;n:integer);

 { structure des fichiers dbf :

     entete  : 2 lignes de 16 car.

             definitions des champs

     donnees : 2 lignes de 16 car.   -> 1  NOM du champ + ???
                                     -> 2 taille du champs(1er car)+????
          .................................

     Si le le premier caractere du nom du champ= return ( chr 13 )
     alors fin de la definition des champs

     soit :          ????????????????     entete
                     ????????????????

                     NOM ????????????     Definition des champs
                     T???????????????     T=taille ( 1 caractere )
                     NOM ????????????
                     T???????????????
                     F xxxxxxxxxxxxxx     F chr(13)+chr(10)+ chr(32)
                       ^                  xxx début des donnees

     Ici, debut= 2 (nbre champs) * 32 (blocs) + 2 ( chr13+chr10 ) + chr(32)    }



var pos,l,i:integer;
    car:char;


begin
     no_fichier[n]:=fileopen(m,fmOpenRead);  { en lecture seulement }
     limite_table[n]:=fileseek(no_fichier[n],0,2); { fin de la table }
     pos:=1;
     l:=0;
     fileseek(no_fichier[n],48,0);    { debut de table }
     repeat
           fileread(no_fichier[n],car,1); { on lit 1 caractere }
           longueur_champs[n,pos]:=ord(car);
           fileseek(no_fichier[n],15,1); { ligne suivante, 16- 1 car. }
           fileread(no_fichier[n],car,1); { voir si chr 13 }
           if car<>chr(13)then
           begin
                pos:=pos+1;
                fileseek(no_fichier[n],15,1); { ligne suivante, 16- 1 car.}
           end;
     until (car=chr(13));
     nombre_champs[n]:=pos;
     fileread(no_fichier[n],car,1);
     fileread(no_fichier[n],car,1);
     if car=chr(32)
        then depart[n]:=(pos+1)*32+2
             { fichier dbase correct }
        else depart[n]:=(pos+1)*32+1;
             { fichier modifié par excel, pas de chr(32) }
     for i:=1 to nombre_champs[n] do
         l:=l+longueur_champs[n,i];
     ligne[n]:=l+1;
end;


procedure debut_table(n:integer);

begin
       fileseek(no_fichier[n],depart[n],0);
end;

procedure lire_table(n:integer);

var i,x:integer;
    donnee:string;
    s:array[1..255] of char;
begin
     donnee:='';
     fileread(no_fichier[n],s,ligne[n]);
     for i:=1 to (ligne[n]-1) do
         donnee:=donnee+s[i+1];
     x:=1;
     for i:=1 to nombre_champs[n] do
     begin
          table_colonnes[n,i]:=copy(donnee,x,longueur_champs[n,i]);
          x:=x+longueur_champs[n,i];
     end;
end;

function fin_table(n:integer):boolean;

var i:longint;

begin
	i:=fileseek(no_fichier[n],0,1); { teste si le eof=vrai }
	if (i=limite_table[n])
		then fin_table:=true
		else fin_table:=false;
end;

Conclusion

Le fonctionnement est expliqué dans le source.
 

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 15/01/2003 19:15:57 administrateur CS

Pour ceux qui souhaiteraient en savoir plus sur la structure des fichiers DBase, voir sur http://www.wotsit.org et rechercher DBF.

Eric, est-ce que ce code peut lire tous les formats de DBase II à DBase V sans problèmes ?
Pourquoi écris-tu : "En tout cas, ca m'a évité d'utiliser les composants Borland ou Microsoft" ?
En quoi sont-ils mauvais ?
Celà dispense-t-il de la présence du BDE ?
Comment fait-on si des tables sont en relation ?

signaler à un administrateur
Commentaire de phenixauthor le 15/01/2003 20:09:17

Aucune idée pour la compatibilité de dBII à dbIV.Je sais que ca marche pour dbIV ( testé pour le boulot ), a voir pour les autres formats, ou à améliorer.
Il n'y a pas besoin du BDE, donc des composants borland : c'est donc + facile à mon avis

signaler à un administrateur
Commentaire de jarv le 15/01/2003 21:00:34

merci beaucoup pour cette source. J'ai pour ma part en tant que programmeur débutant qui n'a pas bde sur ma version personnel était obligé de bidouiller avec un convertisseur de fichier dbf à txt puis j'ai exploiter les données txt. désolé c'est pas terrible mais ca marche bien...

signaler à un administrateur
Commentaire de Delphiprog le 15/01/2003 21:38:29 administrateur CS

La dernière question n'a pas reçu de réponse : "Comment fait-on si des tables sont en relation ?"
Comment gères-tu les index ?

signaler à un administrateur
Commentaire de phenixauthor le 16/01/2003 20:24:53

Ces fonctions ne gerent pas les tables liées, ni les index.
L'acces au fichier se fait lineairement.
Ce source n'a pas la vocation d'etre " magique ", mais peut depanner certaines personnes.Il peut aussi etre largement améliorer.
Bon courage

signaler à un administrateur
Commentaire de diablox le 30/03/2005 15:57:13

Bonjour moi cette focntione m'interesse beaucoup, mais j'ai un soucis cela ne fonctionne pas bien du tout, pourrais tu m'envoyer par mail a cete adresse un exemple de ton source qui ouvre un fichier avec le composant opendialog merci d'avance.

chenapan54@yahoo.fr

signaler à un administrateur
Commentaire de totalsigne le 04/10/2007 02:45:30

mai ya aucun problem si tu ouvre simplement le fichier dbf comme un fichier paradox et tu accede au donne ans problem

signaler à un administrateur
Commentaire de raouaj le 18/06/2008 15:55:15

j'ai le compilateur Turbo Pascal7, mais comment faire exploiter cette source pour acceder à un fichier PDF. comment je peux implanter cette source dans un programme editer en pascal?

signaler à un administrateur
Commentaire de noussageo le 09/06/2009 17:01:41

Bonjour, je suis étudiante en géomatique,svp est ce quelqu'un pourrait m'aider,j'ai réussi à ajouter et supprimer des enregistrement dans une table access par le code VB mais j'ai pas reussi à le faire avec une table .dbf
Merci pour votre aide

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.