Vérification des fichiers en format .dbf [Résolu]

devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 24 avril 2006 à 02:00 - Dernière réponse : devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention
- 11 mai 2006 à 14:27
salut,
je developpe en VB.net , mais cette fois je suis obligé à faire une appliquation en VFP, l'objectif de cette appliquation c'est de verifier la structure de quatre fichiers en format .dbf .
la premiere étape c'est de comparer les champs de la column bac au fichier1.dbf, avec l'entete du fichier2.dbf :
fichier1.dbf =
x column1 x column2 x bac x column3 x
x a x b x nom x a1 x
x b x b1 x prenom x a2 x
x c x b2 x numero x a3 x
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

fichier2.dbf =
x nom x prenom x numero x
x x x x
x x x x
x x x x
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Comment faire pour verifier la structure de ces deux fichiers(tables) ?

merci. apres cette étape j V vous donnez la deuxieme étape.
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 6 mai 2006 à 18:25
3
Merci
select matable
CLEAR
USE ? ALIAS maTable && Va chercher ta table
select matable
nCount = AFIELDS(MESCHAMPS,'MATABLE')
? nCount && Combien de champs on a.
select matable
scan
for i = 1 to nCount
?"Champs: "+ FIELD(i,ALIAS(),0)+ " Valeur :" +TRANSFORM(evaluate(field[i])) && De donne la value du champs
endfor
endscan

Ceci va te donner le nom du champ et la valeur du champs.

Merci Mike Gagnon 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de Mike Gagnon
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 24 avril 2006 à 17:05
0
Merci
Regarde l'aide en ligne pour AFIELDS()
Cela va te donner un bon point depart pour determiner le nom des champs dans la table fichier.dbf

>>apres cette étape j V vous donnez la deuxieme étape.

J'espere que TU vas en faire un bout toi-meme ;-)
Commenter la réponse de Mike Gagnon
devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 24 avril 2006 à 22:47
0
Merci
Merci, Merci, ca me donne de la force pour chercher et travailler mieux sur ce projet, je te promet, je trouverais la solution, et je vous lacherais le code.
Commenter la réponse de devham
devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 26 avril 2006 à 03:15
0
Merci
j'ai posé le problem et maitenant je pose la solution , LOL
ce code est la solution :

close all
clear


*on selectionne le premier fichier gen
select 0
use "C:\FICHIERS\fichier1.dbf" alias gen


*on met les champs du colonne qui nous interesse dans un vecteur
i=1
declare vgen(100)
do while not eof()
*bac est l'alias du colonne que j'utilise
vgen(i)= alltr (gen.bac)
i=i+1
skip
enddo
nbrLigne = i


select 0
use "C:\FICHIERS\fichier2.dbf" alias dbff
nbrColumn = fcount()


*la commande afields()
*pour transformer notre tableau au vecteur deux dimensions
afields(dbff)
for i=1 to nbrColumn
if vgen(1) = dbff(i,1)


*c'est juste pour marquer le point de départ de comparaison
*parceque le bon truc, qu'on ne sais jamais notre point de depart
?'La premiere ligne du colonne BAC dans le fichier GEN du controle est : ' + dbff(i,1)
debutCompar = i
i=nbrColumn
endif
next


*une boucle pous parcourir les deux vecteur
*et comparaison en meme temps
j=1
m = debutCompar
nbrErreur = 0
do while j <> nbrLigne
if vgen(j) == dbff(m,1)
j=j+1
else
?'Erreur entre la Colonne '+dbff(m,1)+' et la Ligne '+vgen(j)
j=j+1
nbrErreur = nbrErreur + 1
endif
m = m+1
enddo


*nbrErreur est un compteur d'erreurs
if nbrErreur = 0
etat = .T.
else
etat = .F.
endif


if etat = .T.
?'La structure de de votre fichier est correcte'
else
?'Il existe'+str(nbrErreur)+' Erreur dans votre fichier '
endif


REMARQUE : la fonction afields() rend le fichier dbf ou (le tableau) sous forme d'un vecteur en deux dimensions, qu'on peut parcourir,
ca ve dire que l'emplacement de la colonne bac dans notre fichier1.dbf devien fichier1(3,1), biensur apres de faire afields(fichier1).


