> ## 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.4: campo Número de factura, elemento InvoiceNumber

> Capture el valor del Número de factura con un elemento InvoiceNumber de tipo cadena de caracteres, restringiendo el área de búsqueda mediante relaciones de prebúsqueda de FlexiLayout language.

En algunos documentos, el campo Número de factura se encuentra a la derecha del nombre del campo, mientras que en otros se encuentra debajo del nombre (en los documentos 1 y 2, los datos del campo aparecen directamente debajo del nombre).

Para crear un elemento InvoiceNumber:

1. En el elemento **InvoiceHeader**, cree un elemento de tipo cadena de caracteres y asígnele el nombre **InvoiceNumber**.

   <Tip>
     El nombre del elemento no tiene por qué coincidir con el nombre del bloque correspondiente al campo **InvoiceNumber**. Sin embargo, usar nombres idénticos resulta conveniente al trabajar con un FlexiLayout.
   </Tip>

2. Haga clic en la pestaña cadena de caracteres.

3. Especifique el alfabeto:
   -./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

4. Establezca Percentage of non-alphabet characters en 30%.

5. En el campo recuento de caracteres, especifique el intervalo difuso `{-1, 3, 20, INF}` para la longitud de la cadena de caracteres, suponiendo que los posibles valores estén en el rango de 3 a 20 caracteres. Cualquier hipótesis que quede fuera de este intervalo se penalizará.

6. En algunas imágenes, el área de búsqueda del campo **Número de factura** contiene el elemento **kwInvoiceDate** ya detectado. Excluya este elemento del área de búsqueda para que el programa no incluya este texto en sus hipótesis para el campo **Número de factura**:
   * En la pestaña **Search Constraints**, haga clic en el botón Add... situado junto al campo Exclude regions of elements.
   * Seleccione **kwInvoiceDate** de la lista de elementos.
   * Haga clic en **OK**. La cadena `SearchElements.InvoiceHeader.kwInvoiceDate` aparecerá en el campo Exclude regions of elements.

<Frame>
  <img src="https://mintcdn.com/abbyy/8aWHPAJyzWmTqglX/images/flexi-capture/fls/tutorial4_5_4.png?fit=max&auto=format&n=8aWHPAJyzWmTqglX&q=85&s=f75396d33e7d2b3b095a09fc446d3d3b" alt="Captura de pantalla de la pestaña Search Constraints de las propiedades del elemento InvoiceNumber de tipo cadena de caracteres en ABBYY FlexiLayout Studio, que muestra el elemento kwInvoiceDate agregado al campo Exclude regions of elements como SearchElements.InvoiceHeader.kwInvoiceDate." width="427" height="454" data-path="images/flexi-capture/fls/tutorial4_5_4.png" />
</Frame>

7. Haga clic en la pestaña Advanced.
8. En **Relaciones avanzadas de prebúsqueda**, especifique condiciones adicionales: si no se encuentra el nombre **kwInvoiceNumber**, no busque el campo **InvoiceNumber**; de lo contrario, especifique el área de búsqueda como un array de rectángulos: un rectángulo a la derecha del nombre y otro debajo del nombre con un pequeño desplazamiento. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code), esta condición puede escribirse de la siguiente manera:

   ```text theme={null}
   if kwInvoiceNumber.IsNull then Dontfind();
   else
   { WholeWordMOde: true;
   MaxGapInLine: 30dt;
   RectArray DataRegion;
   Let r1= Rect (kwInvoiceNumber.Rect.Right, kwInvoiceNumber.Rect.Top -20dt, kwInvoiceNumber.Rect.Right + 650dt, kwInvoiceNumber.Rect.Bottom + 50dt);
   // Limita el área de búsqueda con un rectángulo a la derecha del nombre del campo InvoiceNumber.
   Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom, kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt);
   // Limita el área de búsqueda con un rectángulo debajo del nombre del campo InvoiceNumber.
   DataRegion = RectArray (r1);
   DataRegion.Add (r2);
   RestrictSearchArea (DataRegion);
   }
   ```
9. El área de búsqueda del campo se limita a dos rectángulos: uno a la derecha del nombre del campo y otro debajo de este. Si los datos del campo están ubicados a la derecha del nombre del campo, a menudo hay otro texto debajo del campo (en las imágenes de prueba, normalmente se trata del nombre y los datos del campo de fecha). Dado que este texto adicional se incluirá en el área de búsqueda del campo **Número de factura**, el programa generará una hipótesis para este texto. Para influir en la calidad de esta hipótesis, especifique comprobaciones adicionales en el campo **Relaciones avanzadas de posbúsqueda**: cuanto más abajo esté el texto situado bajo el nombre del campo, mayor será la penalización. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code), esta condición puede escribirse de la siguiente manera:

   ```text theme={null}
   if not IsNull then
   { FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt;
   }
   // Cuanto mayor sea la distancia entre el nombre y el límite superior del campo, mayor será la penalización de la hipótesis correspondiente. En este caso concreto, la hipótesis del elemento cuyo límite superior coincide con el límite superior del nombre tendrá la mayor calidad.
   ```
10. Excluya temporalmente el elemento **InvoiceFooter** y ejecute la coincidencia del FlexiLayout.
11. Especifique la ubicación del bloque **InvoiceNumber** como una región rectangular del elemento **InvoiceNumber** ampliada en 5 dots en vertical y en horizontal. Para ello, seleccione Expression y escriba la siguiente expresión:

    ```text theme={null}
    Rect outputRect;
    outputRect = InvoiceHeader.InvoiceNumber.Rect;
    IsNull = InvoiceHeader.InvoiceNumber.IsNull;
    // Trata la región del bloque como detectada si se ha detectado el elemento InvoiceNumber.
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);
    ```
