Passer au contenu principal
Cet article présente des exemples de scripts pour des scénarios courants de règles personnalisées dans ABBYY FlexiCapture. Le cas échéant, chaque exemple comprend à la fois une version VBScript et une version JScript.

Règle d’automatisation

Cet exemple montre une vérification des données d’un tableau. La règle vérifie si les données du tableau correspondent à la valeur du champ de résultat. Le tableau comporte des colonnes contenant les prix et les quantités des articles. La règle est écrite au niveau d’une section contenant le tableau et le champ de résultat.
dim autoRule
set autoRule = CreateObject( "AutomationRule.CheckDoc" )
autoRule.CheckResult me.FIELD("cost"), me.FIELD("number"), me.FIELD("Result"), me
var autoRule = new ActiveXObject( "AutomationRule.CheckDoc" );
autoRule.CheckResult( Field("cost"), Field("number"),
    Field("Result"), this );

Code d’un composant ActiveX

Le code ci-dessous est celui de la classe CheckDoc du projet AutomationRule, utilisée dans les scripts ci-dessus.
Option Explicit

' Vérifie si les données du tableau correspondent au résultat
' column1 - colonne des prix
' column2 - colonne des quantités
' resultField - champ de résultat (<Total> ou équivalent)
' docObj - nœud de document en cours de vérification
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
' calcul de la somme des données du tableau
    sum = 0
For i = 0 To costItems.Count - 1
        curCost = costItems.Item(i).Value
        curNum = numItems.Item(i).Value
        sum = sum + curNum * curCost
Next
   ' résultat de la comparaison arrondi au 2e chiffre après la virgule
    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

Recherche dans la liste de variantes

Cette règle vérifie si la valeur du champ correspond à l’une des valeurs d’une liste. Si ce n’est pas le cas, un indicateur d’erreur de règle apparaît et une liste de valeurs suggérées est fournie pour le champ. Selon le résultat de la vérification, le champ est marqué comme reconnu avec confiance ou sans confiance.
'mémoriser la valeur du champ
Dim fieldValue
fieldValue = me.Field("Field6").Value
'créer une liste de valeurs pour la vérification
Dim list(5)
dim i
for i = 0 to 4
    list(i) = "2" & i
next
dim success
success = false
'vérifier si la valeur du champ correspond à l'une des valeurs de la liste
for i = 0 to 4
if list(i) = fieldValue Then
        success = true
        exit for
end if
next
'selon le résultat de la vérification, définir l'état de certitude correspondant pour le champ
me.Field("Field6").IsVerified = success
'remplir la liste des suggestions pour le champ ; une suggestion peut être l'une des
'valeurs appropriées
if success = false then
    for i = 0 to 4
me.Field("Field6").Suggest( list(i) )
    next
end if
'placer un indicateur d'erreur
me.CheckSucceeded = success
// mémoriser la valeur du champ
var fieldValue = Field("Field6").Value;
// créer une liste de valeurs pour la vérification
var list = new Array(5);
for( i = 0; i < 5; i++ ) {
    list[i] = "2" + i
}
var success = false;
// vérifier si la valeur du champ correspond à l'une des valeurs de la liste
for( i = 0; i < 5; i++ ) {
if( list[i] == fieldValue ) {
        success = true;
        break;
}
}
// selon le résultat de la vérification, définir l'état de certitude correspondant pour le champ
Field("Field6").IsVerified = success;
// remplir la liste des suggestions pour le champ ; une suggestion peut être l'une des
// valeurs appropriées
if( !success ) {
for( i = 0; i < 5; i++ ) {
        Field("Field6").Suggest( list[i] );
    }
}
// placer un indicateur d'erreur
CheckSucceeded = success;

Vérification de la correspondance du champ

Cette règle vérifie si le champ a été trouvé.
if me.Field("InvoiceNumber").IsMatched then
 me.CheckSucceeded = true
else
 me.CheckSucceeded = false
 me.ErrorMessage = "Le champ InvoiceNumber n'a pas été trouvé"
end if
if( Field("InvoiceNumber ").IsMatched ) {
 CheckSucceeded = true;
} else {
CheckSucceeded = false;
 ErrorMessage = "Le champ InvoiceNumber n'a pas été trouvé";
}

Vérification de la coche

Cette règle vérifie si la coche est sélectionnée ou non.
if me.Field("Page status").Value then
    me.CheckSucceeded = true
else
    me.CheckSucceeded = false
    me.ErrorMessage = "Page status n'est pas cochée"
  me.FocusedField = me.Field(Page status)  ""
end if
if( Field("Page status").Value ) {
    CheckSucceeded = true;
} else {
CheckSucceeded = false;
    ErrorMessage = "Page status n'est pas cochée";
    FocusedField = Field("Page status");
}

Vérification du groupe de coches

Cette règle parcourt toutes les coches du groupe et, si aucune n’est sélectionnée, sélectionne la première. Elle est écrite au niveau du groupe de coches. Toutes les coches du groupe ont été ajoutées à la liste des champs inclus dans la règle, et le groupe lui-même a été exclu de cette liste. Pour la coche par défaut (la première), l’indicateur ReadOnly a été désactivé. S’il n’y a aucune coche dans le groupe, un indicateur d’erreur de règle est activé. Cet exemple parcourt tous les champs inclus dans la règle. Comme les noms des champs ne sont pas spécifiés, le code peut être utilisé pour n’importe quel groupe de coches.
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
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;
}

Vérification de la fiabilité du champ

Cette règle vérifie le nombre de caractères incertains dans le champ et vide le champ si ce nombre est de trois ou plus. Il s’agit d’un script d’autocorrection.
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
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 = ""
}

Remplacement de caractères sans perdre les régions et les indicateurs de vérification

Le script remplace + par & sans perdre les informations sur les régions ni les indicateurs de vérification. Il s’agit d’un script d’autocorrection.
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

Contrôle de l’intégrité du lot

Vérifie si le nombre de documents indiqué sur la page de contrôle correspond à l’inventaire du lot ainsi qu’au nombre de documents réellement traités. Si les nombres ne correspondent pas, une erreur est renvoyée.
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
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 +"!" ;
}

Compter le nombre de documents et de pages dans un jeu de documents

Ce script compte le nombre de documents et de pages dans un jeu de documents et génère une erreur si le jeu contient un élément de type inconnu.
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();

Analyse d’adresse

Le script décompose l’adresse en composants suivants : code postal, pays, ville et rue. Il s’applique à une partie du champ source.
//-----------------------------------------
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") );
}
//-------------------------------------