Ver Mensaje Individual
  #2  
Antiguo 02-10-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.decsoftutils.com

Última edición por dec fecha: 02-10-2005 a las 18:16:24. Razón: Corrección del texto.
Responder Con Cita