> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Ejemplo 4. Paso 5.5: campo Fecha de la factura, elementos grDate, InvoiceDate e InvoiceDateAsString

> Paso 5.5 del Ejemplo 4 de FlexiLayout Studio: capture el campo Fecha de la factura con un grupo grDate, un elemento Date y una alternativa de cadena de caracteres para escaneos de baja calidad.

Una vez que haya examinado las imágenes, observará que:

* En algunos documentos, el campo **Fecha de la factura** se encuentra a la derecha del nombre del campo, mientras que en otros aparece debajo. Por lo tanto, limite el área de búsqueda a rectángulos situados a la derecha y debajo del nombre.
* Use un elemento **Date** para buscar la fecha. Además, especifique la siguiente condición: si no se detecta el nombre del campo, no se buscarán los datos del campo.
* Con bastante frecuencia, las fechas pueden reconocerse de forma poco fiable. Esto puede deberse a defectos de escaneo, formatos de fecha no válidos, etc. Por lo tanto, especifique un elemento adicional de cadena de caracteres por si el elemento Date no encuentra ninguna fecha.

Para especificar la configuración común a todos los elementos, cree un elemento de tipo Group.

Para crear un elemento grDate de tipo Group:

1. En el elemento **InvoiceHeader**, cree un elemento de tipo **Group** y asígnele el nombre **grDate**.
2. Haga clic en la pestaña Advanced y especifique restricciones de búsqueda adicionales: limite el área de búsqueda al array de rectángulos compuesto por un rectángulo a la derecha del nombre del campo y otro rectángulo debajo del nombre del campo con cierto desplazamiento. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code) esta restricción puede escribirse de la siguiente manera:

   ```text theme={null}
   RectArray DataRegion;
   Let r1= Rect (kwInvoiceDate.Rect.Right, kwInvoiceDate.Rect.Top -20dt, kwInvoiceDate.Rect.Right + 650dt, kwInvoiceDate.Rect.Bottom + 50dt);
   Let r2 = Rect (kwInvoiceDate.Rect.Left - 150dt, kwInvoiceDate.Rect.Bottom, kwInvoiceDate.Rect.Right + 100dt, kwInvoiceDate.Rect.Bottom + 100dt);

   DataRegion = RectArray (r1);
   DataRegion.Add (r2);
   RestrictSearchArea (DataRegion);
   ```

Para crear un elemento InvoiceDate:

1. En el elemento `InvoiceHeader.grDate`, cree un elemento de tipo Date y asígnele el nombre **InvoiceDate**.
2. Haga clic en la pestaña Date.
3. Especifique todos los formatos de fecha posibles para el elemento **InvoiceDate**:

<Frame>
  <img src="https://mintcdn.com/abbyy/8aWHPAJyzWmTqglX/images/flexi-capture/fls/tutorial4_5_5.png?fit=max&auto=format&n=8aWHPAJyzWmTqglX&q=85&s=120c6fe9aa8f4c54bc3f09b0a679212a" alt="Captura de pantalla de la pestaña Date de las propiedades del elemento InvoiceDate en ABBYY FlexiLayout Studio, que muestra la lista de formatos de fecha especificados para el campo Fecha de la factura." width="431" height="455" data-path="images/flexi-capture/fls/tutorial4_5_5.png" />
</Frame>

4. En algunas imágenes, el área de búsqueda del campo **Fecha de la factura** incluirá los elementos **kwInvoiceNumber** e **InvoiceNumber** ya detectados. Para evitar que el programa considere los valores de estos elementos como hipótesis para el campo **Fecha de la factura**, excluya estos elementos del área de búsqueda:
   * Haga clic en el botón Add... situado junto al campo Exclude regions of elements.
   * Seleccione **kwInvoiceNumber** en la lista de elementos.
   * Haga clic en **OK**. La cadena `SearchElements.InvoiceHeader.kwInvoiceNumber` aparecerá en el campo Exclude regions of elements.

Repita estas acciones para el elemento `SearchElements.InvoiceHeader.InvoiceNumber`.

5. Haga clic en la pestaña Advanced.
6. El campo **Fecha de la factura** no es un elemento obligatorio. Sin embargo, si un documento contiene una fecha (en el campo **Fecha de la factura**), siempre tendrá el nombre de campo correspondiente en el documento (descrito anteriormente por el elemento **kwInvoiceDate**). Por lo tanto, puede especificar una condición de búsqueda adicional en **relación avanzada de prebúsqueda**: Busque el objeto de imagen solo si se ha detectado **kwInvoiceDate**. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code), esta condición puede escribirse de la siguiente manera:

   ```text theme={null}
   If InvoiceHeader.kwInvoiceDate.IsNull
   Then DontFind();
   ```
7. Excluya temporalmente el elemento **InvoiceFooter** y ejecute la coincidencia de FlexiLayout.

Para imágenes de baja calidad, cuando los resultados del reconocimiento no se ajustan a ninguno de los parámetros estándar del elemento Date, agregue un elemento alternativo que use condiciones menos estrictas para buscar el campo Fecha de la factura.

Para crear un elemento InvoiceDateAsString:

1. En el elemento `InvoiceHeader.grDate`, cree un elemento de tipo cadena de caracteres y asígnele el nombre **InvoiceDateAsString**.
2. Haga clic en la pestaña cadena de caracteres.
3. Especifique el alfabeto:
   ,-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
4. Establezca el porcentaje de caracteres no pertenecientes al alfabeto en un 30 %.
5. En el campo recuento de caracteres, especifique el intervalo difuso `{-1, 8, 14, INF}` para la longitud de la cadena de caracteres, asumiendo que los posibles valores están en el rango de 8 a 14 caracteres. Cualquier hipótesis fuera de este intervalo se penalizará.
6. Establezca Max space length en 20. Esto limita la longitud máxima del espacio en la cadena de texto a 20 puntos.
7. Para las demás propiedades del elemento, mantenga la configuración predeterminada.
8. Haga clic en la pestaña Advanced.
9. Dado que el elemento **InvoiceDateAsString** debe buscarse solo si el elemento **InvoiceDate** no se detecta en la imagen, especifique la siguiente condición en el campo **relación avanzada de prebúsqueda**: busque el objeto de imagen solo si el elemento **InvoiceDate** no se detecta. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code), esta condición puede escribirse de la siguiente manera:

   ```text theme={null}
   If Not InvoiceDate.IsNull Then DontFind;
   ```
10. Especifique una condición adicional para **InvoiceDate**, similar a la anterior: busque el objeto de imagen solo si se ha detectado el elemento **kwInvoiceDate**. Busque el objeto de imagen más cercano al elemento **kwInvoiceDate**. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code), esta condición puede escribirse de la siguiente manera:

    ```text theme={null}
    If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
    Nearest: InvoiceHeader.kwInvoiceDate;
    ```
11. Especifique la ubicación del bloque **InvoiceDate** como la región rectangular del elemento **InvoiceDate** o **InvoiceDateAsString** detectado, ampliada en 5 puntos vertical y horizontalmente. Para ello, seleccione la opción Expression y escriba la siguiente expresión:

    ```text theme={null}
    Rect outputRect;
    if not InvoiceHeader.grDate.InvoiceDate.IsNull then
    outputRect = InvoiceHeader.grDate.InvoiceDate.Rect;
    else
    { outputRect = InvoiceHeader.grDate.InvoiceDateAsString.Rect;
    IsNull = InvoiceHeader.grDate.InvoiceDateAsString.IsNull;
    }
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);
    ```
