Share via


Crear índices basados en expresiones

Para hacer más eficaces sus aplicaciones puede crear índices basados en expresiones. Estas expresiones pueden ser simples o complejas, dependiendo de lo que se quiera lograr.

Indizar por expresiones simples

Las expresiones de índice simples se basan en un solo campo o en la concatenación de dos o más campos de caracteres para formar una clave de múltiples campos. Por ejemplo, para la tabla Customer de la base de datos TasTrade podría crear un índice basado en la expresión:

country + region + cust_id

Al examinar la tabla Customer ordenada según esta etiqueta de índice, los clientes aparecerán ordenados por países, dentro de cada país por regiones y dentro de cada región por Id. de cliente.

Evitar valores duplicados en una combinación de campos

Si desea evitar la duplicación de valores en múltiples campos, puede crear un índice principal o candidato basado en una expresión que combine múltiples campos.

Por ejemplo, si tiene una tabla que almacena el prefijo de zona y el número de teléfono en dos columnas:

Prefijo de zona Número de teléfono
206 444-nnnn
206 555-nnnn
313 444-nnnn

En ambas columnas existen valores duplicados en otras filas. Sin embargo, no hay ningún número de teléfono duplicado, ya que el valor está formado por la combinación de los dos campos. Por ello, si se especifican las dos columnas en la expresión de un índice principal o candidato, las filas del ejemplo no se considerarán duplicadas. Si intenta introducir un valor con el mismo prefijo de zona y el mismo número de teléfono que una de las filas existentes, Visual FoxPro rechazará la entrada por estar duplicada.

Usar valores NULL en expresiones de índice

Puede crear índices sobre campos que contengan valores NULL. Las expresiones de índice cuyo resultado es .NULL. se insertan en el archivo .cdx o .idx, delante de las entradas no NULL. Todos los valores NULL quedan, por lo tanto, al principio del índice.

El ejemplo siguiente muestra uno de los efectos de indizar valores NULL. Es el estado de la tabla antes de aplicar el índice:

Hay valores NULL en el campo SocSec de dos registros

El valor .NULL. en dos registros representa el hecho de que los números de seguridad social de Anne Dunn y Alan Carter son desconocidos o no están disponibles. Puede crear un índice con el número SocSec, como en el ejemplo siguiente:

INDEX ON SocSec + LastName + FirstName TAG MyIndex

Al ver la tabla ordenada por este índice, el orden que se utiliza es el siguiente:

Al indizar por SocSec, los registros con valores NULL en SocSec aparecen en primer lugar

Cuando la expresión de índice contiene valores NULL, los registros cuyo valor de SocSec es .NULL. se colocan primero, ordenados por LastName, y a continuación se colocan los registros cuyos valores de SocSec no son NULL. Observe que hay dos entradas para Alan Carter. Como el registro 5 contiene un valor NULL, se indiza antes que el registro 2.

Indizar por expresiones complejas

También puede crear índices basados en expresiones más complejas. Las expresiones de clave de índice de Visual FoxPro pueden contener funciones de Visual FoxPro, constantes o funciones definidas por el usuario.

La expresión que cree debe ofrecer como resultado no más de 100 caracteres en el caso de índices autónomos (.idx) o de 240 caracteres para las etiquetas de índice .cdx. Puede utilizar campos de tipos de datos diferentes en una sola etiqueta, convirtiendo los componentes individuales de la expresión en datos de tipo Character.

Para aprovechar la optimización Rushmore™, la expresión de índice debe cumplir exactamente los criterios.

Usar funciones de Visual FoxPro en una etiqueta de índice

Puede utilizar funciones de Visual FoxPro en las etiquetas de índice. Por ejemplo, puede utilizar la función STR( ) para convertir un valor numérico en una cadena de caracteres. Si desea crear una etiqueta de índice para la tabla customer que combine el campo cust_id con el campo maxordamt, puede convertir maxordamt de un campo Currency con ancho 8 en un campo de 8 caracteres con dos decimales, utilizando el código siguiente:

INDEX ON cust_id + STR(maxordamt, 8, 2) TAG custmaxord

Si desea reducir el tamaño de los índices para campos que contienen valores enteros, puede convertir los valores enteros en una representación de caracteres binarios con la función BINTOC( ). También puede convertir los valores binarios en valores enteros con la función CTOBIN( ).

Si desea crear un índice para ordenar una tabla en orden cronológico, puede utilizar la función DTOS( ) para convertir un campo de fecha en una cadena de caracteres. Para tener acceso a la tabla employee por hire_date y emp_id, puede crear la siguiente expresión de clave de índice:

INDEX ON DTOS(hire_date) + emp_id TAG id_hired

Incluir procedimientos almacenados o funciones definidas por el usuario

Para hacer más eficaz el índice puede hacer referencia en su expresión a un procedimiento almacenado o a una función definida por el usuario. Por ejemplo, puede utilizar un procedimiento almacenado o una FDU para extraer el nombre de la calle de un campo único que incluya además del nombre el número de la calle. Si el número de la calle es siempre numérico, el procedimiento almacenado o la FDU pueden devolver la parte de caracteres del campo y rellenar el resto con espacios hasta completar una clave de índice de longitud constante. A continuación puede utilizar esta clave de índice para tener acceso a los registros de la tabla ordenados por el nombre de calle.

Puede ser preferible utilizar un procedimiento almacenado en lugar de una FDU en las etiquetas de índice, si la tabla está asociada a una base de datos. Como las FDU se almacenan en archivos independientes de la base de datos, puede mover o eliminar el archivo de la FDU, lo que hará que la etiqueta que hace referencia a la misma deje de ser válida. El código de los procedimientos almacenados, por el contrario, se almacena en el archivo .dbc y Visual FoxPro puede encontrarlo siempre.

Otra ventaja de los procedimientos almacenados en las etiquetas de índice es que la referencia a un procedimiento almacenado garantiza que el índice se basará en el código especificado. Si utiliza una FDU en la expresión de índice, se usará en la indización toda FDU que se encuentre al alcance en ese momento y que tenga el mismo nombre que la FDU a la que hace referencia el índice.

Nota   Tenga cuidado al hacer referencia a un procedimiento almacenado o una FDU en una expresión de índice, ya que el tiempo necesario para crear o actualizar el índice aumentará.

Usar datos de un campo en otra tabla

Puede crear una etiqueta de índice que haga referencia a una tabla abierta en otra área de trabajo. Lo mejor es utilizar un índice autónomo (.idx) para las etiquetas que hagan referencia a más de una tabla. Esto se debe a que si se incluye una etiqueta de este tipo en un archivo .cdx estructural, Visual FoxPro no permitiría abrir la tabla hasta que esté abierta la tabla referenciada en la etiqueta de índice.

Vea también

Eliminar un índice | Acceso a los registros en orden descendente | Trabajar con registros | STR( ) | BINTOC( ) | Filtrar datos | Crear un índice | Crear múltiples índices | Ordenar por múltiples campos | Crear índices para tablas