> ## 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.

# Scripts de ejemplo para crear reglas personalizadas

> Código de ejemplo de VBScript, JScript y C# para reglas personalizadas de FlexiCapture: comprobaciones de datos en una tabla, búsquedas en listas de valores, grupos de marcas de verificación y análisis de direcciones.

Este artículo ofrece scripts de ejemplo para escenarios habituales de reglas personalizadas en ABBYY FlexiCapture. Cuando corresponde, cada ejemplo incluye una versión en VBScript y otra en JScript.

<div id="automation-rule">
  ## Regla de automatización
</div>

Este ejemplo muestra una comprobación de datos en una tabla. La regla comprueba si los datos de la tabla coinciden con el valor del campo resultante. La tabla tiene columnas con precios y cantidades de productos. La regla está escrita en una sección que contiene la tabla y el campo resultante.

<CodeGroup>
  ```vb VBScript theme={null}
  dim autoRule
  set autoRule = CreateObject( "AutomationRule.CheckDoc" )
  autoRule.CheckResult me.FIELD("cost"), me.FIELD("number"), me.FIELD("Result"), me
  ```

  ```javascript JScript theme={null}
  var autoRule = new ActiveXObject( "AutomationRule.CheckDoc" );
  autoRule.CheckResult( Field("cost"), Field("number"),
      Field("Result"), this );
  ```
</CodeGroup>

<div id="code-of-an-activex-component">
  ### Código de un componente ActiveX
</div>

El siguiente código corresponde a la clase `CheckDoc` del proyecto `AutomationRule`, utilizada en los scripts anteriores.

```vb theme={null}
Option Explicit

' Comprueba si los datos de la tabla coinciden con el resultado
' column1 - columna de precio
' column2 - columna de cantidad
' resultField - campo resultante (<Total> o equivalente)
' docObj - nodo de documento que se está comprobando
Public Sub CheckResult(ByRef column1 As Object, ByRef column2 As Object, _
ByRef resultField As Object, ByRef docObj As Object)
On Error GoTo err_h
Dim costItems AsObject, numItems AsObject
Dim curCost AsDouble, curNum AsLong, sum AsDouble
Dim result AsDouble
Dim i AsLong
Set costItems = column1.Items
Set numItems = column2.Items
' suma de los datos de la tabla
    sum = 0
For i = 0 To costItems.Count - 1
        curCost = costItems.Item(i).Value
        curNum = numItems.Item(i).Value
        sum = sum + curNum * curCost
Next
   ' resultado de la comparación redondeado al 2.º decimal
    result = resultField.Value
If (Round(result, 2) = Round(sum, 2)) Then
        docObj.CheckSucceeded = True
Else
        docObj.CheckSucceeded = False
docObj.ErrorMessage = "Table data does not match the resulting value"
        resultField.Suggest sum
   End If
Exit Sub
err_h:
docObj.ErrorMessage = Err.Description
    docObj.CheckSucceeded = False
End Sub
```

<div id="search-in-the-variants-list">
  ## Buscar en la lista de variantes
</div>

Esta regla comprueba si el valor del campo coincide con uno de los valores de una lista. Si no es así, aparece un indicador de error de regla y se asigna al campo una lista de valores sugeridos. Según el resultado de la comprobación, el campo se marca como reconocido con confianza o sin ella.

<CodeGroup>
  ```vb VBScript theme={null}
  'guardar el valor del campo
  Dim fieldValue
  fieldValue = me.Field("Field6").Value
  'crear una lista de valores para la comprobación
  Dim list(5)
  dim i
  for i = 0 to 4
      list(i) = "2" & i
  next
  dim success
  success = false
  'comprobar si el valor del campo coincide con los valores de la lista
  for i = 0 to 4
  if list(i) = fieldValue Then
          success = true
          exit for
  end if
  next
  'según el resultado de la comprobación, establecer el estado de certeza correspondiente para el campo
  me.Field("Field6").IsVerified = success
  'rellenar la lista de sugerencias del campo; una sugerencia puede ser cualquiera de los
  'valores adecuados
  if success = false then
      for i = 0 to 4
  me.Field("Field6").Suggest( list(i) )
      next
  end if
  'establecer un indicador de error
  me.CheckSucceeded = success
  ```

  ```javascript JScript theme={null}
  // guardar el valor del campo
  var fieldValue = Field("Field6").Value;
  // crear una lista de valores para la comprobación
  var list = new Array(5);
  for( i = 0; i < 5; i++ ) {
      list[i] = "2" + i
  }
  var success = false;
  // comprobar si el valor del campo coincide con los valores de la lista
  for( i = 0; i < 5; i++ ) {
  if( list[i] == fieldValue ) {
          success = true;
          break;
  }
  }
  // según el resultado de la comprobación, establecer el estado de certeza correspondiente para el campo
  Field("Field6").IsVerified = success;
  // rellenar la lista de sugerencias del campo; una sugerencia puede ser cualquiera de los
  // valores adecuados
  if( !success ) {
  for( i = 0; i < 5; i++ ) {
          Field("Field6").Suggest( list[i] );
      }
  }
  // establecer un indicador de error
  CheckSucceeded = success;
  ```
</CodeGroup>

<div id="field-match-check">
  ## Comprobación de coincidencia de campo
</div>

Esta regla comprueba si el campo ha sido emparejado.

<CodeGroup>
  ```vb VBScript theme={null}
  if me.Field("InvoiceNumber").IsMatched then
   me.CheckSucceeded = true
  else
   me.CheckSucceeded = false
   me.ErrorMessage = "Field InvoiceNumber is not matched"
  end if
  ```

  ```javascript JScript theme={null}
  if( Field("InvoiceNumber ").IsMatched ) {
   CheckSucceeded = true;
  } else {
  CheckSucceeded = false;
   ErrorMessage = "Field InvoiceNumber is not matched";
  }
  ```
</CodeGroup>

<div id="checkmark-check">
  ## Comprobación de marca de verificación
</div>

Esta regla comprueba si la marca de verificación está seleccionada.

<CodeGroup>
  ```vb VBScript theme={null}
  if me.Field("Page status").Value then
      me.CheckSucceeded = true
  else
      me.CheckSucceeded = false
      me.ErrorMessage = "Page status is not checked"
    me.FocusedField = me.Field(Page status)  ""
  end if
  ```

  ```javascript JScript theme={null}
  if( Field("Page status").Value ) {
      CheckSucceeded = true;
  } else {
  CheckSucceeded = false;
      ErrorMessage = "Page status is not checked";
      FocusedField = Field("Page status");
  }
  ```
</CodeGroup>

<div id="checkmark-group-check">
  ## Comprobación del grupo de marcas de verificación
</div>

Esta regla recorre todas las marcas de verificación del grupo y, si ninguna está seleccionada, selecciona la primera. La regla está escrita para el nivel del grupo de marcas de verificación. Todas las marcas de verificación del grupo se han agregado a la lista de campos incluidos en la regla, y el propio grupo se ha excluido de la lista. Para la marca de verificación predeterminada (la primera), se ha deshabilitado la marca `ReadOnly`. Si no hay marcas de verificación en el grupo, se activa un indicador de error de regla.

Este ejemplo recorre todos los campos incluidos en la regla. Como no se especifican nombres de campos, el código puede usarse para cualquier grupo de marcas de verificación.

<CodeGroup>
  ```vb VBScript theme={null}
  if me.Fields.Count = 0 then
      me.CheckSucceeded = false
      me.ErrorMessage = "There are no checkmarks in the group"
  else
      dim isChosen, i
      isChosen = false
  for i = 0 to me.Fields.Count - 1
         if me.Fields.Item( i ).Value then
              isChosen = true
              exit for
  end if
  next
  if Not isChosen then
          me.Fields.Item(0).Value = true
      end if
  me.CheckSucceeded = true
  end if
  ```

  ```javascript JScript theme={null}
  if( Fields.Count == 0 ) {
      CheckSucceeded = false;
      ErrorMessage = "There are no checkmarks in the group";
  } else {
      var isChosen = false;
      var i;
  for( i = 0; i < Fields.Count; i++ ) {
          if( Fields.Item( i ).Value ) {
              isChosen = true;
              break;
  }
  }
  if( !isChosen ) {
          Fields.Item(0).Value = true;
      }
  CheckSucceeded = true;
  }
  ```
</CodeGroup>

<div id="field-reliability-check">
  ## Comprobación de fiabilidad del campo
</div>

Esta regla comprueba cuántos caracteres dudosos hay en el campo y lo borra si ese número es de tres o más. Se trata de un script de autocorrección.

<CodeGroup>
  ```vb VBScript theme={null}
  Dim totQty, suspQty
  Dim i
  totQty = me.Symbols.Count
  suspQty = 0
  for i = 0 to totQty - 1
    if me.Symbols.Item(i).IsSuspicious = true then
      suspQty = suspQty + 1
    end if
  next
  if suspQty >= 3 then
    me.Text = ""
  end if
  ```

  ```javascript JScript theme={null}
  var susp, qty, strpos, i, SC, strposPrev
  strposPrev = 1
  qty = 0
  SC = "1"
  susp = SuspiciousSymbols
  for ( i = 0; i < susp.length; i++) {
      strpos = susp.indexOf (SC,i)
  if ((strpos != strposPrev) && (strpos != -1)) {
        qty = qty + 1
        strposPrev = strpos
      }
  }
  if (qty >= 3) {
    text = ""
  }
  ```
