begin process at 2008 08 30 01:47:40
1 233 984 membres
22 nouveaux aujourd'hui
14 294 membres club

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 : 9 604

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
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.
  • 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?

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS