Erreur 26 lors de l'ouverture de fichiers de données

Résolu
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010 - 24 juin 2008 à 18:06
Gwendokiss Messages postés 7 Date d'inscription vendredi 30 janvier 2009 Statut Membre Dernière intervention 11 février 2009 - 11 févr. 2009 à 09:15
Bonjour,


je reprends actuellement un logiciel développé avec VFP6.


Une instruction d'ouverture de table FoxPro dans le programme provoque de temps en temps une erreur "26 - La table n'a aucun ordre d'index actif." chez un utilisateur. La partie de programme concernée, et donc cette instruction, est exécutée de très nombreuses fois dans le logiciel sans générer d'erreur. Par contre, lorsqu'une erreur 26 s'est produite, il devient impossible d'ouvrir la table (fichier DBF) concernée sans faire au préalable une réindexation. Cette erreur n'est pas reproductible systématiquement et se produit par exemple assez fréquemment sur l'instruction "use ..." de l'exemple ci-dessous. Cette erreur se produit aussi sur d'autres instructions "use ..." du logiciel.


 nom_fichier = chemincomplet + "dq_prg\DQCM_TRV"
 IF !USED("SSDET_DQCM")
    use (nom_fichier) in 0 order 1 alias SSDET_DQCM shared again
 ENDIF
 select SSDET_DQCM
 ...


Je suppose donc que les indexes définis sur la table sont détruits ou altérés lorsque l'erreur se produit, mais il ne semble pas y avoir d'instructions qui pourraient expliquer cela ailleurs dans le logiciel.


Etant débutant sur FoxPro, tout avis ou piste d'enquête est bienvenu...

Merci d'avance

20 réponses

michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
11 déc. 2008 à 16:38
Bonjour,

le cdx a "disparu", ou bien existe-t-il mais à 0 octets?

le cdx est chargé entièrement en mémoire à l'ouverture d'une table. une fermeture incorrecte peut flamber ce cdx, qui va alors apparaitre à 0 octets sur le disque. si tu as quelque part un traitement de maintenance qui supprime les fichiers de 0 octets, ton fichier disparait!

je suppose que tu as vérifié qu'il n'y avait pas eu de reboot intempestif, ou de sortie sauvage du logiciel.

les pbs de cdx flambés sont dus la plupart du temps à une perte de connectivité réseau. toujours penser à vérifier que tous les switches et routeurs sont alimentés par un onduleur, et ne pas hésiter à tester en les changeant un par un.

autre source de pb sur les cdx, les antivirus: assure-toi que les cdx sont exclus de l'analyse, et que les dossiers des datas et les dossiers temporaires des data sont tous bien exclus aussi.
3
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
24 juin 2008 à 19:15
Bonjour,

l'erreur 26 est provoquée par la partie "ORDER 1" de ta clause use.
Peux-tu nous dire comment sont créés ces index, et en particulier s'il s'agit :
- d'index structurel condensé (matable.cdx, avec le nom de l'index identique à celui de la table),
- d'index structurel non condensé (monfichier.cdx, le nom est différent de celui de la table),
- ou d'index "ordinaires" (monfichier.idx)

Dans tous les cas, méfie-toi comme de la peste de l'adressage des tag d'index par leur numéro: use matable ... order 1 est à proscrire, il faut lui préférer use matable...order <NomDuTag>.
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
25 juin 2008 à 12:27
Merci pour la rapidité de cette réponse.

Les index associés aux tables concernées par mes problèmes se trouvent toujours dans un fichier CDX du même nom que le fichier DBF contenant les données (par exemple, dans le cas cité, la table s'appelle DQCM_TRV.DBF et le fichier d'index s'appelle DQCM_TRV.CDX).

J'ai du mal à saisir la différence, hormis une plus grande clarté du code, entre "use matable ... order 1" et "use matable...order <NomDuTag>" : y a t'il un risque de perte de l'association entre le nom d'un index et son numéro ? Est-ce à cause du fait que le numéro d'index réprésente son rang dans l'ordre de création des index ? 

L'utilisation du nom de l'index n°1 à la place du numéro dans mon "...order 1" pourrait-elle suffire à m'éviter l'erreur 26 qui se produit parfois ?
Si je suis la documentation, la syntaxe à utiliser en remplacement serait donc probablement "... order tag <nom donné à l'index>", mais je ne suis visiblement pas obligé de rajouter la clause "index DQCM_TRV.CDX" puisque le fichier CDX porte le même nom que mon fichier DBF.
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
26 juin 2008 à 11:49
1) "... order 1"
Il s'agit d'une fonctionalité qui n'est destinée qu'à assurer la comptaibilité avec les versions très antérieures.
l'utilisation de "... order 1" est risquée parceque les numéro d'index peuvent être modifiés sans que tu le saches: cette numérotation est interne à VFP, et il vaut mieux maitriser les choses en utilisant le nom du tag d'index.

