Bonjour,
j'ai une très vieille appli qui fonctionnait en DBase avec des index MDX (je sais, c'est obsolète !!). Récemment, j'ai constaté que la réindexation de la base ne fonctionnait plus. Pour réindexer, j'utilisais une méthode proposée dans le grand libre Dbase :
- destruction du fichier MDX,
- remise à zéro de l'octet 28 de la table
- réindexation par AddIndex
Extrait du code ancien :
Comme j'avais une erreur à l’exécution sur le BlockRead et que cette méthode n'est plus conseillée, j'ai modifié la première partie comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 { suppression de Adres2.mdx dans Adres2.dbf en remettant l'octet 28 de adres2.dbf à 0 } System.Assign(Fichier,RepBa+'\'+ NomBa); System.reset(Fichier,1); Seek(Fichier,28); Octet := 0 ; BlockWrite(Fichier,Octet,1); System.CloseFile(Fichier); ... {Reconstruction des index} Try Table2.AddIndex('IND_NP' ,'NOM+PRENOM' ,[ixExpression]); Except on EDataBaseError do ShowMessage('Erreur : La reconstruction des index est impossible.'+Rc+ 'La base est occupée par un autre utilisateur.'); End;
Mon code ne doit pas être bon car à l'exécution j'ai une erreur sur AddIndex :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 {Remise à 0 de l'octet 28 de la base DBF = pas d'index} FicBase := RepBa+'\'+ NomBa ; FileHandle := SysUtils.FileOpen(FicBase, fmOpenWrite); if FileHandle > 0 then begin try MessageDlg('Handle de fichier valide', mtInformation, [mbOk], 0); FileSeek(FileHandle, 28, 0); Buffer := PAnsiChar(System.AllocMem(1)); Buffer[0] := '0' ; iBytesRead := SysUtils.FileWrite(FileHandle, Buffer^, 1); ShowMessage('iBytesRead : '+ IntToStr(iBytesRead)+ RC+ 'Buffer (0) : '+ Buffer[0]); SysUtils.FileClose(FileHandle) ; finally FreeMem(Buffer); end; end else MessageDlg('Erreur d''ouverture du fichier '+ FicBase +RC+ ' Code erreur DOS négatif', mtError, [mbOk], 0); MessageDlg('Opération terminée', mtInformation, [mbOk], 0);
Exception EDBEngineError message : l'index existe déjà
Quelqu'un peut il m'aider ?
Merci
Charly
Partager