Formulario dinámico V

•mayo 23, 2012 • Dejar un comentario

Ejemplo de campos dinámicos. Añadir campos según una estructura fija. Con operaciones matemáticas.

Vista del formulario en PDF.

Después de bastante tiempo, vamos a incluir una nueva entrada para contestar a una duda que nos planteaban en Formularios Dinámicos IV. Se trata de hacer una tabla en la que podamos incluir unos datos fijos y que nos haga una operación de multiplicación. En este caso serían unos conceptos con un precio unitario y que nos calcule el precio total al meter en cada campo diferentes cantidades del producto.

Para ello tomamos de base el ejemplo de Formularios Dinámicos IV. Pero os pongo otro modo de hacerlo, metiendo el siguiente script en el subformulario «details».

form1.purchaseOrder.details.detail::indexChange - (JavaScript, both) //{{Adobe LiveCycle Designer Generated Code Begin}} - row shading script. Don't modify it! var Freqs=[1,1]; var Colors=["240,240,240","255,255,255"]; var nFreqSize = 0; for (var i=0; i<Freqs.length; i++)   nFreqSize += Freqs[i]; var nRelIndex = this.index % nFreqSize + 1; for (var nRun=0; nRun<Freqs.length; nRun++) {    if (nRelIndex>Freqs[nRun])    {         nRelIndex -= Freqs[nRun];    }    else    {       this.border.fill.color.value = Colors[nRun];       break;    } } //{{Adobe LiveCycle Designer Generated Code End}} - row shading script.  form1.purchaseOrder.details.detail.Button2::click - (JavaScript, client) // Invoke the Instance Manager to remove the current instance of the detail subform. _detail.removeInstance(this.parent.index); // Invoke the recalculate method to update the form calculations. xfa.form.recalculate(1);  form1.purchaseOrder.details.detail.numQty::validate - (JavaScript, client) (this.rawValue >= 0 && this.rawValue  < 1000);  form1.purchaseOrder.details.detail.numAmount::calculate - (FormCalc, client) numQty * numUnitPrice  form1.purchaseOrder.details.total.totals.numTotal::calculate - (FormCalc, client) // Verify at least one instance of the numAmount field exists. if (exists(detail[0].numAmount) == 1) then     Sum(detail[*].numAmount) endif
A continuación os incluyo los scripts para los distintos campos. Para el botón, para eliminar filas de datos «Button2»:
 form1.purchaseOrder.details.detail.Button2::click - (JavaScript, client)
// Invoke the Instance Manager to remove the current instance of the detail subform.

_detail.removeInstance(this.parent.index);

// Invoke the recalculate method to update the form calculations.
xfa.form.recalculate(1);
En el campo Cantidad («NumQty»):
 form1.purchaseOrder.details.detail.numQty::validate - (JavaScript, client)
(this.rawValue >= 0 && this.rawValue  < 1000);
En el campo Total («NumAmount»):
 form1.purchaseOrder.details.detail.numAmount::calculate - (FormCalc, client)
numQty * numUnitPrice
En el campo Total («NumTotal»):
 form1.purchaseOrder.details.total.totals.numTotal::calculate - (FormCalc, client)
// Verify at least one instance of the numAmount field exists.
if (exists(detail[0].numAmount) == 1) then
    Sum(detail[*].numAmount)
endif
Para incluir el precio fijo en su casilla correspondiente, tenemos que seleccionarlo y en la ventana Objeto/Valor, elegiremos el Tipo Protegido y en Predeterminado, el valor que queramos tener como fijo. Hay que tener en cuenta, en la ventana Objeto/Celda, poner la Configuración regional del país en el que estemos, para que el valor sea en la moneda que queremos.
Os dejo el formulario en PDF de este ejemplo.

Distribuir con Acrobat 9 (I)

•enero 9, 2009 • Dejar un comentario

A diferencia de lo que sucede con Acrobat 8, donde al Distribuir un formulario que no contiene un botón de enviar por correo electrónico, lo único que nos dice es que debería tenerlo, pero nos deja seguir con el proceso de distribución, obteniendo un archivo con las funciones ampliadas para Acrobat Reader; en Acrobat 9, ese mensaje es de alerta y te informa que si tu formulario no contiene ningún botón de enviar por correo electrónico, no puedes continuar con el proceso de distribución.

