Saltar al contenido principal
Al crear un elemento de grupo, la casilla Optional element está desmarcada de forma predeterminada; es decir, el elemento es obligatorio. Durante el emparejamiento de FlexiLayout, se genera una hipótesis no nula para un elemento de grupo obligatorio, incluso si se generan hipótesis nulas para todos sus subelementos. Para comprobar las propiedades de los subelementos de una hipótesis de este tipo, llame al código en sus secciones Advanced. Si el elemento de grupo es opcional, puede generarse para él una hipótesis nula (si no hay hipótesis no nulas con una calidad superior a la de una hipótesis nula). No se recomienda marcar la casilla Optional element para elementos de grupo. Esto se debe a que, si el elemento de grupo es Optional element y no se detecta (su calidad es inferior a la calidad de una hipótesis nula, o se llama para él a la función Dontfind()), cualquier llamada a cualquiera de sus subelementos provocará errores, porque en un grupo con una hipótesis nula no se generan hipótesis para los subelementos. Para evitar este error, primero debe comprobar el elemento de grupo. Si la comprobación IsNull devuelve True, no debe hacer referencia a ninguno de los subelementos. Entonces, ¿por qué necesitamos un elemento de grupo opcional y su hipótesis nula? Se necesita cuando todo el grupo de campos no está presente en la imagen. En ese caso, no tiene sentido buscarlos. Además, la búsqueda de los elementos puede acelerarse llamando al método DontFind() para el elemento de grupo.
Por “call” nos referimos a escribir código en cualquiera de las secciones de la pestaña Advanced o en las propiedades del bloque de la ventana Expression. Si se llama a las propiedades de un elemento de grupo al establecer las restricciones de búsqueda en Relations, la comprobación IsNull se realiza automáticamente. Puede verlo si hace clic en Code en la pestaña Advanced.
Para ilustrarlo, creamos el proyecto GroupSample.fsp (carpeta %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group). En el cuadro de diálogo de propiedades del elemento de grupo InvoiceRequisiteGroup, marcamos la casilla Optional element. En la pestaña Advanced, en la sección relación avanzada de prebúsqueda, escribimos el siguiente código: if FormID.IsNull then Dontfind(); A continuación, comprobamos la presencia del elemento que identifica el tipo de documento. Mediante el elemento FormID, creado antes del elemento de grupo InvoiceRequisiteGroup, buscamos el texto estático con un valor conocido (“ID2015”). Si el valor del identificador del documento coincide con el valor especificado en la sección Search text, se genera una hipótesis no nula para el elemento FormID. De lo contrario, el texto estático FormID no se detecta e indicamos al programa que no busque el elemento de grupo InvoiceRequisiteGroup; es decir, creamos una hipótesis nula para el elemento de grupo opcional InvoiceRequisiteGroup. En el proyecto hay un elemento TotalSumHeader que se utiliza para buscar el nombre del campo de suma. Para este elemento, se introduce el siguiente código en la sección relación avanzada de prebúsqueda: Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot; Este código significa que la búsqueda del nombre se ejecutará debajo del campo de fecha descrito por el elemento InvoiceDateHeader, que, a su vez, es un subelemento del elemento de grupo InvoiceRequisiteGroup. Ejecutemos el procedimiento de emparejamiento de FlexiLayout en ambas páginas del lote. En la página 1, el procedimiento se completó correctamente, pero al intentar aplicar FlexiLayout a la página 2, el programa muestra el siguiente mensaje de error: “Page 2: Error in element “SearchElements.TotalSumHeader”, Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup”. Esto sucede porque en la página 2 el valor del identificador del documento es ID 2589. Dado que este valor es distinto del especificado en las propiedades del elemento FormID, la función Dontfind() para el elemento de grupo InvoiceRequisiteGroup generó una hipótesis nula. Por lo tanto, en el código se llamó a una hipótesis inexistente. El código correcto debe verse así. if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then { Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
Si comenta el código en la sección relación avanzada de prebúsqueda y activa la marca junto a la restricción de búsqueda similar del elemento TotalSumHeader en la sección Relations, al hacer clic en Code en la pestaña Advanced verá que el código compilado ya contiene la comprobación IsNull.