Foros Club Delphi

Foros Club Delphi (http://www.clubdelphi.com/foros/index.php)
-   Tablas planas (http://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   como hacer un fichero indice (http://www.clubdelphi.com/foros/showthread.php?t=25744)

Antuan 02-10-2005 17:23:14

como hacer un fichero indice
 
1 Archivos Adjunto(s)
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

dec 02-10-2005 17:58:37

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. ;)

Antuan 02-10-2005 20:02:24

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.

dec 02-10-2005 20:47:38

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.

Antuan 03-10-2005 13:59:05

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

Lepe 03-10-2005 16:46:42

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.


La franja horaria es GMT +2. Ahora son las 16:10:47.

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