alertacorreo

Para solucionar este problema tenemos dos opciones: incluir un botón de enviar por correo electrónico (aunque sea invisible), o añadir las funciones ampliadas para Acrobat Reader a través de menú. Para esta segunda opción vamos al Menu/Avanzadas/Funciones ampliadas en Adobe Reader, donde nos aparece una ventana informativa de qué tipo de funciones estamos habilitando en nuestro formulario.

funcionesampliadas 

Si damos al botón Guardar ahora, obtendremos un archivo PDF con las funciones detalladas en la pantalla anterior, igual que el que obtenemos al distribuir un formulario, pero sin el archivo de recopilación de formularios. Depende para qué los uses, ese archivo no será necesario.

Combinar datos de excel en InDesign

•diciembre 1, 2008 • 15 comentarios

Puede resultar muy útil para la maquetación de elementos que se repiten, como por ejemplo catálogos, utilizar la opción de “combinar datos” desde excel.

El contenido que vamos a maquetar debe provenir de una hoja de excel y tiene que estar estructurado por registros (conjunto lineal de campos) que hacen referencia a un mismo grupo. El encabezamiento (primera fila) debe contener la descripción de los campos.

Registros de hoja de excel

Registros de hoja de excel

Cuando el documento está preparado, debemos convertirlo para importarlo desde InDesign. Tenemos dos opciones: guardarlo como documento csv (delimitado por comas) o txt (delimitado por tabulaciones). Para el ejemplo que se muestra a continuación utilizamos txt.

Podemos incluir la ruta de las imágenes que queremos que se importen en InDesign. Si guardamos la carpeta de imágenes en el mismo lugar que el archivo de origen de datos (txt o csv), no es necesario añadir la localización, bastará con el nombre. Es imprescindible que en el encabezamiento pongamos los caracteres ‘@ delante del nombre, es lo que las identifica como imágenes.

21

En nuestra plantilla de InDesign identificamos los elementos fijos y los que se van a importar desde excel. Activamos la paleta de combinación de datos (en el menú Ventana/Automatización/Combinación de datos). En el desplegable de la derecha seleccionamos el archivo de origen de datos que hemos guardado en excel. Se importa el contenido del encabezamiento del documento, de manera similar a las etiquetas xml.

31

Arrastramos cada campo al lugar correspondiente de la plantilla.

 

adafaffa

Asignar etiquetas

Para comprobar el resultado, activamos la vista previa (en la parte inferior izquierda de la paleta) y podemos ver un ejemplo seleccionando el registro que queremos. Si todo es correcto, importamos todo el contenido, activando dentro del desplegable de la derecha de la paleta (también en la esquina inferior derecha) la opción: crear documento combinado. Se crearán las páginas necesarias para integrar todos los módulos resultantes. Dentro de las opciones de importación, podemos elegir el número de registros, los márgenes de los módulos y la organización dentro de la página, etc. También podemos seleccionar las opciones de ajuste de marco para las cajas de imagen. 

Crea un nuevo documento a partir del modelo.

5

Generación de módulos

Podemos guardar la plantilla de InDesign con la combinación de datos de un archivo de excel y actualizarlo para cada edición.

Formulario dinámico IV

•noviembre 27, 2008 • 4 comentarios
Ejemplo de campos dinámicos. Añadir campos según una estructura fija.

Ejemplo de campos dinámicos. Añadir campos según una estructura fija.

Asi se ve en el formulario en PDF.

Así se ve en el formulario en PDF.

En este ejemplo, vamos a ver cómo, teniendo unos campos que se pueden repetir indefinidamente, sólo aparezcan en el formulario una vez, y la persona que lo rellene añada tantas repeticiones como le sean necesarias. Para ello, tendremos los campos necesarios, un botón para añadir el grupo de elementos, un botón para eliminar el exceso de elementos y un campo invisible donde se unirá el contenido de todos los grupos de elementos con el formato que queramos darle.

Primero habrá que crear un subformulario («Form1») donde incluir todos los elementos de este ejemplo. Ese subformulario contendrá otro subformulario («destacado») en el que estarán incluidos los campos de texto que queremos tomar de base para luego ir repitiendo con la acción del botón y un botón para eliminar cada una de las repeticiones independientemente. Este botón tendrá incluído el siguiente script:

----- Root.Form1.destacado.btn_Delete::click: - (JavaScript, cliente) ------------------------------
this.resolveNode("destacado").instanceManager.removeInstance(this.parent.index);

Aquí sólo tendremos que cambiar el texto «destacado» por el nombre del subformulario donde están incluídos los campos.

Luego insertaremos otro subformulario («addDestacado») con un botón, al que le daremos la función de repetir el grupo de elementos anterior («destacado») tantas veces como clicks le demos. Para añadir esa función, escribimos este script:

----- Root.Form1.addDestacado.btn_AddDestacado::click: - (JavaScript, cliente) ---------------------
xfa.form.Root.Form1.destacado.instanceManager.addInstance(true);
En este script habría que modificar la ruta del subformulario que queremos repetir («Root.Form1.destacado»).
Para terminar, insertamos un campo de texto, que haremos invisible, donde recopilaremos la información que contengan todos los campos, unidos como queramos (espacios, tabuladores, puntos, retornos…).  Para hacer esto, tendremos que escribir este script:
----- Root.Form1.LoMasDestacado::calculate: - (JavaScript, cliente) --------------------------------
var nTexto = "";
for (var i = 0; i < _destacado.count; i++)
{
var oObjeto = Form1.resolveNode("destacado[" + i + "]");
nTexto = nTexto+"\u0009"+oObjeto.pagina.rawValue+"\u0009"+oObjeto.titulo.rawValue+"\u000a"+oObjeto.comentario.rawValue+"\u000a";
}
nTexto;

Dentro de este script, habrá que cambiar las palabras «pagina, titulo y comentario» en función del nombre que hayamos dado a los campos de texto y el texto entrecomillado por los caracteres o símbolos con los que queramos unir dichos campos. «\u0009» corresponde al código para el retorno de carro.

Este último campo será con el que hagamos la conexión de datos con InDesign.

Contador de palabras

•noviembre 19, 2008 • Dejar un comentario

Algo que puede resultar bastante útil a la hora de crear un formulario con campos de texto abiertos, es limitar la posibilidad de escribir indefinidamente. Para esto, como para casi todo, hay varias opciones. Una de ellas, la más rápida y sencilla sería limitar el campo de texto a un número de caracteres determinado. Para ello vamos a la ventana Objeto, dentro de la pestaña Campo, seleccionamos la casilla «Limitar longitud a área visible»«Limitar longitud» y especificamos el número máximo de caracteres que vayamos a permitir escribir dentro de ese campo.

ventana-limitar

La otra opción es crear una referencia visual del número de caracteres que le quedan por escribir. En este ejemplo, os explico cómo hacer un campo en el que, al salir del campo de texto en el que se está escribiendo o al hacer click en un botón, aparezca una referencia del número de caracteres que quedan para llegar al máximo permitido o aconsejado. También le vamos a añadir un mensaje emergente que avise cuando se ha superado el límite de caracteres y una función para que no deje enviar el formulario por correo electrónico si se ha superado ese límite. Para todo esto vamos a usar Scripts en lenguaje FormCalc, que es el propio de Adobe Designer. Podría ser en JavaScript, pero no es el que uso yo para este ejemplo. También podría actualizarse el número de caracteres restantes al tiempo que se va escribiendo, pero todavía no sé cómo se hace. Os explico lo que hago, y lo que sé.

Dos ejemplos de contador de palabras 

Dos ejemplos de contador de palabras

 

Y su vista en PDF 

Y su vista en PDF

Para este ejemplo, insertamos en el formulario un botón y dos campos numéricos. El botón lo arrastraremos de la biblioteca estándar y no habrá que hacerle nada, salvo cambiar el nombre «botón» por el que queramos; en el ejemplo «caracteres restantes» o «caracteres aproximados». No habrá que incluirle ninguna función, ni ningún script, porque el número de caracteres restantes nos va a aparecer simplemente con salir del campo en el que estamos escribiendo.

El primero de los campos numéricos, que dejaremos visible, será en el que aparezca la referencia al número de caracteres restantes. A este campo le pondremos el nombre que queramos en la Ventana Objeto/Enlace/Nombre; por ejemplo «caracteres». Dentro de la ventana del Editor de secuencias de comandos, en «calculate» escribimos el siguiente script de FormCalc:

 

