begin process at 2010 02 10 06:25:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de Donnees

 > ACCES AU FORMAT DBF

ACCES AU FORMAT DBF


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :11 865

Auteur : phenixauthor

Ecrire un message privé
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.


 Sources de la même categorie

Source avec Zip INTERBASE FIREBIRD IBEXPERT par opgiat
Source avec Zip CREE ALIAS AUTOMATIQUEMENT CREATION REPERTOIRE ET TABLE AUSI par opgiat
Source avec Zip CRÉE UN RÉPERTOIRE ET CRÉE CES TABLES PAR PROGRAMME par opgiat
Source avec Zip Source avec une capture CONNEXION MYSQL ET RECUPERATION DANS BASE ACCESS par eli42
Source avec Zip Source avec une capture LIER DEUX TDBGRID par cantador

Commentaires et avis

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 ?

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

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

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 ?

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

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

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

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?

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales