Club Delphi  
    FTP   CCD     Enlaces   Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Desplegado
  #1  
Antiguo 02-10-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Antuan Va por buen camino
como hacer un fichero indice

Tengo un ejemplo sencillo con una base de datos DBF y no se como crear un fichero indice.
Llevo varios dias mirando y no soy capaz de hacerlo asi que recuro a alguien que me pueda decir como hacerlo.
Tengo la aplicacion en un fichero amigos.zip que es un ejemplo.
Lo he creado en c:\prueba
He seguido los pasos de crear el indice principal y luego el indexName y nada de nada.
Por mas que destruyo la aplicacion y lo vuelvo a hacer.
No soy capaz de crear el fichero indice.
He subido el ejemplo en un zip. Por si alguien me puede decir lo que falta y que hago mal.
Muchas gracias
Archivos Adjuntos
Tipo de Archivo: zip amigos.zip (3,2 KB, 83 visitas)
Responder Con Cita
  #2  
Antiguo 02-10-2005
dec dec is offline
Moderador
 
Registrado: dic 2004
Posts: 11.691
dec Va por buen camino
Hola,

Ignoro cómo puede hacerse en tiempo de ejecución, si bien creo que algo se puede hacer, por lo que he leído en este Hilo en donde roman lo explica. En tiempo de diseño es sencillo: hay que utilizar el programa DataBase Desktop que se incluye en Delphi.

Abre el DataBase Desktop (desde el menú "Tools" en Delphi, o desde el menú de Inicio de Windows, dentro del grupo de accesos directos para Delphi. Una cosa quiero aclarar antes de nada: lo he hecho con la tabla que has adjuntado como ejemplo, pero no he conseguido crear una clave primaria y creo que esto es bien hacerlo en caso de usar índices secundarios, que es de lo que se trata aquí.

Lo he hecho sin más ni más, restructurando la tabla desde el programa DataBase Desktop, como ya he dicho. Bien, tratemos de ir paso por paso a ver si podemos llegar a buen puerto. Supondremos que vas a hacerlo con la tabla que has enviado, esto es, vamos a restructurar la tabla: pero para una nueva los pasos creo que son más o menos similares.

Abre el programa DataBase Desktop.

Abre la tabla "amigos.dbf". Si te aparece el mensaje "Table is busy" cierra la tabla antes en Delphi: la tabla está abierta/ocupada y de ahí el error.

Elige en el menú "Table" de DataBase Desktop el elemento "Restructure". Te aparecerá una nueva ventana. Observa a la derecha de la misma, donde se lee "Table properties". Hay una lista en que por defecto está selecionada la opción "Indexes".

Con dicha opción seleccionada haz clic en el botón "Define" que puedes ver justo debajo de la mencionada lista. Vamos a definir los índices secundarios (si está bien dicho así). Te aparecerá una nueva ventana.

Fíjate a la izquierda de la misma: verás una lista que tiene la etiqueta "Field List". Selecciona un campo, para empezar selecciona "NOMBRE". Una vez seleccionado pulsa en el botón "Ok" que verás a la derecha de la ventana.

Se te pedirá el nombre para el índice a crear. Dale un nombre descriptivo, por ejemplo, para el campo "NOMBRE" dale el nombre "IndNombre" o algo así.

Repite los pasos (5-6) para todos los campos, si quieres crear un índice para cada uno de ellos. Cierra después todas las ventanas, hasta llegar a la que cuenta con botones con nombre "Save" y "Save as...". Elige "Save". Se creará en el directorio en que esté la tabla un archivo para cada índice, cuyo nombre será el que le diste al índice en cuestión, por ejemplo, encontrarás el archivo "INDNOMBRE.NDX".

Eso es todo. Ya has creado los índices. Ahora vamos a utilizarlos en la aplicación. Añade al formulario principal un "TRadioGroup". A su propiedad Caption asígnale el valor "Ordenación".

Añade tres elementos al "TRadioGroup" (uno por cada índice creado). Titúlalos "Por nombre", "Por primer apellido" y "Por segundo apellido", si creaste los tres índices para la tabla que nos ocupa. Puede que te interese dar el valor 3 a la propiedad "Columns" del "TRadioGroup".

10º En el evento "OnClick" del "TRadioGroup" codifica lo siguiente:

Código Delphi [-]
 procedure TForm1.RadioGroup1Click(Sender: TObject);
  begin
    case RadioGroup1.ItemIndex of
      0: Table1.IndexName := 'INDNOMBRE.NDX';
      1: Table1.IndexName := 'INDAPE1.NDX';
      2: Table1.IndexName := 'INDAPE2.NDX';
    end;
  end;
Con eso conseguiremos que al elegir un "Radio botón" del "TRadioGroup" la tabla se ordene por el índice elegido. Nota cómo a la propiedad "IndexName" del "TTable" le asignamos el nombre del archivo del índice correspondiente. Si tienes alguna duda, ya sabes dónde estamos.

Creo (no estoy seguro) que si tuvieras un índice primario (o definida una clave primaria en alguno de los campos, como mejor se diga) podrías hacer algo como lo siguiente:

Código Delphi [-]
  procedure TForm1.RadioGroup1Click(Sender: TObject);
  begin
    case RadioGroup1.ItemIndex of
      0: Table1.IndexName := '';
      1: Table1.IndexName := 'INDNOMBRE.NDX';
      2: Table1.IndexName := 'INDAPE1.NDX';
      3: Table1.IndexName := 'INDAPE2.NDX';
    end;
  end;
Observa que hemos añadido un nuevo índice, o criterio de ordenación, pero, en este caso, para el primer elemento no asignamos ningún archivo de "índice", sino una cadena vacía. Estoy por asegurar que si se selecciona dicho elemento la tabla se ordenará por el índice primario o por el campo que esté definido como una "clave primaria". De esto último no me hagas mucho caso. De lo anterior házmelo, si quieres, pero, no dejes de mantener ciertas reservas, por si las moscas, como suele decirse.
__________________
David Esperalta
www.davidesperalta.com

Última edición por dec fecha: 02-10-2005 a las 17:16:24. Razón: Corrección del texto.
Responder Con Cita
  #3  
Antiguo 02-10-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Antuan Va por buen camino
Buenisimo

Los pasos a seguir son buenisimos y el ejemplo que me has puesto me funciona pero con modificaciones.
Si pongo el codigo que me dices en el evento onclick de RadioGroup1Click(Sender: TObject);
No me funciona
Seguro que he hecho algo mal.
Pero si lo hago de este modo si que funciona
Código Delphi [-]
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Table1.IndexName := 'NOMBRE.NDX';
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Table1.IndexName := 'APE01.NDX';
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
Table1.IndexName := 'APE02.NDX';
end;
Con esto que me has enseñado voy a procurar pasar el codigo a tiempo de ejecucion
Y si te parece pongo el cogigo aqui.
Supongo que le vendra bien a alguien
El siguiente paso es relacionar dos tablas que tambien me trae loco.
Insisto la explicacion es de ordago a la grande.
Muchas gracias.
Responder Con Cita
  #4  
Antiguo 02-10-2005
dec dec is offline
Moderador
 
Registrado: dic 2004
Posts: 11.691
dec Va por buen camino
Hola,

Cita:
Empezado por Antuan
Los pasos a seguir son buenisimos y el ejemplo que me has puesto me funciona pero con modificaciones.
¡Bueno! ¡Todas las que quieras y aun las que no!


Cita:
Empezado por Antuan
Si pongo el codigo que me dices en el evento onclick de

Código Delphi [-]
   RadioGroup1Click(Sender: TObject);
No me funciona
El caso es que debería Antuan: lo que creo es que no estás utilizando el control "TRadioGroup", sino distintos "botones radio" diferentes: sin duda te confundí con que eran botones. El componente "TRadioGroup" te permite agrupar varios "radio botones", de tal modo que cuando selecciones uno de ellos cualquiera de los otros se "deseleccionará".

Por eso utilizábamos arriba la propiedad "ItemIndex" del "TRadioGroup": esta propiedad nos informa de qué "radio botón" está seleccionado. Echa un vistazo a la pestaña "Estandar" de la paleta de componentes en Delphi, porque ahí encontrarás, justo al lado del "TGroupBox" al "TRadioGroup": añade en su propiedad "Items" (uno por línea) los nombres/títulos (porque serán visibles) de cuantos "radio botones" precises.

De la manera en que lo haces ahora también te funcionará, pero, insisto en que pruebes con un "TRadioGroup", al menos hasta que puedas comparar y decidir con qué manera de hacerlo te quedas.


Cita:
Empezado por Antuan
Con esto que me has enseñado voy a procurar pasar el codigo a tiempo de ejecucion Y si te parece pongo el cogigo aqui.
No creo que nadie ponga reparos... sobre todo porque...


Cita:
Empezado por Antuan
Supongo que le vendra bien a alguien
Por eso mismo, por eso mismo Si es muy extenso el código, de todos modos, acaso fuera mejor que lo adjuntaras en un archivo. Como veas.


Cita:
Empezado por Antuan
El siguiente paso es relacionar dos tablas que tambien me trae loco.
Nada, hombre, eso en dos tardes, ya verás. Y si dudas, ya sabes que puedes abrir otro Hilo Antuan, para no mezclar las cosas. Aquí habrá quien te sepa responder (¡no lo digo por mí!) o, a lo menos lo procure.
__________________
David Esperalta
www.davidesperalta.com

Última edición por dec fecha: 02-10-2005 a las 19:50:29. Razón: Corrección del texto.
Responder Con Cita
  #5  
Antiguo 03-10-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Antuan Va por buen camino
El problema estaba en que no habia puesto los Item

Como ves el error era mio habia puesto TRadioGroup y tambien los ButtonRadio y no habia puesto los Item.
Asi queda mucho mejor.
Ya tengo casi todo en tiempo ejecucion
Me falta la parte que se hace con el DataBase Dektop o sea crear los indices.
Que no encuentro documentacion de como se hacen y tambien caso que existan no lo cree.
Muchas Gracias
Responder Con Cita
  #6  
Antiguo 03-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.329
Lepe cantidad desconocida en este momento
Código Delphi [-]
    TablaTrabajo.Exclusive := true;
    TablaTrabajo.SessionName := SessionName;
    Application.ProcessMessages;

 
     Borraindices(Dirbases,'Adicional.DB');
    TablaTrabajo.TableName := 'Adicional.DB';
    Try
      TablaTrabajo.open;
      progreso.Position := progreso.Position +1;
      TablaTrabajo.Addindex('PrimaryKey','Clave',[ixPrimary, ixUnique]);
      progreso.Position := progreso.Position +1;
      TablaTrabajo.Addindex('FidCliente','FidCliente',[]);
      progreso.Position := progreso.Position +1;
      TablaTrabajo.Close;
      progreso.Position := progreso.Position +1;

Esto es para tablas paradox, para dbf quizás sea parecido, mira el programa http://www.clubdelphi.com/ejemplos/caerques1-1.zip
que crea código delphi para tu programa.
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 23:42:25.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi