# Indice

Se trata de una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rápido acceso a los registros de una [tabla.]()\
Un índice puede estar compuesto por uno o varios [campos,](../../editores/asistente-de-formulas/campos) por fórmulas o por una combinación de ellos. A cada uno de estos componentes del índice se le llama **parte**.

Las propiedades de un índice son:

### **Identificador**

Etiqueta alfanumérica que identifica de forma unívoca un índice dentro de una tabla. Este identificador será el que usemos en [fórmulas](../../proyecto-de-aplicacion/formulario/controles-de-edicion/edicion-formula) y para referenciarlo en otras propiedades.

El identificador constará de mayúsculas y números exclusivamente. Al identificar de forma unívoca un campo de una tabla no puede haber duplicidad.

Para evitar pérdidas de información como resultado de cambiar el identificador de un índice se guarda el identificador antiguo del mismo. De esta forma, al ejecutar la aplicación de nuevo, se reconstruirá la tabla sin perder ningún dato.

Los identificadores **ID** y **NAME** son palabras reservadas. El identificador **ID** referencia el índice que es clave primaria de la tabla e identifica unívocamente cada registro. No debemos alterar este identificador si no queremos perder la funcionalidad implícita, aunque si podemos modificar sus descriptores, la propiedad **nombre**.

### **Nombre**

Etiqueta alfanumérica que servirá como descriptor del índice. Podemos definir una etiqueta por cada idioma presente en el [proyecto.](../..)

### **Estilos**

Podemos definir el estilo privado limita el acceso del usuario final al objeto desde puntos donde no se haya programado el acceso al mismo.

### **Comentarios**

Esta propiedad nos permite documentar el uso del índice.

### **Tipo de índice**

Esta propiedad nos permite definir de qué forma van a ser indexados los datos. Los tipos existentes son:

#### **Clave única**

No admite más que un registro con la misma clave.

#### **Palabras**

El registro es indexado por cada palabra encontrada en las partes que forman la clave. Por razones de optimización y rendimiento, solamente se indexarán los 9 primeros caracteres de cada palabra del campo o campos a indexar.

#### **Múltiples claves**

El registro es indexado desde cero claves hasta el número que el programador declare en la propiedad **número de claves**. El índice deberá estar compuesto al menos por tantos componentes como número de claves hayan sido declaradas. Si el [campo](../../editores/asistente-de-formulas/campos) o la fórmula de una clave está vacío, esa clave no será indexada. Los campos a indexar han de ser del mismo tipo y longitud.

Un ejemplo de uso es cuando en una tabla tenemos dos o más campos enlazados a una tabla maestra. Por ejemplo, en la ficha de un libro, el autor primero y el autor segundo, y nos interesa buscar libros de un autor, sin importar si es el autor primero o el segundo.

Crearemos un índice con múltiples claves cuyo primer componente será el campo enlazado al autor1 y cuyo segundo componente será el campo enlazado al autor2.

En la propiedad nº de claves del índice estableceremos un 2.

Si queremos que al buscar por dicho índice el resultado salga ordenado por el título del libro, por ejemplo, al índice le añadiremos el campo NAME de la tabla, pero el número de claves del índice seguirá siendo 2 (los enlaces a los autores).

#### **Acepta repetidas**

La ficha es indexada sólo una vez pero, al contrario que la clave única, se admiten repeticiones. El sistema le añade 4 bytes a la clave para diferenciar las repetidas.

**Trozos de palabras**

El registro es indexado por cada grupo de 3 ó más caracteres de cada una de las partes que forman la clave.

Los índices de palabras y de trozos de palabras hacen una conversión interna a Alfa40, si no hay correspondencia de un carácter entre la tabla de caracteres de origen y la de Alfa40, no lo indexará. Además, solamente existe la tabla Alfa40 para el alfabeto latino. Esto quiere decir que por este tipo de índices se indexarán caracteres latinos, pero no de otros alfabetos.

Indice de palabras y de trozos no indexan signos de puntuación.

Los campos de tipo objeto texto y objeto texto enriquecido pueden ser indexados en índices de tipo palabras y de trozos. En el caso de los campos de tipo objeto texto enriquecido, al indexarlos se quitan los tags html de su contenido; solamente indexa el texto.

### **Condición para indexar**

Esta propiedad permite establecer una condición para indexar el registro. Si la condición no se cumple, el registro no será indexado por ese índice. Si pulsamos el botón ![](https://3267112037-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F19d97ebf6e23848533d2ea97f346065799fdbae6.jpg?generation=1589374509676590\&alt=media) se abrirá el [asistente para edición de fórmulas](../../editores/asistente-de-formulas). En esta fórmula solamente podemos usar campos de la tabla actual, no se pueden usar campos de tablas enlazadas; si lo hacemos, el índice no será funcional.

{% hint style="warning" %}
Cuando se trate de un índice de un campo enlazado al maestro, **este índice no puede estar condicionado** ya que, si el índice está condicionado, no se podrá garantizar que el sistema apunte a todos los registros plurales de esta tabla desde su maestro.

Si no lo hacemos, podrá fallarnos la carga de plurales, la correcta regeneración de los índices complejos de la tabla en los que se indexe un campo del maestro, etc.

Si queremos crear un índice por dicho campo con algún tipo de condición, lo que haremos será duplicarlo y condicionar el duplicado.
{% endhint %}

### **Lista negra**

Esta propiedad aparecerá en el caso de que el índice sea de tipo **palabras**. Permite establecer una lista de las palabras que no serán indexadas por ese índice. Para escribir la lista pulsar el botón que aparece al editar el valor.

### **Número de claves**

Esta propiedad aparecerá en el caso de que el índice sea de tipo **múltiples claves**. En ella se indicarán el número de claves que conforman el índice.

### **Número de partes**

Indica el número de campos o fórmulas (partes) que componen la clave.

### **Longitud de la clave**

Indica la longitud total, en bytes, del índice.

## Partes índice

Un índice estará compuesto por una o más partes. Para crear una parte de un índice pulsar el botón ![](https://3267112037-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F4da36e371264fb731bc93f8e93cedd74ce03378c.png?generation=1589374033636246\&alt=media) de la barra de herramientas o abrir el menúObjetos, sub-menú Nuevo sub-objeto, opciónParte índice. Sus propiedades son:

### Identificador

Etiqueta alfanumérica que identifica al componente índice. Este identificador será el que usemos para referenciarlo en otras

propiedades.

### Nombre

Etiqueta alfanumérica que servirá como descriptor del componente.

### Estilos

Podemos definir los estilos:

#### Privado

que limita el acceso del usuario final a cierta información sobre esa parte del índice.

#### Heredable

Que permite que esa parte del índice sea usada cuando el proyecto sea [heredado](../../../herencia).

### Comentarios

Esta propiedad nos permite documentar el uso del componente del índice.

### Modo

Permite establecer de qué forma se indexará la parte. Los valores posibles son:

### Campo completo

La parte a indexar va a ser un campo y se indexará completo.

### Campo porción

La parte a indexar va a ser un campo pero va a indexarse solamente una porción del mismo.

### Fórmula

La parte a indexar va a ser una fórmula definible por el programador.

### Campo

Esta propiedad solamente estará disponible en el caso de que el **modo** sea **campo completo** o **Campo porción**. Solamente podremos seleccionar campos de la tabla actual que tengan persistencia en disco; es decir, no es posible ni indexar campos de tablas enlazadas ni indexar campos de tipo fórmula.

### Fórmula

Esta propiedad solamente estará disponible en el caso de que el **modo** sea **fórmula**. Esta propiedad permite establecer una fórmula, cuyo resultado será indexado. Si pulsamos el botón ![](https://3267112037-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M7D2zitZhY9szSsa5EK%2Fsync%2F19d97ebf6e23848533d2ea97f346065799fdbae6.jpg?generation=1589374509676590\&alt=media) se abrirá el asistente para edición de fórmulas. En esta fórmula solamente se permite usar campos de la tabla actual, no se permite usar campos de tablas enlazadas ni tampoco llamar a [funciones](../../de-aplicacion-y-datos/funcion), dado que ambas cosas mermarían el rendimiento.

### Longitud

Longitud, en bytes, que tendrá la parte a indexar.

Si el **modo** es **campo completo**, este valor no podrá ser modificado.

Si el **modo** es **campo porción**, en esta propiedad indicaremos el número de caracteres a indexar del campo.

Ejemplo: si el campo es alfabético de 35 bytes y esta valor lo establecemos a 12, esta parte indexará solamente los 12 primeros caracteres del mismo.

Si el **modo** es **fórmula**, en esta propiedad indicaremos 0 si queremos indexar la totalidad del resultado de la fórmula; en caso contrario indicaremos el número de caracteres a indexar del campo.

### Conversión

Si el **modo** es **campo porción** y el campo es de tipo alfabético (Alfa Latin-1, alfa UTF-16, alfa 256, alfa 128 o alfa 64); en esta propiedad podremos hacer una conversión de la parte a una tabla de caracteres inferior.Ejemplo: un campo de tipo alfa256 indexarlo convertido a alfa 64.

{% hint style="warning" %}
Si en un componente realizamos una conversión tendremos que modificar también la longitud que se indexará del mismo en función de la nueva tabla de caracteres.

Por ejemplo, si convertimos una parte de Alfa128 a alfa 64, dado que éste último cada cuatro caracteres que se introduzcan se comprimen en 3 grabado en disco, la longitud a indexar deberá ser un múltiplo de 3.

A continuación indicamos los múltiplos según el tipo de campo: alfa 128 múltiplo de 7, alfa 64 múltiplo de 3 y alfa 40 múltiplo de 2.
{% endhint %}

Si el **modo** es **fórmula** en esta propiedad podremos indicar al sistema de qué tipo será el dato resultante de la fórmula. Los tipos posibles son:

* **Número**: la parte del índice a indexar será un número.
* **Fecha**: la parte del índice a indexar será una fecha. En este caso la propiedad del componente **longitud** automáticamente será establecida a 3 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo fecha.
* **Hora**: la parte del índice a indexar será una hora. En este caso la propiedad del componente **longitud** automáticamente será establecida a 3 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo hora.
* **Tiempo**: la parte del índice a indexar será un dato de tipo tiempo. En este caso la propiedad del componente **longitud** automáticamente será establecida a 4 y no podrá ser modificada; pues es la longitud que tiene un dato de tipo tiempo.
* **Alfa 256**: la parte del índice a indexar será una cadena de tipo alfa 256.
* **Alfa 128**: la parte del índice a indexar será una cadena de tipo alfa 128.
* **Alfa 64**: la parte del índice a indexar será una cadena de tipo alfa 64.
* **Alfa 40**: la parte del índice a indexar será una cadena de tipo alfa 40.

### Decimales

Esta propiedad solamente es visible cuando el **modo** es **fórmula** y el valor de la **conversión** es **número**. Permite establecer el número de decimales que tendrá el número a indexar.

### Signo

Esta propiedad solamente es visible cuando el **modo** es **fórmula** y el valor de la **conversión** es **número**. Permite establecer si se va a contemplar o no el signo (positivo o negativo) del número a indexar.

En Velneo también existe la posibilidad de crear índices complejos, pero no se trata de un subobjeto de tabla, sino de un objeto visual independiente. Hacer clic [aquí](../indice-complejo) para acceder a la información sobre los mismos.