2) ton fichier d'index est bien du type cdx structurel, il ne faut surtout pas spécifier de nom de fichier d'index après la clause ... order tag <nomTag>

3) quelle est la structure de cette table, et quelle est l'expression de cet index 1?

Es-tu ABSOLUMENT certain que ce soit cette instruction "use..." qui déclenche l'erreur? tu as un gestionnaire d'erreur qui enregistre la ligne qui provoque l'erreur, tu as vu cette ligne en erreur en débogage?

je rechercherais plutot du coté d'un SEEK (ou une de ses variantes)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
26 juin 2008 à 17:30
Merci pour ces explications : effectivement je comprends qu'il vaut mieux utiliser le nom d'index qu'un numéro mais, comme évoqué, je reprends un logiciel en VFP6 et toutes les ouvertures de fichiers sont effectuées en utilisant le numéro de l'index et non son nom donc je modifierai ça progressivement dans le logiciel.

En effet, j'ai une gestion d'erreur qui affiche un message d'erreur personnalisé et écrit dans un log notamment les informations retournées par les fonctions FoxPro program() et lineno(), ce qui m'a permis de localiser la ligne de code en cause et ainsi de voir que ces erreurs 26 se produisent toujours sur une instruction "use..." (parfois sur d'autres instructions "use..." que mon exemple). Pour en être bien certain car en consultant l'aide j'ai vu que cette erreur survenait effectivement plutôt sur des instructions de type SEEK, j'écris aussi dans le même log des phrases de texte uniques juste avant et juste après l'instruction "use..." de mon exemple, et j'ai pu donc visualiser récemment qu'une erreur 26 s'est bien produite chez l'utilisateur sur la ligne de code "use...order 1..." en récupérant son log.

Un de mes gros soucis est que, précisément, je n'ai personnellement jamais réussi à reproduire cette erreur en débogage, mais je vais bientôt récupérer les données que l'utilisateur a sauvegardées lorsque la dernière erreur 26 est survenue chez lui (notamment ses fichiers DQCM_TRV.DBF et DQCM_TRV.CDX) : j'espère qu'en utilisant ces données je reproduirais enfin l'erreur en débogage !
Cependant, même en cas de reproduction de l'erreur, je ne suis pas certain de trouver une explication, à moins que le remplacement de "... order 1" par "... order tag <nom de l'index>" dans l'instruction d'ouverture ne suffise à éviter le problème...

Comme demandé, voici un résumé de la structure de la table DQCM_TRV en cause dans mon exemple :
domaine               caractère      2
item_dom             caractère      3
topologie              caractère    20
ordre_art              numérique    4      0
article                   caractère    23
cd_compo            caractère    20
...
ordre                    numérique    4      0
...

Il y a 24 index définis sur cette table, le 1er qui doit être celui à utiliser est défini ainsi :
ordre : croissant
nom : DQCM_TRV01 (c'est donc ce nom que je compte utiliser à la place du 1 dans "use...order tag DQCM_TRV01...")
type : régulier
expression : article+cd_compo+STR(ordre,4)
filtre : vide
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
26 juin 2008 à 22:19
Questions complémentaires:
les tables sont-elles sur la machine sur laquelle l'erreur se produit, ou bien sur un poste réseau?
la table qui pose problème est-elle rattachée à un dbc, ou s'agit-il d'une table libre?
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
27 juin 2008 à 08:53
Les tables sont sur une machine distante accessible par le réseau local, tout comme les programmes compilés qui sont lancés par un raccourci depuis le poste de l'utilisateur qui a les erreurs.
Je précise que c'est la configuration type chez quasiment tous les autres utilisateurs finaux du logiciel qui n'ont jamais l'erreur 26.

Aucune des tables sur lesquelles une erreur 26 se produit parfois lors d'un "use..." n'est rattachée à un DBC.
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
30 juin 2008 à 09:41
Ah, ton problème est intéressant!
quelques hypothèses et pistes de recherche:

- Est-ce que tu as quelque part un bout de code qui réindexerait ce fichier? on pourrait alors imaginer que cette réindexation ne soit pas correctement effectuée et que ton erreur 26 survienne après la réindexation

- peux-tu vérifier l'existence éventuelle d'autres fichiers DQCM_TRV.CDX qui serait accessible à cet utilisateur? si un tel fichier existe, et qu'il s'agit d'une version qui n'aurait pas ce tag, alors on pourrait envisager une erreur

- et enfin, si l'erreur se produit sur un seul poste, alors on doit regarder du coté de la config matérielle: en premier lieu toute la connectivité réseau pour ce poste, en 2ème lieu la RAM
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
30 juin 2008 à 16:43
Il existe effectivement une fonctionnalité qui réindexe de nombreux fichiers dont DQCM_TRV. Mais, au contraire, cette fonctionnalité permet visiblement de remettre en bon état les index du fichier suite à une erreur 26, puisque c'est en fait la seule solution pour les utilisateurs du logiciel de ne plus avoir l'erreur 26 systématiquement lorsqu'elle s'est produit une fois.

En effet, l'erreur 26 est déjà survenue sur plusieurs postes chez le client concerné, donc ne semble pas liée à des spécificités matérielles. Lorsque l'erreur s'est produit une fois, plus personne ne peut lancer la fonction du logiciel qui contient l'instruction "use...order 1..." sans avoir l'erreur 26 (logique puisque c'est le même fichier DQCM_TRV concerné) : le seul moyen de s'en sortir est de faire une réindexation.

Comme évoqué, je vais vérifier s'il existe bien un seul fichier DQCM_TRV.CDX accessible aux utilisateurs chez ce client.
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
30 sept. 2008 à 16:27
Depuis mon dernier message, j'attends toujours les données que l'utilisateur devait sauvegarder lorsque la dernière erreur 26 est survenue chez lui (notamment ses fichiers DQCM_TRV.DBF et DQCM_TRV.CDX), afin de tenter de reproduire l'erreur 26 en débogage, et de vérifier s'il existe bien un seul fichier DQCM_TRV.CDX accessible aux utilisateurs chez ce client.
Il semblerait que l'erreur ne se soit produite qu'une ou 2 fois en 3 mois et à un moment où personne n'était en mesure de copier ces données, donc le sujet est toujours en stand-by. Je ne manquerai pas de poster un message dès que j'ai du nouveau...
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
20 nov. 2008 à 17:47
Bonjour,

désolé d'avoir laissé ce sujet en attente si longtemps mais, comme évoqué précédemment, je n'arrivais pas à avoir les éléments me permettant d'avancer significativement.

Je n'ai pas encore eu l'occasion de récupérer les données de l'utilisateur suite à une erreur 26. Par contre, j'ai réussi un peu par hasard à reproduire la même erreur sur une configuration de test. En fait, dans ce cas, cela a été du à l'absence du fichier des index DQCM_TRV.CDX normalement associé au fichier DQCM_TRV.DBF. En remplaçant le fichier DQCM_TRV.DBF "orphelin" de son CDX par les 2 fichiers DQCM_TRV.DBF et DQCM_TRV.CDX originaux le problème est résolu (si j'ajoute simplement le fichier DQCM_TRV.CDX en conservant le fichier DQCM_TRV.DBF "orphelin", cela ne suffit pas).

