> ## 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** aparece a la derecha del nombre del campo; en otros, aparece debajo del nombre. En los documentos 1 y 2, los datos del campo se encuentran directamente debajo del nombre.

<div id="create-the-invoicenumber-element">
  ## Cree el elemento InvoiceNumber
</div>

<Steps>
  <Step title="Crear el elemento Cadena de caracteres">
    En el elemento **InvoiceHeader**, cree un elemento [cadena de caracteres](/es/flexi-capture/fls/template/character-chain) y asígnele el nombre **InvoiceNumber**.

    <Tip>
      El nombre del elemento no tiene por qué coincidir con el del bloque correspondiente al campo **InvoiceNumber**. Sin embargo, es conveniente que tengan el mismo nombre al trabajar con un FlexiLayout.
    </Tip>
  </Step>

  <Step title="Especifique el alfabeto">
    Haga clic en la pestaña **Cadena de caracteres** y especifique el alfabeto:

    `-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`
  </Step>

  <Step title="Establezca el porcentaje de caracteres ajenos al alfabeto">
    Establezca el **Porcentaje de caracteres no alfabéticos** en 30 %.
  </Step>

  <Step title="Establezca el número de caracteres">
    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 valores posibles estén comprendidos entre 3 y 20 caracteres. Se penaliza cualquier hipótesis fuera de este intervalo.
  </Step>

  <Step title="Excluya la región kwInvoiceDate">
    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 FlexiLayout Studio no incluya este texto entre las hipótesis del campo **Número de factura**:

    * En la pestaña **Search Constraints**, haga clic en **Add...** junto al campo **Exclude regions of elements**.
    * Seleccione **kwInvoiceDate** en 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 Character String InvoiceNumber en ABBYY FlexiLayout Studio, que muestra el elemento kwInvoiceDate añadido 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>
  </Step>

  <Step title="Añadir relaciones previas a la búsqueda">
    Haga clic en la pestaña **Advanced**. En **relación avanzada 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: uno a la derecha del nombre y otro debajo de él, con un pequeño desplazamiento. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code):

    ```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 a un rectángulo situado 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 a un rectángulo situado debajo del nombre del campo InvoiceNumber.
    DataRegion = RectArray (r1);
    DataRegion.Add (r2);
    RestrictSearchArea (DataRegion);
    }
    ```
  </Step>

  <Step title="Añada relaciones posbúsqueda">
    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. Cuando los datos del campo están a la derecha del nombre, suele haber otro texto debajo del campo (en las imágenes de prueba, normalmente el nombre y los datos del campo **fecha**). Como este texto adicional se encuentra dentro del área de búsqueda del campo **Número de factura**, FlexiLayout Studio genera una hipótesis para él. Para influir en la calidad de esta hipótesis, especifique comprobaciones adicionales en el campo **Relaciones avanzadas de posbúsqueda**: cuanto más abajo se encuentre el texto respecto al nombre del campo, mayor será la penalización. En [FlexiLayout language](/es/flexi-capture/fls/code/general-code):

    ```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 borde superior del campo, mayor será la penalización de la hipótesis correspondiente. En este caso concreto, la hipótesis del element cuyo borde superior coincida con el borde superior del nombre tendrá la mayor calidad.
    ```
  </Step>

  <Step title="Pruebe el FlexiLayout">
    Excluya temporalmente el elemento **InvoiceFooter** y haga coincidir el FlexiLayout.
  </Step>

  <Step title="Establezca la región del bloque">
    Especifique la ubicación del bloque **InvoiceNumber** como la región rectangular del elemento **InvoiceNumber**, ampliada en 5 puntos tanto vertical como horizontalmente. Seleccione **Expression** e introduzca la siguiente expresión:

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