----- Formulario1.#subform[0].caracteres[0]::calculate: - (FormCalc, cliente) ----------------------
var longitud=Len(CampoTexto1);
caracteres=Sum(-longitud, 10)

Aquí tendremos que sustituir «CampoTexto1» por el nombre del campo al que va a hacer referencia el contador. «Caracteres» es el campo numérico donde va a aparecer la referencia. Y hay que sustituir el «10» por el número de caracteres máximo que queremos que se escriba en el campo de texto.

En el otro campo numérico escribiremos este script:

----- Formulario1.#subform[0].seguridad[0]::calculate: - (FormCalc, cliente) -----------------------

if (caracteres<0) then seguridad=100

else seguridad=1

endif

Donde le damos las instrucciones para que impida el envío por correo electrónico si se ha superado el número máximo de caracteres. Para incluir un mensaje emergente que notifique del exceso de caracteres lo haremos mediante la Ventana Objeto/Valor, con las opciones de la imagen.

mensajecaracteres

El mensaje podrá ser personalizado. Para terminar, pondremos este campo invisible para que no se vean elementos extra innecesarios dentro del formulario.

Formulario dinámico III

•noviembre 11, 2008 • 3 comentarios

Como decía en la entrada Formulario dinámico II, si queremos que la botonera para activar o desactivar subformularios no sea excluyente, tendremos que convertir los botones de radio en casillas de verificación. Aquí, un ejemplo…

Para este ejemplo, insertamos en el formulario una o varias casillas de verificación. Al contrario que pasa con los botones de radio, aunque pongas una casilla junto a otra, éstas permanecerán independientes. Después añadimos tantos Subformularios con contenido como casillas hayamos insertado. Y le damos el nombre que queramos a cada elemento dentro de la ventana de Jerarquía.

casillasverificaciondinamica

Para darle la función de activar/desactivar estos subformularios, seleccionamos una de las casillas de verificación y en la ventana del Editor de secuencias de comandos, metemos el Script en el «click», teniendo en cuenta que será JavaScript. Y escribimos:

 

----- Formulario1.Subform0.#field[0]::click: - (JavaScript, cliente) -------------------------------

if (this.rawValue=="1")

Subform1.presence="visible";

else

Subform1.presence="hidden";

scriptcasillaverificacion1

En este Script le estamos diciendo que cuando hacemos click en la casilla (rawValue=1), me muestre el Subform1 y su contenido; y si la deseleccionamos, lo oculte. Repetimos este mismo Script en todas las Casillas de verificación que hayamos incluído, cambiando «Subform1» por el nombre del subformulario sobre el que queramos realizar la acción.

Cuando ya tengamos todos los srcipts completados, terminaríamos con el mismo paso que si fuera una botonera excluyente: ocultar los subformularios de la presentación, para que, por defecto no tengamos contenido condicional. Para esto, seleccionamos los dos subformularios (Subform1y Subform2), y en la Ventana/Objeto/Subformulario ponemos la Presencia «Oculto (excluir de la presentación)». Esto hará invisibles todos los campos que contengan los subformularios a los que hacen referencia las casillas de verificación y que se irán haciendo visibles/invisibles al hacer click sobre ellos.

Botón Guardar

•noviembre 11, 2008 • 3 comentarios

Una de las opciones extra que se habilitan en un formulario después de Distribuir en Acrobat Professional (puedes ver cómo y porqué se hace en el punto 2.2. de la entrada «Proceso para generar plantillas etiquetadas y formularios»), es la posibilidad de guardar el formulario si se está rellenando con Acrobat Reader.

Para dar un aviso de esta posibilidad o simplemente para hacerlo de una forma más directa, podemos crear un botón que ejecute esta acción «Guardar como». De la Ventana/Biblioteca/Estándar, pinchamos y arrastramos un «botón» estándar. Para añadirle la acción «Guardar como», le añadimos un Script de JavaScript al hacer click en el botón. Sería así:

----- Formulario1.Botón1::click: - (JavaScript, cliente) -------------------------------------------

app.execMenuItem("SaveAs")

scriptguardar

Y listo...