Merci bien, monsieur Mike Gagnon .
et Merci de m'alérter s'il y a une information ou expression, incorrecte,

"ne me donne pa du poissons, mais aprend moi comment le pecher"
Commenter la réponse de devham
devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 26 avril 2006 à 03:26
0
Merci
j m'excuse,


"ne me donne pas du poissons, mais dit moi comment le faire"
Commenter la réponse de devham
Mike Gagnon 381 Messages postés vendredi 15 octobre 2004Date d'inscription 24 octobre 2013 Dernière intervention - 26 avril 2006 à 11:18
0
Merci
Ok, parfait. Maintenant que tu as compris le concept et en Foxpro en plus, voici comment moi j'aurais fais. Le principe est les meme que le tien, mais quelques raccourcis.

use "C:\FICHIERS\fichier1.dbf" ALIAS gen exclusive IN 0
INDEX ON BAC TAG BAC
** On crée un index sur le champ bac pour faire notre recherche
use "C:\FICHIERS\fichier2.dbf" alias dbff SHARED AGAIN IN 0
SELECT dbff
nCount = AFIELDS(leschamps,'dbff') && Compte les champs
FOR i = 1 TO nCount
SELECT gen
IF SEEK(leschamps[i,1]) && On cherche le nom du champs la premiere table
** On a trouvé le champs
ELSE
** les champs n'existe pas
endif
ENDFOR
Commenter la réponse de Mike Gagnon
devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 27 avril 2006 à 01:22
0
Merci
Merci, Votre méthode est plus simple que la mienne.
Commenter la réponse de devham
devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 6 mai 2006 à 18:05
0
Merci
SVP,
j veux savoir comment faire pour parcourir un dbf ligne par ligne, en verifiant les colonnes de chaque ligne.
Merci.
Commenter la réponse de devham
devham 15 Messages postés lundi 24 avril 2006Date d'inscription 6 mars 2007 Dernière intervention - 11 mai 2006 à 14:27
0
Merci
Voici mon code :

CLOSE TABLES
CLEAR

SELECT 0
USE "c:\fichiers\control\monop1.gen" ALIAS monGen
genCount=AFIELDS(monGen)
i=1
DECLARE vecLgrille(3,500)
DO WHILE NOT EOF()
vecLgrille(1,i)= ALLTRIM(monGen.get)
vecLgrille(2,i)= ALLTRIM(monGen.Lgrille)
i=i+1
skip
ENDDO

SELECT 0
USE "c:\fichiers\control\monop1.dbf" ALIAS monDbf
nCount= AFIELDS(monDbf)
*?nCount
i=1
DO WHILE i<>nCount
IF ALLTRIM(vecLgrille(1,1))==ALLTRIM(monDbf(i,1))
debutCompar=i
i=nCount
ELSE
i=i+1
ENDIF
ENDDO
*?debutCompar
*LEN(ALLTRIM(TRANSFORM(evaluate(field[i]))))

SCAN
i=debutCompar
j=1
compErr=0
DO WHILE i<>genCount
*?mapof(i,1)
*?"Champs: "+FIELD(i)+" Valeur :"+TRANSFORM(evaluate(field[i]))+" Longueur "+STR(LEN(ALLTRIM(TRANSFORM(evaluate(field[i]))))) && De donne la value du champs
*?TRANSFORM(evaluate(field[i]))
*?ALLTRIM(STR(LEN(TRANSFORM(evaluate(field[i])))))
*?vecLgrille(2,j)
IF vecLgrille(2,j) < ALLTRIM(STR(LEN(TRANSFORM(evaluate(field[i])))))
?"Erreur"
?ALLTRIM(STR(LEN(TRANSFORM(evaluate(field[i])))))+' '+FIELD(i)
?vecLgrille(2,j)+' '+vecLgrille(1,j)
j=j+1
i=i+1
compErr=compErr+1
ELSE
j=j+1
i=i+1
ENDIF
ENDDO
ENDSCAN

IF compErr==0
?'bien'
ELSE
?ALLTRIM(STR(compErr))+' Erreur'
ENDIF
Commenter la réponse de devham

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.