Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Regenerar índices NDX de Dbase?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Regenerar índices NDX de Dbase? Responder citando

Cómo es posible eliminar unos archivos NDX (índices ya creados por el Database Desktop) y volver a crearlos en tiempo de ejecución, cómo si lo hiciera el mismo Database Desktop???. He buscado por todos sitios , pero no hallé respuesta aún. Gracias a todos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Lo que comentas (generar los índices en tiempo de ejecución) lo hago al crear y/o restaurar las tablas. Puedes propar con la instrucción IndexDefs de las tablas (Table1->IndexDefs->Add...).
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: índices ndx Responder citando

Gracias por contestar tan rápido Ángel. La cosa es que las tablas ya están creadas, y por culpa de posibles índices corruptos lo que quiero es eliminarlos y volver a crearlos. Por ahí encontré, un código que personalizé para mi trabajo pero me da el error justo en la primera sentencia AddIndex indicándome "Table level changed", lo cual no entiendo. A ver si podeis ayudarme, aquí llevais el código:

//borrar los archivos índices
AnsiString Indi1 = Table1->DatabaseName + "\\CODIGOC.NDX";
AnsiString Indi2 = Table1->DatabaseName + "\\NOMBREC.NDX";
AnsiString Indi3 = Table1->DatabaseName + "\\POBLACIC.NDX";
DeleteFile(Indi1);
DeleteFile(Indi2);
DeleteFile(Indi3);

//borrar la definición de índices:
Table1->IndexDefs->Clear();

//volver a definir los índices
Table1->AddIndex(Indi1,"CODIGO",TIndexOptions(),"");
Table1->AddIndex(Indi2,"NOMBRE",TIndexOptions(),"");
Table1->AddIndex(Indi3,"POBLACION",TIndexOptions(),"");

//abrir la tabla
Table1->Open();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Si pides ayuda para NDX en Builder te lanza una página de ayuda sobre los índices dBase. Como hace tiempo que no uso tablas dBase, me he encoinmtrado con una instrucción que desconocía: IndexFiles.

De todas formas, el código que has puesto me parece correcto la primera parte (borrado), pero la segunda (creación) creo que la complicas un poco; además, el hecho de aprir la tabla no crealos índices y en el AddIndex te sobra un parámetro; yo probaría esto:
Código:
TIndexOptions Opcion;
Opcion << ixPrimary;

Table1->AddIndex(Indi1,"CODIGO", Opcion);
Table1->AddIndex(Indi2,"NOMBRE", Opcion);
Table1->AddIndex(Indi3,"POBLACION", Opcion);
Table1->CreateTable();


En teoría, dado que no haces ninguna redefinición de la tabla sólo debría crear los índices. Pruébalo y me cuentas algo. Wink
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: de nuevo a preguntar y dar ideas (espero) Responder citando

Sad El código no llega al CreateTable(). Se queda en el primer AddIndex con el error que comenté antes. llevo toda la tarde buscando alguna solución. En muchas páginas encontré algo así como esto
http://www.rxlib.ru/faqs/faqc_en/18752.html
es decir, que recomiendan utilizar el DBI, buscando por éste encontré algo interesante pero no consigo hacerlo ejecutar, pues no sé bien los parámetros a darle a la funcion.

------------------------
Reindexing a table
To reindex a table you should first open it (see Opening a table and one index). Then the index can be regenerated by means of the following function call:

DbiRegenIndex ( hDB, hTable, NULL, NULL, "MYINDEX_2.NDX", NULL, 0 ) );

If the table has more than one index you should call DbiRegenIndex as many times as the indexes count. Before each call close the table and reopen it with the only one index to regenerate.
-----------------


La información la saqué de

http://www.hochfeiler.it/alvise/BDE.HTM#ReindexingTable

he probado con...
DbiRegenIndex (Table1->DatabaseName, Table1->DatabaseName+"\\CLIENTES.DBF", NULL, NULL, Indi1, NULL, 0 );

pero lógicamente esos 2 primeros parámetros (AnsiString) no son el tipo que pide la función que son del tipo hDBIObj.
Nada, que a ver que pasa. Gracias por contestar de nuevo. Smile
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.