Je ne comprends pas ce qui a pu faire disparaitre le fichier CDX de cette configuration de test, puisqu'il n'y a même pas eu un plantage quelconque auparavant, qui aurait pu générer un état instable pour certains fichiers. Il m'est donc difficile de déterminer dans quel(s) cas se produit le phénomène. De plus, je ne suis pas certain que l'origine de l'erreur soit la même chez l'utilisateur mais je le soupçonne fortement quand même.

Je suis également surpris que l'absence du fichier CDX associé à un fichier DBF provoque une erreur 26 et non une erreur 1707, qui semble plus correspondre.
Je m'interroge donc sur la possibilité de valeur erronée retournée par les fonctions FoxPro AERROR() ou ERROR(), car ma même fonction de gestion d'erreur qui retourne l'erreur 26 m'a par ailleurs renvoyé une erreur "12 - Variable 'FAMILLE' introuvable." sur une ligne de code d'un programme dans lequel la variable "FAMILLE" n'est jamais mentionnée ! A moins que dans ce dernier cas, ce ne soient les fonctions PROGRAM() et LINENO() qui me renvoient une information erronée (dans ce dernier cas l'erreur se produit dans le code d'une fenêtre et non d'un programme comme habituellement). Ceci est un autre sujet mais je l'évoque ici par rapport à la fiabilité des renseignements sur lesquels je me base depuis le début de mon enquête sur l'erreur 26.
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
11 déc. 2008 à 16:13
L'erreur s'est à nouveau produite chez le client et elle est effectivement due à l'absence du fichier DQCM_TRV.CDX normalement associé au fichier DQCM_TRV.DBF. D'autre part, la même erreur 26 s'est produite chez ce client sur une autre instruction "USE...ORDER..." concernant un fichier DBF dont le CDX habituellement rattaché n'existe plus. Dans les 2 cas, une "réindexation" ou une recopie des fichiers DBF et CDX originaux élimine l'erreur.

La cause de l'erreur 26 est donc bien l'absence du fichier CDX normalement associé au fichier DBF qui tente d'être ouvert. J'ai parcouru une partie du code de mon logiciel à la recherche d'un traitement pouvant expliquer cette suppression de fichiers CDX mais apparemment RAS.

Je m'interroge donc sur ce qui pourrait expliquer la disparition du fichier CDX associé à un DBF, notamment dans un cadre multi-utilisateur. Ce phénomène ne se produit que chez un seul client du logiciel !
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
11 déc. 2008 à 17:27
Le fichier CDX a bien disparu complètement.
Je ne pense pas qu'il y ait eu une sortie sauvage du logiciel mais difficile d'en être absolument certain car c'est l'utilisateur qui le dit.
Je vais effectuer les vérifications quant à la présence d'une éventuelle tâche de maintenance qui supprimerait des fichiers de taille = 0 octets, et par rapport à un antivirus. Merci de ces infos.
0
Gwendokiss Messages postés 7 Date d'inscription vendredi 30 janvier 2009 Statut Membre Dernière intervention 11 février 2009
30 janv. 2009 à 14:52
Bonjour,

J'ai lu avec bcp d'intérêt cette discussion!

Mais suis très débutante...

Voici mon problème, car apparemment, j'ai également perdu un fichier .cdx

J'explique la situation dans son entièreté en espérant que ce soit plus clair.



Je dois encoder plus de 12000 articles dans notre nouveau programme de facturation.
Ce "stupide" programme n'accepte pas les imports de données

Mais tout encoder me paraît impossible, d'autant plus que je devrai recommencer toute l'opération dans moins de 6 mois, lors du changement de tarif

J'ai donc converti mon fichier excel en .dbf, ça c'était facile
Ensuite, j'ai remplacé le fichier existant (mais quasi vide, il y a juste qq articles pour la démo) par le mien que je venais de convertir...

Malheureusement, il me dit que c'est illisible car il manque le fichier .cdx

J'ai cru comprendre qu'il s'agit de l'index de ma base de données d'articles..

Mais malgré plusieurs heures de recherches, je ne sais pas comment le générer

Qui peut m'aider?? C'est hyper important et super urgent

D'avance, je vous remercie TOUTES et TOUS

Gwen
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
30 janv. 2009 à 23:43
Bonjour Gwen,

je crains fort que tu n'aies fait une GROSSE bêtise ... j'espère que tu avais une copie de ce fichier dbf d'origine!

je t'explique: un fichier dbf, c'est une ensemble de "champs" ; ça ressemble à des colonnes dans Excel, sauf que chaque champ est caractérisé par le type de données qu'il peut contenir. Dans 1 colonne excel, s'il y avait une date, tu peux mettre du texte dedans ; dans un dbf, non. si c'est un champ prévu pour stocker du texte de 10 caractères maxi, tu ne mettras pas 11 caractères, tu ne mettras pas de date, ni de numérique, etc...

Et quand tu as converti ton fichier excel en dbf, rien ne te garantit que tu as respecté la structure d'origine du dbf. Sans compter le fait qu'il y a de très nombreuses versions de dbf, qui ne sont pas compatibles entre elles.

Donc première vérification: la structure du dbf initial, comparée à celle de celui que tu as fabriqué.

Comment "générer" un cdx? ça dépend du type de cdx... et si tu n'as pas FoxPro, il te faut un programme d'émulation de la fenetre de commande de foxpro, ou bien passer par VFPOLEDB depuis un autre programme. Dans tous les cas, il faut connaitre les expressions d'index de ce cdx, et sans le dbf d'origine c'est impossible.

En quelle version de Fox est écrit ce programme? en as-tu les sources? as-tu FoxPro installé sur ta machine, ou non?
0
Gwendokiss Messages postés 7 Date d'inscription vendredi 30 janvier 2009 Statut Membre Dernière intervention 11 février 2009
8 févr. 2009 à 14:00
Bonjour Michel,

D'abord je voulais te remercier pour ta réponse très claire!
Je vais essayer de répondre à tes questions afin d'avoir plus de renseignements.

Primo: J'ai le fichier .DBF d'origine

Secondo: Je sais qu'un fichier .DBF a la structure similaire à un fichier Access plutôt qu'à un fichier Excel car, comme tu me l'as gentillement rappelé, les champs d'une base de données sont définis.
Ceci dit, même si je le savais, je n'ai pas pensé à vérifier que la structure était identique
J'ai, donc, ouvert mon fichier DBF avec DBF viewer et j'ai modifié la structure là où c'était nécessaire pour qu'elle corresponde à la structure d'origine.

Tertio:Je n'ai pas Fox Pro sur ma machine, je ne sais pas en quelle version est écrit ce programme, ce que je peux dire, si ça peut aider, c'est que quand j'ouvre le fichier DBF et que je regarde les infos des rubriques, le type renseigné est "FoxBase+ /dBASE III PULSE, no memo"

Voilà, je ne sais pas si tu peux m'aider plus avec ces renseignements...
J'espère que oui

Merci
Gwen
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
8 févr. 2009 à 16:38
La grande différence entre les fichiers Access et les fichiers FoxPro, c'est que Access est mono-fichier (toutes les tables, vues, requètes, index, form, reports, tout est dans 1 seul fichier), alors que Fox est "éclaté" entre des dizaines de fichiers (rien que pour une table de données, on peut avoir 1 dbf, 1 fpt, 1 ou plusieurs cdx, 1 ou plusieurs idx, sans compter 1 éventuel dbc avec son dct et son dcx associés)

Le problème reste entier: en ré-enregistrant ton fichier, tu n'as pas du tout la certitude que c'est la bonne version. Est-ce que tu as aussi le cdx d'origine?

Sur le fond, maintenant:
en ce qui concerne l'import de données, Fox dispose des commandes nécessaires pour pouvoir importer à partir de fichiers texte (txt, csv, et autres), de fichiers excel, et autres formats. Tu n'as nul besoin de convertir ta feuille excel, si tu as saisi tes imports en Excel.

Mais si le fournisseur de ton programme n'a pas inclus cette possibilité d'import dans son programme, je te conseille de le consulter avant toute manip intempestive.
Si ce fournisseur a disparu (ça arrive malheureusement), il te faut absolument savoir en quelle version de Fox sont conçues ces données (ta réponse précédente est insuffisante, il manque des infos).
Est-ce que tu as des fichiers vfpr*.dll sur ta machine? si oui, quel est leur nom exact?

A ce moment-là, le plus sage est peut-être de passer par un prestataire spécialisé, qui poura te conseiller, et éventuellement t'écrire un module d'import de données (ça ne sera pas gratuit).
0
Gwendokiss Messages postés 7 Date d'inscription vendredi 30 janvier 2009 Statut Membre Dernière intervention 11 février 2009
10 févr. 2009 à 22:26
Bonjour Michel,

Encore une fois un grand merci pour ta réponse si rapide.

J'ai une bonne nouvelle, j'ai réussi à importer mes données dans le "foutu" programme en question

Il me reste néanmoins une question, disons plutôt un fait que je ne m'explique pas!
Avant de réussir à importer l'ensemble de mes données Excel (en les convertissant en .csv), j'avais réussi à convertir mon fichier excel en .dbf, tout était ok quand je l'introduisais dans mon programme de facturation SAUF le champ "prix".

Je m'explique:
En tapant la référence du produit, il me trouvait le bon article et me remplissait tous les champs de la facture sauf le prix ?!

Pourquoi?
Je n'ai toujours pas trouvé mais, quoiqu'il en soit, pour l'heure je suis sauvée puisque j'ai pu, d'une autre manière, importer mes données excel.

A bientôt et encore merci
Gwen
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
11 févr. 2009 à 08:09
Content que tu t'en sois sortie  
Mais pourquoi as-tu dit dans ton premier message que ce "foutu" programme n'acceptait pas les imports, et dans ce dernier message tu dis avoir importé un csv?

Et pour ta question sur le champ "prix", impossible de te répondre avec certitude sans avoir la structure des données et 1 extrait de ton import.


on classe ça comme résolu?
0
Gwendokiss Messages postés 7 Date d'inscription vendredi 30 janvier 2009 Statut Membre Dernière intervention 11 février 2009
11 févr. 2009 à 09:15
Hello,

Ce "foutu" programme n'accepte pas les imports "officiels", disons plutôt que cette possibilité n'est pas offerte dans un menu. Mais on arrive à modifier la dbf.



Oui, on classe comme résolu, je reviendrai vous voir pour l'histoire du prix qui s'affiche pas mais d'abord je ferai d'autres essais pour cerner le problème et pouvoir l'expliquer plus clairement.



A bientôt
Gwen
0
Rejoignez-nous