</CodeGroup>

<div id="character-replacement-without-losing-regions-and-verification-flags">
  ## Reemplazo de caracteres sin perder regiones ni indicadores de verificación
</div>

El script reemplaza `+` por `&` sin perder información sobre las regiones ni los indicadores de verificación. Este es un script de autocorrección.

```vb theme={null}
Dim totQty
Dim i
totQty = me.Symbols.Count
for i = 0 to totQty - 1
if me.Symbols(i).Symbol = "+" then
    me.Symbols(i).Symbol = "&"
end if
next
```

<div id="batch-integrity-check">
  ## Comprobación de integridad del lote
</div>

Comprueba si el número de documentos especificado en la página de control coincide con el inventario del lote y con la cantidad de documentos realmente procesados. Si las cantidades no coinciden, se devuelve un error.

<CodeGroup>
  ```vb VBScript theme={null}
  dim DQty
  dim i
  for i = 0 to me.Batch.Documents.Count - 1
    if me.Batch.Documents.Item(i).DefinitionName = "Inv" then
      DQty = me.Batch.Documents.Item(i).IndexedItemValue("DocQty")
      exit for
  end if
  next
  dim AcQty
  AcQty = me.Batch.Documents.Count
  if acqty <> DQty then
    me.CheckSucceeded = false
    me.ErrorMessage = "Incorrect number of documents in the batch:" & " " & AcQty& ". " & "Expected number:" & " " & DQty & "!"
  end if
  ```

  ```javascript JScript theme={null}
  for ( i = 0; i < [Batch.Documents.Count - 1]; i++ ) {
  var TemplName = Batch.Documents.Item(0).DefinitionName;
    if (TemplName = "Inv") {
      var DQty = Batch.Documents.Item(i).IndexedItemValue("DocQty");
      break ;
  }
  }
  var AcQty = Batch.Documents.Count -1
  if (AcQty != DQty) {
      CheckSucceeded = false;
      ErrorMessage = "Incorrect number of documents in the batch:" + " " + AcQty + "." + "Expected number:" + " " + DQty +"!" ;
  }
  ```
</CodeGroup>

<div id="counting-the-number-of-documents-and-pages-in-a-document-set">
  ## Recuento de documentos y páginas en un conjunto de documentos
</div>

Este script cuenta cuántos documentos y páginas hay en un conjunto de documentos y genera un error si el conjunto contiene un elemento de tipo Unknown.

```csharp theme={null}
int subDocumentsCount = 0;
int pagesCount = 0;
IBatchItem asBatchItem = Context.Document.AsBatchItem;
IBatchItems items = asBatchItem.ChildItems;
foreach (IBatchItem item in items)
{
if ( item.Type == TBatchItemType.BIT_Page )
{   pagesCount ++;  }
else if( item.Type == TBatchItemType.BIT_Document )
{   subDocumentsCount ++; }
else
{
Context.CheckSucceeded = false;
Context.ErrorMessage = "Unknown type of element in set";
}
}
Context.Field("Field").Text = subDocumentsCount.ToString() + " " + pagesCount.ToString();
```

<div id="address-parsing">
  ## Análisis de direcciones
</div>

El script descompone la dirección en los siguientes componentes: código postal, país, ciudad y calle. Se ejecuta sobre una parte del campo de origen.

```csharp theme={null}
//-----------------------------------------
var collectionName = "";
IFieldExtractor extractor = Context.GetFieldExtractor();
extractor.ParseAddress();
var city = extractor.ExtractedObjects( collectionName, "NerCity" );
var country = extractor.ExtractedObjects( collectionName, "NerCountry" );
var zip = extractor.ExtractedObjects( collectionName, "NerZipCode" );
var street = extractor.ExtractedObjects( collectionName, "NerStreet" );
for( var i = 0; i < city.Count; i++ ) {
extractor.PutSpanToField( city.Item(i).Span, Context.Field("City") );
}
for( var i = 0; i < country.Count; i++ ) {
extractor.PutSpanToField( country.Item(i).Span, Context.Field("Country") );
}
for( var i = 0; i < zip.Count; i++ ) {
extractor.PutSpanToField( zip.Item(i).Span, Context.Field("ZIP") );
}
for( var i = 0; i < street.Count; i++ ) {
extractor.PutSpanToField( street.Item(i).Span, Context.Field("Street") );
}
//-------------------------------------
```
