You are on page 1of 57

Documentacin Tcnica FinnAp XII

Seguimiento de documentacin
Revisin : 1.0
Documentos relacionados: <se indican los documentos relacionados: Ejemplo Especificacin
Funcional, Especificacin de Diseo, Presupuesto>
Lista de distribucin: <se indican las personas a quienes se debe entregar copia del documento. Se
enviar siempre una copia a Servicios al Cliente, Calidad>
Fecha
01/12/2005

Paso
Redactor

Ejecut

Observaciones

Damian Maller

Autorizante
05/05/2008

Modificador

Alejandro
Albiero

Perez

Tratamiento Exceptions

Introduccin
Arquitectura de n-Capas

El Finnegans Application Framework (FAF) esta desarrollado utilizando una arquitectura de n-Capas, lo que nos permite
gran versatilidad y escalabilidad.
El cliente puede ser tanto un cliente fino (Internet browser) que accede a la aplicacin a travs de un web Server, como un
cliente grueso (Fat client) accediendo directamente al FAF, utilizando los mismos recursos pero en una interfaz rica.
El middle tier esta compuesto por el Web Server y por el servidor de aplicaciones. Estas funciones pueden estar albergadas
en el mismo equipo o en varios, incluso el servidor de aplicaciones y Web Server, pueden federarse en varios equipos,
permitiendo una gran escalabilidad.
La capa de datos (Data Server) puede ser cualquier base de datos transaccional (MS Sql Server, Oracle, IBM DB2, etc.) que
cumpla con el estndar SQL ANSI 92.
Pero el FAF no se detiene all, sino que tambin puede interactuar con cualquier data source externo para mostrar o
actualizar informacin y tambin con cualquier otro sistema (cualquiera sea) a travs de un repositorio XML que comparten
ambas aplicaciones y es administrado por el framework.

Web Server

El Web Server actua como conector entre el browser y el framework. Para realizar esta funcin se basa en varios pilares
que se ocupan de generar el cdigo HTML (combinado con CSS y funciones de JavaScript) basndose en definiciones
abstractas intermedias, almacenadas en XML en el servidor.
Esta estructura permite la generacin de diferente cdigo, segn el cliente que lo acceda y tambin estar preparado para
futuras tecnologas en la presentacin de datos.

Soporte Multilenguaje
Este modulo es el responsable de la administracin de los diferentes lenguajes en el front-end HTML.
El framework soporta ilimitada cantidad de lenguajes. Cada lenguaje tiene configurado su diccionario que puede ser
modificado en run-time por el usuario de la aplicacin. Cada usuario puede ingresar al sistema utilizando su propio
lenguaje, es decir que una empresa distribuida globalmente puede permitir a sus usuarios utilizar el sistema en su lenguaje
de origen.

DynamicForm
Los formularios que utiliza el framework para dar de alta, modificar o eliminar registros es generado dinmicamente en
run-time, tomando su estructura de archivo XML que define los elementos de la interfaz (llamados widgets) y su vinculacin
con una clase de la lgica de negocios.
El DynamicForm, permite al implementador o desarrollador realizar cambios en la interfaz sin modificar la lgica de
negocios y concentrando su tarea en la resolucin del problema.
Tambin permite tener mltiples interfaces, personalizada para cada usuario o sector, para una misma entidad en la lgica
de negocios.
La integridad de los datos nunca es comprometida, ya que estos son controlados por la clase de negocios que administra el
formulario y solo son ingresados en la base de datos si estn conformes a la lgica de negocios.
Otras

prestaciones destacadas:
Soporte de carga de datos mltiples de lnea sin recarga de la pgina
Soporte de mltiples solapas
Multilenguaje
Bsqueda e impresin de registros.
Validacin de datos en el servidor y en cliente
Acciones adicionales
Pre-validacin y auto-completar de datos

FAFReport
Los informes son mostrados al cliente utilizando el FAFreport. Esta herramienta permite manipular la informacin
permitiendo filtrarla, agruparla, ordenarla, graficarla, resumirla, etc.
Los esquemas de los informes son almacenados tambin en formato XML, brindando la posibilidad de realizar cambios al
usuario, modificando los filtros, columnas o formatos y dejando esta configuracin almacenada, para un uso futuro.

WebParts
Las WebParts, son porciones de pantalla que pueden albergar en su interior otros WebParts o algn otro tem como un
FAFReport, un DynamicForm, un link, un grafico, etc.
Esta funcionalidad nos permite crear paneles con mltiple informacin relacionada (por ejemplo Paneles de Control),
configurada directamente por el usuario.
Los WebParts pueden estar relacionados entre si, para dar informacin en forma sincronizada.

Widgets
Los Widgets son porciones pequeas de software que tiene como funcionalidad capturar informacin ingresada por el
usuario. Los widgets pueden ser referenciados por otros elementos de la interfaz para crear formularios de ingreso de
datos (por ejemplo DynamicForm).
Encapsulamiento
Al abstraer la creacin de los formularios del cdigo fuente HTML, permite crear fcilmente interfaces complejas que
pueden ir evolucionando en futuras versiones, enriqueciendo toda la aplicacin.
Cada widget es responsable de mostrar la informacin en pantalla, en la superficie que se le asigna y de capturarla
nuevamente, una vez que esta es modificada.

Lgica de la aplicacin

El framework brinda la estructura y servicios de base a la aplicacin que hostea, permitiendo a esta solo focalizarse en el
problema a resolver y dejar que el framework resuelva las tareas comunes, como acceso a la base de datos, auditoria de
accesos, seguridad, etc.

Facade
Es la puerta de entrada a la lgica de negocios de la aplicacin y a las herramientas del framework
Cada llamada es analizada para determinar si fue solicitada desde un cliente autentificado y si ese cliente tiene permisos
suficientes para ejecutar la operacin.

Business Logic Layer


En la BLL estn todas la definiciones e implantaciones de objetos especficos de la aplicacin que se esta desarrollando.
La separacin de la lgica del facade, permite realizar cambios en la BLL sin afectar el contrato con los clientes.

Gestor de Sesiones
Cada ingreso a la aplicacin es validada por las polticas de seguridad y posteriormente es administrada por el Gestor de
sesiones. Este gestor permite determinar los clientes que se encuentran conectados, desconectarlos, crear reglas de
permiso de conexin, etc.

Seguridad
La seguridad esta basada en roles y prestaciones. El administrador del sistema puede decidir, de manera muy atmica, los
permisos que tendr cada uno de los roles y los usuarios.

FAF Data Engine


Para evitar que gran cantidad de informacin llegue al cliente de manera descontrolada, el framework dispone de un
DataEngine que tiene como funcionalidad pedir los datos a una clase determinada y luego cachear y transformar esta
informacin a un formato predefinido (FAFDataset), que contiene solo la informacin requerida (paginada), ya ordenada,
agrupada, sumarizada y con toda la metadata necesaria para que el cliente puede utilizarla directamente.

Personalizacin
El motor de personalizacin permite a cada usuario guardar el esquema en el cual desea ver la informacin como as
tambin el estilo de visualizacin de la misma.

Auditoria
Los procesos de negocio son auditados con el nivel de detalle que requiera el administrador del mismo. Esta auditoria
permite conocer en detalle que operaciones fueron realizadas por cada usuario en un periodo de fecha determinado.

Gestor de errores
Una administracin cuidadosa de los errores es muy importante durante el ciclo de vida del sistema. Los errores son
calificados en dos tipos: funcionales y operativos
Funcionales: Son aquellos errores que son arrojados por el sistema al no cumplirse alguna regla del negocio. Estos errores
son predecibles y controlados.
Operativos: Son errores que no esperan y que son arrojados por alguna anormalidad en el software o en los sistemas de
base (Sistema operativo, hardware, base de datos, etc.)

Messaging Services
Estos servicios encapsulan los diferentes servicios de mensajeria (email, SMS, fax, etc) y brindan un modelo nico y sencillo
de acceder a estos servicios.

Multilenguaje
El framework soporta ilimitada cantidad de lenguajes. Cada lenguaje tiene configurado su diccionario que puede ser
modificado en run-time por el usuario de la aplicacin. Cada usuario puede ingresar al sistema utilizando su propio
lenguaje, es decir que una empresa distribuida globalmente puede permitir a sus usuarios utilizar el sistema en su lenguaje
de origen.

Detalles Tcnicos y de Desarrollo sobre el Framework


Introduccin
La idea de contar con un framework es poder tener una base slida sobre la cual se puedan montar aplicaciones, sin
necesidad de preocuparnos por temas como persistencia de los datos, seguridad, auditora, soporte multilinge, campos
adicionales, etc.
De esta forma, es posible desarrollar aplicaciones complejas de una manera rpida. Como valor agregado, al mejorar
el framework, se enriquecen todas las aplicaciones montadas sobre l.
El framework est basado en una arquitectura de n-capas, lo que nos permite tener diversos escenarios. Por ejemplo,
podemos contar con un servidor de aplicaciones en donde est la lgica del negocio, un servidor de bases de datos en
donde se almacene la informacin y un servidor web en donde resida la interfaz.
El siguiente es un esquema de la arquitectura del Framework.

Plataforma
El framework est desarrollado en Java, por lo que es multiplataforma. Para el desarrollo se eligi a Eclipse como IDE de
desarrollo, con la extensin de MyEclipse para mayor flexibilidad y poder de desarrollo.

Base de datos
El framework est pensado para soportar mltiples bases de datos, para ello la solucin provee una serie de
herramientas que nos va a permitir acceder a los datos independientemente del motor de base de datos que se est
utilizando.

Diccionario de Datos

Un concepto importante es el del Diccionario de Datos. Mediante el diccionario de datos se podrn definir el mapeo
entre una tabla y la clase que la representa y permitir definir el origen de datos del cual tomar la informacin. Adems
ser posible agregar campos adicionales en tiempo de ejecucin, sin necesidad de tener que recompilar nada, siendo esta
una caracterstica muy importante para el desarrollo rpido de aplicaciones, ya que muchos campos sern agregados
dinmicamente por un implementador.
Cada una de las empresas estar asociada a un origen de datos, de esta manera, se podr configurar cada entrada en
el diccionario de datos dependiendo de la empresa a la que se quiera acceder. Esta abstraccin es importante ya que no
estamos ligando una prestacin a una base de datos en particular, de esta manera, podemos hacer que la empresa apunte
a otra base de datos y la aplicacin tomar los datos de el nuevo origen sin necesidad de hacer otros cambios. Adems es
posible tener prestaciones que tomen los datos de diferentes empresas, lo que nos permitira por ej. Ver un reporte de la
empresa A y dentro de la misma aplicacin, poder editar los empleados de la empresa B.

Query Builder
El mecanismo para efectuar consultas a la base de datos es a travs del query builder, sta es una clase que nos va a
permitir componer una sentencia sql para su posterior ejecucin sin que nos estemos ligando a un proveedor de base de
datos en especial.
ste es un ejemplo de una consulta usando el query builder:
import
import
import
import

java.sql.ResultSet;
java.sql.Types;
java.sql.PreparedStatement;
faf.app.base.data.db.iface.QueryBuilder;

dbh = DBHelperManager.getInstance().getDBHelper(session.getEmpresaDatos());
qb = dbh.getNewQueryBuilder();
qb.addField("Codigo");
qb.addField("Nombre");
qb.addTable("Producto");
PreparedStatement prep = qb.getSelectStatement();
ResultSet rs = prep.executeQuery();

FAFDataEngine y FAFDataSet
Un FAFDataSet es una abstraccin de un Resultset, que nos va a permitir buscar elementos dentro del conjunto de datos,
agrupar, sumarizar, paginar, etc.
Al crear un FAFDataSet se deber indicar la clase y el mtodo que conformarn el origen de los datos y luego el
FAFDataEngine ser el encargado de ejecutar dicho mtodo y llenar de el FAFDataSet.
FafDataSetVO dataSet = new FafDataSetVO("faf.client.Tree","getHojas");
dataSet.setSessionID(sessionID);
Collection fields = new Vector();
FieldVO fieldID = new FieldVO("ID","system","","ID",true);
fields.add(fieldID);
FieldVO fieldName = new FieldVO("Nombre","visible","","Nombre ",false);
fieldName.setURL("FAF:JAVASCRIPT:opener.document.form1:ID;ID");
fields.add(fieldName);
dataSet.setFields(fields);
dataSet.execute();
Para obtener ms informacin acerca de sta o mas clases ver la documentacin completa de las clases del framework.

Interoperabilidad
El framework permite que las aplicaciones montadas sobre l operen con otros sistemas, sin importar la naturaleza de
los mismos. Es decir, podemos construir una aplicacin que interacte con un sistema hecho en Clipper, Visual Basic, C#,
Cobol, etc. Y a su vez que resida en un servidor Windows, Unix, una Palm, etc.
Hay cuatro modelos de interoperabilidad que describiremos brevemente:
1.
2.

El modelo de Interoperabilidad basado en XML: nuestra aplicacin genera un archivo XML con la informacin
que se desea grabar, siendo tarea del otro sistema leer el XML y guardar los datos.
Conexin con otros sistemas a travs de XML: la comunicacin se realiza por medio de web-services
utilizando xml para transportar la informacin.

3.
4.

Conexin directa con bases de datos de otros sistemas: en este mtodo se accede directamente a la base
de datos del otro sistema.
Interoperabilidad COM: la comunicacin se realiza por medio de una dll, que ser la encargada de tomar los
datos de nuestra aplicacin y operar con el sistema en cuestin.

Clientes ricos y finos


El framework permite tener diferentes front-ends, de acuerdo a la naturaleza de la aplicacin que se est
montando.
Un cliente fino, basado en web proporciona una portabilidad insuperable, ya que puede ser accedido desde cualquier
pc de escritorio conectada a Internet o bien a una intranet. Sin embargo tiene las limitaciones propias de cualquier
aplicacin web, y puede no ser la interfaz adecuada para una aplicacin con formularios de carga complejos. Un modelo
con una interfaz rica, basado en componentes nativos, puede ser la opcin para este caso.

Funcionamiento general
Round-trip de una llamada al servidor
Sesiones de usuarios
Seguridad

Componentes del framework


Entidades
Una entidad representa a un objeto que queremos que se guarde en la base de datos. Si en nuestra aplicacin necesitamos,
por ejemplo, manejar productos, nos bastar con crear una entidad Producto utilizando las clases que provee el framework
para que, de esta manera, heredemos la funcionalidad general a cualquier entidad, como crear, modificar, eliminar,
seguridad, auditora, etc.
El framework provee una jerarqua de herencia que nos va a permitir construir nuevas entidades de una manera rpida y
sencilla.
El siguiente es un diagrama con las principales clases a tener en cuenta:
PrimaryKey

TransaccionVO

EntidadVO

EntidadPrimariaVO

AtributoVO

EntidadSecundariaVO

ForeignKeyVO

ParentVO

EntidadHLP

EntidadVO: Es la clase que se encarga de mapear la estructura de la tabla en la base de datos con la representacin en
Java. Bsicamente definir a los atributos junto con las operaciones para acceder a los mismos.
PrimaryKey: Es una abstraccin de una PrimaryKey.
AtributoVO: Esta clase sirve para representar a un atributo de la entidad.

EntidadPrimariaVO: Esta clase define


Cdigo,Nombre,Descripcin y Activo.

algunos

atributos

que

son

generales

para

cualquier

entidad,

como

TransaccionVO: Define atributos propios de una transaccin, como Fecha, Nmero Interno, Comprobante, Observaciones,
etc.
EntidadSecundariaVO: Se utiliza para representar listas de entidades que formarn parte de otras entidades. Por ejemplo
si tenemos la clase Persona y queremos asociarle una lista de telfonos, debemos definir la clase TelefonoVO como una
entidad secundaria.
ParentVO: Se utiliza para vincular a la entidad secundaria con la entidad primaria que la contiene.
EntidadHLP: Es la otra clase clave en el modelo. Se encarga de operar sobre las entidades, e implementar las operaciones
para crear, modificar, borrar, buscar, etc.
Para crear una entidad sencilla, por ejemplo Provincia, es necesario construir dos clases: ProvinciaVO y ProvinciaHLP.
ProvinciaVO definir el mapeo de la clase con la estructura de la tabla, mientras que la clase helper ProvinciaHLP tendr
los mtodos que trabajan sobre los datos, como por ejemplo, buscar, crear, modificar, listar, etc. Siempre que hablemos de
una entidad tenemos que tener presentes estas dos clases, la clase VO y la clase Helper.
Por ejemplo, para construir la clase ProvinciaVO deberamos hacer algo como:
public class ProvinciaVO extends EntidadPrimariaVO implements Serializable {
public ProvinciaVO(String sessionID) throws FunctionalException {
//Se envia el identificador de la pk y el nombreFisico
super("ProvinciaID", "Provincia", sessionID);
try {
atributosPropios.add(new AtributoVO(20,"PaisId", "Pais", new FafInteger(),
"", true, new ForeignKeyVO("PaisID", "Nombre", "Pais"),false, true));
} catch (Exception e) {
ExceptionUtil.write(e);
throw new FunctionalException();
}
}
. . .
Ntese que el mtodo constructor deber recibir el identificador de la sesin en curso.
Se deben generar as mismo, los correspondientes mtodos setters y getters para la clase en cuestin, dichos mtodos son
utilizados para interactuar con los atributos propios de la clase definidos previamente.
. . .
public Integer getPaisId() {
return Integer.valueOf( atributosPropios.getAtributo("PaisID").getValor().toString());
}
public ForeignKeyVO getPais() {
return atributosPropios.getAtributo("PaisID").getForeignKey();
}
public String getPaisNombre() {
return atributosPropios.getAtributo("PaisID").getForeignKey().getNombre();
}
public void setPaisId(Integer newId) {
try {
atributosPropios.setAtributo("PaisID", newId);
} catch (Exception e) {
ExceptionUtil.write(e);
}
}
public void setPaisNombre(String newNom) {
try {
AtributoVO atrib = atributosPropios.getAtributo("PaisID");
ForeignKeyVO fk = atrib.getForeignKey();
fk.setNombre(newNom);
atrib.setForeignKey(fk);
atributosPropios.setAtributo("PaisID", atrib);

} catch (Exception e) {
ExceptionUtil.write(e);
}
}
. . .
Ahora bien, supongamos que estamos construyendo la entidad Persona y deseamos que tenga una lista de telfonos. Para
ello necesitamos crear la entidad Telfono, pero la definiremos como una entidad secundaria.
public class TelefonoVO extends EntidadSecundariaVO implements Serializable {
public TelefonoVO(String sessionID)throws FunctionalException {
super(null, "Telefono", sessionID, new ParentVO("PersonaID", "Persona", "PersonaID"));
try {
atributosPropios.add(new AtributoVO("PersonaID",
FafInteger(),true, false, true));

"PersonaID",

new

atributosPropios.add(new AtributoVO("Numero", "Numero", new FafString(20), true,


true, true));
atributosPropios.add(new AtributoVO("Categoria", "Categoria", new FafString(100),
true, true, true));
} catch (Exception e) {
ExceptionUtil.write(e);
throw new FunctionalException();
}
}

Facade
La interaccin entre el framework y los clientes, se realiza a travs del facade o los facade, es decir los facade son la
puerta de entrada al framework, siendo necesario para un correcto funcionamiento que el facade defina los mtodos
necesarios para negociar, con los clientes.
Aqu representaremos con un ejemplo sencillo como agregar un nuevo mtodo al facade, teniendo especial cuidado en
esta etapa, dado que el facade se compone de 3 archivos.
Ahora bien, supongamos para nuestro ejemplo que deseamos agregar un mtodo al facade que nos devuelva la suma de 2
cantidades enteras.
Es decir definiremos el mtodo suma(int a, int b) : int
Un bean en este caso se compone de los siguientes archivos.
ejb-jar.xml
- Xml de configuracin del bean.
NombreBeanEJB.java -Definicin de los mtodos
NombreBeanEJBBean.java -Implementacin de los mtodos.
NombreBeanEJBHome.java -Inteface Home del Bean.

1) Archivo ejb-jar.xml
Un ejemplo de dicho archivo puede ser el siguiente:
<?xml version = '1.0' encoding = 'windows-1252'?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN"
"http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<description>Session Bean ( Stateless )</description>
<display-name>NombreBeanEJB</display-name>
<ejb-name>NombreBeanEJB</ejb-name>
<home>faf.app.resources.facade.NombreBeanEJBHome</home>
<remote>faf.app.resources.facade.NombreBeanEJB </remote>
<ejb-class>faf.app.resources.facade.impl.NombreBeanEJBBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>

</enterprise-beans>
</ejb-jar>

2) Archivo NombreBeanEJB.java
Dicho archivo es la interfaz remota, es donde definimos los mtodos que se dejarn acceder por los clientes, es decir que
en nuestro ejemplo aqu deberamos agregar una lnea como la siguiente:

int suma(int a, int b) throws RemoteException;

3) Archivo NombreBeanEJBBean.java
Dicho archivo es donde implementamos los mtodos que previamente agregamos en el archivo de interfaz, en nuestro caso
agregaramos una definicin del mtodo suma de la siguiente manera:

public int suma(int a, int b) throws RemoteException{


return a+b;
}

4) Archivo NombreBeanEJBHome.java
Dicho archivo es la interfaz home de la bean, es donde se tienen los mtodos que son propios de la bean tales como create.
Es decir en dicho archivo se pueden encontrar mtodos como el siguiente:

NombreBeanEJBcreate() throws RemoteException, CreateException;

Sesiones
Modelo de sesiones
Tiempo de vida
Encriptacin

Seguridad
El framework provee un modelo de seguridad por prestaciones basado en usuarios y roles.
Un usuario puede pertenecer a uno o mas roles. De esta manera, es posible, para una prestacin dada, asignar permisos a
algunos usuarios en particular o bien a uno o ms roles.
Existen cuatro polticas de seguridad bsicas:

Para consultar informacin (Select).

Para dar de alta datos (Insert).

Para modificar datos (Update).

Para eliminar informacin (Delete).


Existe un requisito a la hora de nombrar a las prestaciones, y es que el nombre debe estar compuesto por el nombre de la
tabla seguido del nombre de la poltica de seguridad que se desea implementar. Por ejemplo, para definir la prestacin
Insert de la tabla vLaboreo, es necesario crear una nueva prestacin con el nombre: vLaboreo.insert.

Auditoria
Seguimiento de una transaccin
Modelo de datos

Errores
Diferentes tipos de errores
Manipulacin de errores

Multilenguaje
Cdigos de lenguaje
Como manipular los mensajes del framework en multiples lenguajes
Creacin de nuevos mensajes

Interfaz del usuario


Abstrayendo la interfaz del usuario de su implementacin
Soporte para customizacin de la aplicacin
Personalizacin de formularios e informes
Estructura de formularios
Estructura de informes
AppItems: tipos, estructura de datos

Framework Web
Introduccin
Arquitectura global
Manejo de estilos a travs de CSS

Multilenguaje
Mensajes propios de la UI son administrados por el framework Web
Manejos de lenguaje en formularios, informes y paginas ad hoc

Widgets
Un widget es una abstraccin de un componente de una ventana. Actualmente tenemos implementados los siguientes
widgets:

WidgetButton
WidgetTextBox
WidgetCheckBox
WidgetSelectBox
WidgetMemo
WidgetFecha
WidgetSelector
WidgetLine
WidgetButtonServerAction
WidgetPassword
WidgetSelectorTree

Un widget puede tener diferentes implementaciones, por ejemplo, puede tener una implementacion HTML y otra utilizando
AWT, pero la idea es que a un widget siempre le vamos a poder asignar o pedir su valor. A su vez, un widget puede tener
acciones asociadas, que servirn para efectuar las validaciones que sean necesarias del lado del cliente.
Las propiedades mas comunes de los widgets son las siguientes:
Propiedad

Descripcin

Name

Es el nombre que le vamos a dar al widget

Type

Tipo de widget

ClassProperty

Identifica al atributo de la entidad

JavaType

Es el tipo de datos Java con el que se representa el valor del widget

Visible

Indica si el widget es visible

ReadOnly

Indica si el widget es de solo lectura

Required

Indica si el widget es requerido

Cols

Numero de columna

Rows

Numero de fila

Caption

Especifica el titulo del widget, el mismo tiene soporte multilenguaje

OnEnter

Accin que se ejecutar cuando se hace foco en el widget

OnExit

Accin que se ejecutar cuando se pierde el foco del widget

Value

Valor del widget

FillMethodType

En el caso de los selectores es 1, para los combos 2

FillMethodOptions

En los selectores es el mtodo que se ejecuta para obtener los datos

ExtraProperties

En el caso de los selectores es el codigo de la entrada en el diccionario de datos del selector que
se desea ver.

Ahora vamos a ver una definicin XML correspondiente a un widget cualquiera, para ver cuales son las propiedades
comunes que tienen, y analizar su uso. Un widget no necesita estar representado por un XML, pero este ejemplo nos ser
til mas adelante, para definir formularios basados en widgets, en el que s estarn definidos por un XML.

<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""

onEnter=""
onExit=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
Definicin XML de un widget.

DynamicForm
Para implementar un formulario el framework nos provee del DynamicForm.
El DynamicForm toma una definicin de un XML y genera una interfaz basada en solapas y widgets.
El DynamicForm es esencial cuando queremos implementar la interfaz para un ABM, en este caso la definicin del XML se
asemeja a un mapeo de los atributos de la entidad con la que estamos trabajando, es decir, cada uno de los widgets de la
intefaz corresponder a un atributo de la entidad. En este caso podramos hablar de un EntityForm (Los trminos
DinamicForm y EntityForm se utilizarn indistintamente cuando estemos hablando de DinamicForms de entidades), sin
embargo, un DinamicForm no necesariamente tiene que estar ligado a una entidad, por lo que se transforma en una
herramienta poderosa para crear pginas adhoc con la simple definicin de un XML.
En el caso de un EntityForm, tendr asociada una Toolbar con las acciones tpicas que se pueden aplicar sobre una entidad.
Adems existe la posibilidad de agregar acciones adicionales.

Ahora veamos un ejemplo de un formulario de la entidad Laboreo basado en el DynamicForm:

Formulario de Laboreo. Ver definicin del XML


Ahora veamos como construir una interfaz de una entidad ms sencilla, como por ejemplo una Mquina.
Para ello, comenzaremos por definir el encabezado del XML:

<?xml version = '1.0' encoding = 'windows-1252' ?>


<widgetForm library="" onInit="">>
El atributo library sirve para indicar cual va a ser la librera que manejar la lgica del formulario. OnInit indica la rutina
que se ejecutar al cargar el formulario.
Ahora definiremos una solapa

<widgetTab name="General">
Y agregamos nuestro primer widget, que representa la primarykey de la entidad:

<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
Ahora agregamos un widget para definir el cdigo:

<widget
name="Nombre"
type="WidgetTextBox"
classProperty="nombre"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="true"
cols="1"
rows="1"
operation=""
caption="Nombre:SP;Name:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
de la misma manera definimos los widgets para el cdigo, activo y descripcin, finalmente, cerramos los tags de la solapa y
el formulario:

</widgetTab>
</widgetForm>

El resultado es la siguiente interfaz:

El EntityForm tambin permite generar un HTML con formato imprimible, presionando el botn Imprimir desde la toolbar.
Por Ejemplo:

Impresin de un Laboreo.
Pintado del dinamicForm
DinamicForm.js

editor.jsp

Toolbar

DinamicFormVO

XMLParser

DinamicForm.java

ActionRefresh

Tab

Widget

openWindowInLine
Crea
Obtiene
parse(xml)
execute
doIt
getHTML
*getHtml
*getHtml

Hago una llamada ajax al


editor jsp, pasandole la
accin "refrescar"

Recorro los Tabs y


genero su codigo
html

Ejecuto el ActionRefresh, para


obtener los datos de la entidad y
llenar los widgets
Genero el html del dinamicForm,
pasandole la toolbar y el model
creados

Recorro y genero los


htmls de los widgets
del Tab

FAFReport
El FAFReport o WebReport, provee la implementacin HTML de una grilla, y se usa principalmente para generar reportes o
para listar tems antes de su edicin.
El FAFReport puede utilizar una definicin XML para dar formato a la vista. En esta definicin se pueden establecer las
columnas a mostrar, el ttulo de las columnas (soporta multilenguaje), las agrupaciones, sumarizaciones, grficos, etc.
Por ejemplo, una definicin sencilla sera:
<?xml version = '1.0' encoding = 'windows-1252' ?>
<root name="default">
<fields>
<field
name="Nombre"
type="visible"
url="FAF:EDIT:EstablecimientoVO:establecimiento;primaryKey=LF_ID"
caption="Nombre:SP;Name:EN" order ="1" />
<field name="Codigo" type="visible" order ="3" caption="Codigo:SP;Code:EN"/>
<field name="Calle" type="visible" order ="4" caption="Calle:SP;Street:EN"/>
<field name="CalleNumero" type="visible" order ="5" caption="Numero:SP;Number:EN"/>
<field name="Localidad" type="visible" order ="6"caption="Localidad:SP;Place:EN"/>
<field name="CodPostal" type="visible" order ="7" caption="Cod. Postal:SP;Zip:EN"/>
<field name="Provincia" type="visible" order ="8" caption="Provincia:SP;Province:EN"/>
<field name="Superficie" type="visible" order ="9"caption="Superficie:SP;Surface:EN"/>
<field name="CentroCosto" type="visible" order ="10" caption="Centro Costo:SP;Cost
Centre:EN"/>
<field name="LF_ID" type="system" order ="11" caption="ID:SP;ID:EN"/>
</fields>
<chartInfo title="Establecimientos" ancho="600" alto="400">
<col1 name="NOMBRE"/>
<col2 name="SUPERFICIE"/>
</chartInfo>
</root>
Y el FAFReport resultante es:

Ejemplo del FAFReport de Establecimientos.


El ejemplo de arriba muestra un listado de establecimientos. Observemos que existen dos barras de herramientas. Veamos
las opciones de la barra superior.

En la barra inferior, se muestran las acciones adicionales, configuradas en el AppItem. Como en este caso estamos listando
una entidad, automticamente aparecen las acciones de Borrar y Nuevo. Adems si el FAFReport lista entidades, se
mostrarn checks para poder marcar varias filas, y de esta forma, ejecutar acciones sobre varias entidades.
Si observamos nuevamente el FAFReport, podemos ver que el nombre del establecimiento es un link, al entrar al mismo nos
conduce al EntityForm asociado:

Al imprimir, se mostrar un reporte Jasper generado dinmicamente.

Reporte del FAFReport de Establecimientos.


Tambin es posible ver el grfico asociado, siguiendo el ejemplo, podemos ver la superficie por establecimiento:

Grfico del FAFReport.


Tambin es posible realizar agrupaciones y sumarizaciones dentro de un FAFReport. Para ello es necesario modificar la
definicin del XML indicando los grupos y por que campo se desea sumarizar:

<groupsBy>
<groupBy name="Centro_de_Costo" type="" />
</groupsBy>
<summaries>
<summary name="Movimiento" type="SUM" />
</summaries>
Adems es posible agregarle parmetros al FAFReport, para poder filtrar los datos a mostrar. Los parmetros se deben
configurar en la definicin del AppItem.
Veamos un ejemplo:

FAFReport con agrupaciones y parmetros.


Ya hemos repasado gran parte de la funcionalidad del FAFReport, pero de donde toma los datos? Por debajo de un
FAFReport siempre hay un FAFDataSet que mantiene los datos a mostrar. Entonces cuando configuramos el AppItem,
tendremos que indicar cual es el mtodo que se invocar para llenar dicho FAFDataSet y alimentar al FAFReport.

Explotacin de grillas
Es posible definir que, al hacer clic sobre una grilla de un webReport, la aplicacin se dirija a una vista de destino
pasndole automticamente:
1)

Los parmetros (junto a sus valores) de la vista de origen.

2)

Los valores de ciertos campos de fila de la grilla sobre la cual se hizo clic. Dichos campos son definidos por el usuario,
junto al nombre con el cual desea que cada uno de ellos llegue a la vista de destino.

La vista de destino recibir estos parmetros. En caso de que la misma posea parmetros con el mismo nombre de los
enviados, entonces los parmetros de esta vista adquirirn el valor de los parmetros pasados desde la vista de origen.
Veamos un ejemplo de definicin de XML de webReport:
<?xml version = '1.0' encoding = 'windows-1252'?>
<root name='default' allowGroups='true' hidePageNumbers='false' captionGeneralSummary='TOTAL
GENERAL' maxRows='20' showCheckBoxes='true' printOrientation='Portrait' linkedView="206">
<fields>
<field name="TRANSACCIONTIPONOMBRE" type="NOTVISIBLE" width="50" order="0" caption="Tipo"
printable="true"
mask=""
truncable="true"
url="FAF:EDIT:OperacionVO:operacion;primaryKey=TransaccionId"/>
<field name="NUMEROINTERNO" type="NOTVISIBLE" width="50" order="0" caption="Nmero Interno"
printable="true" mask="" truncable="true"/>
<field name="FECHA" type="VISIBLE" width="50" order="3" caption="Fecha" printable="true"
mask="" truncable="false"/>
<field
name="DESCRIPCION"
type="VISIBLE"
width="50"
order="7"
caption="Descripcin"
printable="true" mask="" truncable="true" linkedParameter="Desc"/>
<field
name="NUMERODOCUMENTO"
type="VISIBLE"
width="50"
order="5"
caption="Nmero
Comprobante"
printable="true"
mask=""
truncable="true"
url="FAF:EDIT:OperacionVO:operacion;primaryKey=TransaccionId"/>

<field
name="ORGANIZACIONNOMBRE"
type="VISIBLE"
printable="false" mask="" truncable="true"/>
</fields>
.
.
. Etc.

width="0"

order="6"

caption="Cliente"

Lo importante aqu son dos cosas, las cuales en el ejemplo estn marcadas en negrita:
1) El atributo linkedView del tag root, el cual indica el id de la vista a la cual la aplicacin se dirigir al hacer clic
sobre una fila de la grilla.
2) El atributo linkedParameter en cada uno de los fields cuyo valor deseamos trasladar a la vista de destino. El valor
de este atributo ser el nombre del parmetro de la vista de destino para el cual queremos que tome como valor el
valor de este field.

Vincular un webReport a un datasource distinto al de la empresa logueada


Si tenemos una grilla que se llena en base a un SP, por default dicho SP ser buscado y ejecutado en el datasource definido
para la empresa logueada (segn lo indique el archivo \jboss\server\default\deploy\ mssql-ds.xml).
Es posible tambin buscar y ejecutar el SP en un datasource distinto. Para ello, debemos crear una entrada en el
diccionario de datos cuyo campo Nombre clase coincida exactamente con el campo Mtodo de la view. Vemoslo
mediante un ejemplo.
Supongamos que tenemos la siguiente view:

Si no creamos una entrada en el diccionario de datos, el SP SP_Presupuestos ser buscado y ejecutado en el datasource
de la empresa logueada.
Para definir un datasource distinto, deberemos creer una entrada en el diccionario de datos como por ejemplo la siguiente:

Lo importante aqu es que el campo Nombre clase de la entrada del diccionario de datos coincida con el campo
Metodo de la view. De este modo, segn el ejemplo, el SP ser buscado y ejecutado en el origen de datos BSA2.
Como puede apreciarse, no es necesario definir una referencia a un diccionario de datos determinado en la view, como as
tampoco es necesario definir el campo Nombre Tabla en el diccionario.

Web Chart
Este proyecto se encarga de la generacin de grficos. Para la impresin de los grficos se utilizan objetos flash,
provistos por www.fusioncharts.com
La clase principal de ste mdulo es FAFChart, que implementa el mtodo getHtml, que dado un FAFDataset y las
columnas a graficar, devuelve el cdigo html del grfico generado.
FafChart

FactoryCharts
+

getChart(String) : FafChart

titulo: String
request: HttpServletRequest
ancho: int
alto: int
dataset: FafDataSetVO = null
column1: String
column2: String

+*
+
+
#
#
+
+
+
+
+
+
+
+
+
+
+
+
+
+

getHtml(FafDataSetVO, String, String, int, int) : String


getHtml() : String
getDetalle(FafDataSetVO, String) : String
getValues(FafDataSetVO, String, String) : HashMap
getColor() : String
getTitulo() : String
setTitulo(String) : void
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
getAlto() : int
setAlto(int) : void
getAncho() : int
setAncho(int) : void
getColumn1() : String
setColumn1(String) : void
getColumn2() : String
setColumn2(String) : void
getDataset() : FafDataSetVO
setDataset(FafDataSetVO) : void

PieChart3D
+

AreaChart

getHtml(FafDataSetVO, String, String, int, int) : String


+

getHtml(FafDataSetVO, String, String, int, int) : String

PieChart
BarChart
+

getHtml(FafDataSetVO, String, String, int, int) : String


+

LineChart
+

Contenido Web

getHtml(FafDataSetVO, String, String, int, int) : String

getHtml(FafDataSetVO, String, String, int, int) : String

BarChart3D
+

getHtml(FafDataSetVO, String, String, int, int) : String

La funcin de este mdulo es la de mostrar contenidos (artculos, notas, videos de youTube, blogs, etc) Los
contenidos se administran a travs de la clase ContenidoVO y ContenidoHLP de openFrame, y se almacenan en las tablas
FAFContenido, FAFContenidoArchivos y FAFContenidosRelacionados.
Existe adems el concepto de Canal que identifica a una view de tipo ContentView. Los contenidos se asocian a un
canal principal y a posibles canales relacionados. Por ejmplo, podemos tener un Contenido que sea una noticia, que est
asociado a un canal novedades home y a los canales novedades Ceres y novedades Agropuerto.
Los contenidos se cargan desde el administrador de contenidos, cuando se guardan, se genera un xml con la
informacin de dicho contenido y se guarda en un campo de la tabla FAFContenido.
Ya que la visualizacin de un contenido, es muy dinmica y depende del tipo de contenido que se est mostrando,
estilos del sitio, etc. se utiliza un XSLT para transformar el xml que representa al contenido (el que se guarda en el
campo de FAFContenido) en cdigo HTML. Este XSL se configura en el xml de la vista (o canal) correspondiente. Se
utilizan dos XSL, uno para mostrar un contenido en forma completa (la noticia entera) y otro para mostrar una lista de
contenidos (TOP 5 de noticias por ej)

Indicador Web
Los Indicadores (gauges) son componentes grficos que permiten mapear un valor dentro de una escala definida. La
implementacin es bastante parecida a la de los grficos, y se utiliza una solucin provista por el mismo fabricante
www.fusioncharts.com
La clase IndicadorVO (Framework) representa a la entidad indicador, que se mapea con la tabla FAFIndicador.
Bsicamente lo que definimos en el indicador es indicar un mecanismo para obtener un valor, que luego se mapear en
una escala.
Cuando definimos el indicador, podemos decir que el valor del mismo estar dado por una constante, la ejecucin de
un mtodo, o un stored procedure. En el caso de que se trate de stos dos ltimos, se podrn indicar parmetros.

Cuando se define una view de tipo Gauge, se debe indicar que indicador tendr asociado.
Hay tres tipos de indicadores: Velocmetros, Semforos y Termmetros. Una view de tipo Indicador, tiene un xml de
configuracin asociado a la vista, donde se configuran las escalas, el tipo de indicador a mostrar, etc.
Un ejemplo de un xml para una vista de tipo indicador es:

<Indicador>
<Config Nombre="Rentabilidad Resultados Operativos/Capital de Trabajo"
="4" Tipo ="Velocimetro" Accion ="openAppItem(33)" NumberSuffix=" "/>

Valor_Estandar

<Escalas>
<Escala name="Horrible" Desde="0" Hasta="15" Image="" Status="Critical"/>
<Escala name ="Cuidado!" Desde="15" Hasta="20" Image="" Status="Warning"/>
<Escala name="Ok" Desde="20" Hasta="50" Image="" Status="Low"/>
</Escalas>
</Indicador>

model::EscalaVO

Indicador
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-

Indicador(IndicadorVO)
getAplicacion() : String
setAplicacion(String) : void
getConfig() : HashMap
setConfig(Collection) : void
isAutoRefresh() : boolean
setAutoRefresh(boolean) : void
getEmpresa() : String
setEmpresa(String) : void
getEscalas() : Collection
setEscalas(Collection) : void
getFacade() : Object
setFacade(Object) : void
getFormDefinition() : String
setFormDefinition(String) : void
getFormName() : String
setFormName(String) : void
getIdioma() : String
setIdioma(String) : void
getSessionID() : String
setSessionID(String) : void
getSessionIDExterna() : String
setSessionIDExterna(String) : void
getUserLogicViewList() : HashMap
setUserLogicViewList(HashMap) : void
getUserViewList() : Collection
setUserViewList(Collection) : void
getViewID() : String
setViewID(String) : void
getHashRequest() : HashMap
setHashRequest() : void
getOutput() : PrintWriter
setOutput(PrintWriter) : void
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
getResponse() : HttpServletResponse
setResponse(HttpServletResponse) : void
getHtml() : String
getData() : HashMap
setData(Collection) : void

+
+
+
+
+
+
+

getImage() : String
setImage(String) : void
getNombre() : String
setNombre(String) : void
getStatus() : String
setStatus(String) : void
compareTo(EscalaVO, EscalaVO) : Integer

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

IndicadorVO(String, String, Object, PrintWriter, HttpServletRequest, HttpServletResponse, String)


IndicadorVO(String, String, Object, PrintWriter, HttpServletRequest, HttpServletResponse, String, Collection, HashMap)
setFormName(String) : void
setInputStream(String) : void
setFacade(Object) : void
setPrintWriter(PrintWriter) : void
setRequest(HttpServletRequest) : void
setResponse(HttpServletResponse) : void
setSessionID(String) : void
setUserViewList(Collection) : void
getFormName() : String
getInputStream() : String
getFacade() : Object
getPrintWriter() : PrintWriter
getRequest() : HttpServletRequest
getResponse() : HttpServletResponse
getSessionID() : String
getUserViewList() : Collection
setUserLogicViewList(HashMap) : void
getUserLogicViewList() : HashMap

model::IndicadorVO
*

helper::IndicadorHLP
+
+
+
+

setFormDefinition(String) : void
getFormDefinition() : String
getIndicadorData(FAFContentEJB, HttpServletRequest, HttpServletResponse, String, PrintWriter, long) : IndicadorVO
processException(HttpServletRequest, PrintWriter, Exception) : void

Gauge
-

escala: EscalaVO
valor: String
escalas: Collection
statusColor: HashMap
config: HashMap

+
+*
+
+
+
+
+
+
#
#
+
+
+
+

Gauge(String, Collection, HashMap)


getHtml() : String
getEscala() : EscalaVO
setEscala(EscalaVO) : void
getEscalas() : Collection
setEscalas(Collection) : void
getValor() : String
setValor(String) : void
getMax() : long
mapearValorEnEscala(String) : EscalaVO
getEscalasByStatus(Collection, String) : Collection
ordenarEscalas(Collection, boolean) : Collection
getStatusColor(String) : String
getConfig() : HashMap
setConfig(HashMap) : void

Velocimetro

Semaforo

Termometro
+
+
-

Velocimetro(String, Collection, HashMap)


getHtml() : String
getXmlVelocimetro() : String

+
+
-

Termometro(String, Collection, HashMap)


getHtml() : String
getXmlDatos() : String

+
+
-

Semaforo(String, Collection, HashMap)


getHtml() : String
getXml() : String

Al momento de mostrar una view de tipo Gauge, lo que se hace es:

parsear el xml de la vista, para obtener la configuracin de las escalas, tipo de gauge, etc.
Obtener el valor asociado al indicador, desde el mtodo, sp u constante correspondiente.
Obtener una instancia del gauge correspondiente (Velocmetro, Semforo, Termmetro) y llamar al mtodo
para pintarlo, pasandole el valor a mapear y las escalas.

Diccionario de Datos - Campos adicionales


Seguir los siguientes pasos para agregar un campo adicional:
1.
2.
3.

Definir la entrada de tipo clase en el diccionario de datos, indicando: clase VO, nombre de tabla, origen de
datos y los atributos adicionales.
Agregar el campo a la tabla por SQL.
Agregar el widget al XML usando el nombre del campo como classProperty.

JasperReports
El FAFReport es una alternativa para mostrar reportes, sin embargo puede haber algunos casos en el que se necesite mas
poder a la hora de generar un reporte, como por ejemplo, la impresin de un balance. Para ello es posible armar un
reporte utilizando la herramienta Jasper Reports e invocarlo desde la aplicacin.
El formato de este tipo de reportes queda almacenado en un XML, que puede generarse utilizando alguna herramienta para
editar reportes Jasper, como por ejemplo iReport o Jasper Assistant.
Estos reportes tomarn los datos desde un CustomDatasource, de esta manera ser posible mostrar informacin que est
almacenada en una base de datos, un archivo XML, etc.
Veamos un ejemplo de cmo implementar un reporte sencillo, para ello es necesario definir una clase que obtenga los
datos a mostrar.

package app.ceres.reportes;
import
import
import
import
import
import
import
import
import
import
import
import

java.sql.ResultSet;
java.sql.*;
faf.app.base.security.session.SessionHLP;
faf.app.base.security.session.model.SessionVO;
java.util.Collection;
java.util.Hashtable;
java.util.Map;
java.util.Vector;
faf.app.base.data.db.DBHelperManager;
faf.app.base.data.db.iface.DBHelper;
faf.app.base.data.db.iface.QueryBuilder;
faf.app.base.exceptions.FunctionalException;

public class EstablecimientosDS {


private SessionVO session=null;
private Map params = null;
public
EstablecimientosDS(String
sessionID,
Map
FunctionalException{
this.session = SessionHLP.getSession(sessionID);
this.params = parameters;
}

parameters)

throws

public Collection getData() throws FunctionalException{


ResultSet rs=null;
Collection datos =null;
try {
DBHelper dbh = null;
dbh
DBHelperManager.getInstance().getDBHelper(session.getEmpresaDatos());
QueryBuilder qb = dbh.getNewQueryBuilder();
PreparedStatement ps;
qb.addField("LF_ID");
qb.addField("Nombre");
qb.addField("Codigo");
qb.addTable("vEstablecimiento");

ps = qb.getSelectStatement();
rs = ps.executeQuery();
datos = new Vector();
for (;rs.next();){
Hashtable registro = new Hashtable();
for (int i=1;i<=rs.getMetaData().getColumnCount();i++){
String col = rs.getMetaData().getColumnName(i).toUpperCase();
String valor = rs.getString(i);
if (valor==null) valor = "sin asignar";
registro.put( col,valor);
}

datos.add(registro);
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
return datos;
}
}
Ntese que fue necesario definir el mtodo getData() para obtener la coleccin que contendr la informacin a
mostrar. En esta implementacin en particular tomamos la informacin desde la base de datos, pero podramos haberla
tomado desde un archivo, o cargar la coleccin con datos generados en runtime por algn proceso especfico.
Luego es necesario crear un XML que describa el diseo del reporte. En este punto se puede utilizar alguna
herramienta como iReports o Jasper Assistant para facilitar el diseo del mismo.
Nota: es necesario que el XML se llame igual que la clase, por ej. Para la clase EstablecimientosDS el XML debera
llamarse EstablecimientosDS.jrxml
Finalmente, es necesario ver cmo le indicamos al Framework que muestre el reporte. Para ello debemos hacer dos
cosas:

Crear un appitem que apunte a la clase creada.

Crear una entrada en el diccionario de datos configurando el origen de datos segn corresponda.

AppItems
Un AppItem es una abstraccin de una prestacin del sistema. Los AppItems se pueden categorizar dependiendo del tipo de
presentacin:

Vista: muestra un FAFReport. Se utiliza mas que nada para la generacin de ABMs y reportes.

Link Interno: carga una pgina dentro del dominio de la aplicacin. Algunas veces es necesario armar alguna
pgina adhoc dentro de la aplicacin, para poder acceder a esa pgina se debe configurar el appitem como
Link Interno.

Link Externo: realiza la redireccin hacia una pgina cualquiera.

WebPart: sirve para combinar varios appItems, de forma tal que en una misma pantalla podamos ver, por
ejemplo, un FAFReport, un reporte, y una pagina web.

Report: muestra un reporte jasper. Cuando se tiene un reporte complejo, y que no se desea analizar el
resultado en una grilla, podemos construir un reporte jasper que tendr mas potencia para realizar saltos de
pginas, frmulas, sumarizaciones, etc.

Veamos la pantalla de carga de un AppItem:

Campos generales
En la primer solapa se carga la informacin general de un AppItem. Veamos con mayor detalle algunos de los campos:
Tipo de Presentacin: Se deber elegir entre algunos de los tipos anteriormente mencionados.
Mtodo: Indica el origen de los datos. En el caso de los AppItems de tipo Link o Report, es el mtodo que se ejecutar para
obtener la informacin a mostrar. Para los dems tipos, indica la pgina que se desea acceder.
Tipo: Puede ser Link o mtodo remoto. No se utiliza actualmente.
Accin Principal: permite especificar la accin que se ejecutar por defecto.
Soporta Orden: sirve para indicar si el mtodo que se encargar de obtener los datos soporta orden o no.
Entidad: Indica si lo que se est mostrando es una entidad. Cuando El AppItem es de tipo Vista se utilizar este campo para
agregar las acciones de Nuevo y Borrar al FAFReport, como as tambin la posibilidad de editar el registro seleccionado.
ClaseVO y ClaseFacade: Se utilizan cuando el AppItem es de tipo Vista y se trata de una Entidad. Estas clases sirven para
indicarle al framework la naturaleza de la clase con la que est operando, es decir, de que entidad se trata y cual es el
facade utilizado para acceder a las reglas de negocio.
Parmetros
Es posible indicar parmetros para un AppItem. De esta manera, por ejemplo, cuando estemos en un AppItem de tipo Vista,
podremos seleccionar los parmetros de la consulta que estamos viendo.

Si analizamos la solapa de parmetros puede ser que nos resulten familiares algunas de los campos a cargar. En realidad
cada parmetro se corresponde con la definicin de un widget, por lo que los campos que debemos llenar no son mas que
algunos datos relevantes que necesitamos para mostrar cada uno de los widgets.
Acciones
Tambin se pueden indicar acciones adicionales para un determinado AppItem. En este caso, cuando el AppItem sea de tipo
Vista, se mostrarn las acciones aqu definidas en la toolbar de acciones adicionales.

Puede haber dos tipos de acciones:

Link: la ejecucin de la accin implica la redireccin hacia la pgina indicada en el campo Accin.

Mtodo Remoto: Al disparar esta accin se proceder a ejecutar el mtodo indicado dentro del campo accin.
Es necesario indicar el facade donde residir el mtodo en la solapa general.

Tree Grid
Este tipo de view permite mostrar una grilla arborizada. A diferencia de una view de tipo DataSetView, la TreeGrid muestra
la grilla a partir de una consulta sql indicada en una entrada en el diccionario de datos y no de un mtodo o sp.
Entonces, al dar de alta una view de tipo TreeGrid, es necesario indicar la entrada en el diccionario de datos que
representar. En dicha entrada, sern mandatarios los siguientes campos: Nombre de clase, Nombre de tabla y SQL para
grillas.
model::TreeGridVO
TreeGrid
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

TreeGrid(WebReportVO)
getCampoPK(String) : String
getHtml() : String
getHtmlGrilla(Long, Long, String, String, String) : String
getActions() : Collection
setActions(Collection) : void
getAlerts() : Collection
setAlerts(Collection) : void
getAtribs() : HashMap
setAtribs(Collection) : void
getFields() : Collection
setFields(Collection) : void
getGroupsBy() : Collection
setGroupsBy(Collection) : void
getModel() : WebReportVO
setModel(WebReportVO) : void
getOrdersBy() : Collection
setOrdersBy(Collection) : void
getReports() : Collection
setReports(Collection) : void
getWidgets() : Collection
setWidgets(Collection) : void
getWidgetsAdic() : Collection
setWidgetsAdic(Collection) : void
getIdNavMenu() : String
getFAFViewId() : String
getAppItemID() : String
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
setAppItemID(String) : void
getModoDisplayDF() : String
getT oolbar() : Toolbar
setToolbar(Toolbar) : void

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

TreeGridVO(String, String, Object, PrintWriter, HttpServletRequest, HttpServletResponse, String)


TreeGridVO(String, String, Object, PrintWriter, HttpServletRequest, HttpServletResponse, String, Collection, HashMap, Long)
setFormName(String) : void
setInputStream(String) : void
setFacade(Object) : void
setPrintWriter(PrintWriter) : void
setRequest(HttpServletRequest) : void
setResponse(HttpServletResponse) : void
setSessionID(String) : void
setUserViewList(Collection) : void
getFormName() : String
getInputStream() : String
getFacade() : Object
getPrintWriter() : PrintWriter
getRequest() : HttpServletRequest
getResponse() : HttpServletResponse
getSessionID() : String
getUserViewList() : Collection
setUserLogicViewList(HashMap) : void
getUserLogicViewList() : HashMap
getAppItemID() : Long
setAppItemID(Long) : void

toolbar::Toolbar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-

getAppItemID() : String
setAppItemID(String) : void
setVisible(boolean) : void
isVisible() : boolean
Toolbar(String)
setIdioma(String) : void
getIdioma() : String
getRequest() : HttpServletRequest
setRequest(HttpServletRequest) : void
getName() : String
toHtml(PrintWriter, Collection) : void
getHTML(Collection) : String
getEmpresa() : String
setEmpresa(String) : void
getHtmlDivActionList(Collection) : String
getCaption(ActionVO) : String
getURLDynamicForm(String, String, String, String, HttpServletRequest) : String

TreeGrid: Es la clase principal, tiene asociado un model y una toolbar. sta clase tiene la lgica para generar el cdigo
html a mostrar.
TreeGridVO: Se utiliza para guardar configuracin, datos de la session, request, xml, etc.
Toolbar: Especifica la toolbar para el TreeGrid. Implementa el mtodo getHtml().
Cuando se accede a una view de tipo TreeGrid, se realizan las siguientes acciones:

Obtiene la entrada en el diccionario de datos asociada a la view.

Obtiene una instancia de la toolbar y el model.

Crea una instancia de WidgetGrid, llamando al mtodo faf.app.base.data.tree.ArbolEntidadHLP.getHojas,


pasndole como parmetro la entrada en el diccionario de datos.

A partir de la entrada en el diccionario de datos, el mtodo getHojas sabe el Query que debe ejecutar para
llenar la grilla.

En este punto, tenemos definida la toolbar y el widgetGrid, con ambos se genera el cdigo html a imprimir en
la pgina.
Para imprimir el rbol, se agrega el llamado a la funcin TREEGRIDLoadTree, que se ejecutar cuando se cargue
la pgina (Mediante la funcin addLoadEvent).

WebPart
El proyecto WebPart permite configurar paneles basados en views preexistentes.
Un panel se configura mediante un xml asociado a la vista. Este xml se construye de una manera muy simple, en base a
rows, cells y tabs.
Tags relativos al panel
Behavior: El tag behavior = boxed indica que se mostrarn barras de scroll.
Toolbar: El tag toolbar =true/false indica si se muestra o no la toolbar del panel.
Vinculacin de parmetros
Es posible vincular parmetros en el panel, de esta manera, se pueden tener parmetros generales que se trasladarn
a las views contenidas en el mismo.
Tags relativos a las celdas
ID: Especifica el ID de la View a mostrar
ColSpan: indica si la celda se va a expandir en varias celdas.
Width: especifica el ancho, puede ser indicado en porcentaje o pixels
Height: especifica el alto, puede ser indicado en porcentaje o pixels
Tipo: En el caso de una DataSet View, permite indicar si se ver como Grilla, Grfico o Cubo
Scrollbars: Indica si se muestrar scrollbars en la celda
MostrarControles: Permite indicar si se muestra o no la toolbar principal de la view
MostrarToolbarAdicional: Permite indicar si se muestra o no la toolbar adicional principal de la view
LinkRelacionado: Permite indicar una View relacionada que se acceder al hacer clic sobre el mas en el ttulo de la
celda.

<panel behavior="boxed" nombre="nombre" height="600px" toolbar="true">


<params>
<param Name="Pestablecimiento1" Caption="Establecimiento"
Visible="true" Value=""
Type="WidgetSelector"
ClassReference="faf.client.selector.helpers.SelectorGenericoHLP"
FillMethodType="1"
FillMethodOptions="findAll"
DefaultValue="28"
OnChange="WDGSelectorArbolizadoPasarValor('29','Pestablecimiento1','Pestablecimiento
');"
ExtraProperties="ESTABLECIMIENTO"
/>
<param Name="Pestablecimiento" Caption="Establecimiento"
Visible="false" Value=""
Type="WidgetSelector"
ClassReference="faf.client.selector.helpers.SelectorGenericoHLP"
FillMethodType="1"
FillMethodOptions="findAll"
OnChange="alert(document.formParams.scriptVinculacion);"
ExtraProperties="Tablename=ESTABLECIMIENTO|multiselect=false|arbolizado=true|
required=false"
/>

<param
Name="fechaDesde"
Caption="Fecha
Desde"
Visible="true"
Value=""
Type="WidgetFecha"
ClassReference=""
FillMethodType=""
DefaultValue="[faf.app.base.util.ClientFunctions.getCurrentDate]"
FillMethodOptions=""
OnChange="alert(document.formParams.scriptVinculacion);"
ExtraProperties=""
/>
<param
Name="fechaHasta"
Caption="Fecha
Hasta"
Visible="true"
Value=""
Type="WidgetFecha"
ClassReference=""
FillMethodType=""
DefaultValue="[faf.app.base.util.ClientFunctions.getCurrentDate]"
FillMethodOptions=""
OnChange="alert(document.formParams.scriptVinculacion);"
ExtraProperties=""
/>
</params>
<rows>
<row>
<col
id="208"
colspan="1"
width="33%"
height="150px"
tipo="Grid"
scrollbars="false"
mostrarControles="false"
mostrarToolbarAdicional="false"
linkRelacionado="">
</col>
<col
id="207"
rowspan="2"
colspan="1"
width="67%"
height="400px"
tipo="Grid"
scrollbars="false"
mostrarControles="false"
mostrarToolbarAdicional="false"
linkRelacionado="86">
</col>
</row>
<row>
<col
id="241"
colspan="1"
width="33%"
height="150px"
tipo="Grid"
scrollbars="false"
mostrarControles="false"
mostrarToolbarAdicional="false"
linkRelacionado="86">
</col>
</row>
<row>
<col
id="187"
colspan="2"
width="100%"
height="600px"
tipo="Grid"
scrollbars="true"
mostrarControles="true"
mostrarToolbarAdicional="false"
linkRelacionado="86">
</col>
</row>
</rows>
</panel>

helper::WebPartHLP
+
+
+

setFormDefinition(String) : void
getFormDefinition() : String
getWebPartData(FAFContentEJB, HttpServletRequest, HttpServletResponse, String, PrintWriter) : WebPartVO

WebPart
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

setSessionID(String) : void
getSessionID() : String
setIdioma(String) : void
getIdioma() : String
setValuedWidgets(Collection) : void
getBehavior() : String
setBehavior(String) : void
setFormMethod(String) : void
getFormMethod() : String
hasToolbar() : boolean
hasToolbarActions() : boolean
setToolbar(boolean) : void
setToolbarActions(boolean) : void
getFacade() : Object
setXmlFormDefintion(String) : void
getXmlFormDefinition() : String
setFields(Collection) : void
WebPart(WebPartVO)
doIt() : void
toHtml() : void
getHtml() : String

model::WebPartVO
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

WebPartVO(String, String, Object, PrintWriter, HttpServletRequest, HttpServletResponse, String)


WebPartVO(String, String, Object, PrintWriter, HttpServletRequest, HttpServletResponse, String, Collection)
setFormName(String) : void
setInputStream(String) : void
setFacade(Object) : void
setPrintWriter(PrintWriter) : void
setRequest(HttpServletRequest) : void
setResponse(HttpServletResponse) : void
setSessionID(String) : void
setUserViewList(Collection) : void
getFormName() : String
getInputStream() : String
getFacade() : Object
getPrintWriter() : PrintWriter
getRequest() : HttpServletRequest
getResponse() : HttpServletResponse
getSessionID() : String
getUserViewList() : Collection

Row Container
toolbar::Toolbar
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

setIsSelector(boolean) : void
isSelector() : boolean
setCurrentPage(int) : void
Toolbar(String)
getViewUserList() : Collection
setViewUserList(Collection) : void
getLogicViewList() : HashMap
setUserLogicViewList(HashMap) : void
setOptionSelected(String) : void
getOptionSelected() : String
setIdioma(String) : void
getIdioma() : String
toHtml(PrintWriter) : void
getHTML() : String
getAplicacion() : String
setAplicacion(String) : void
getEmpresa() : String
setEmpresa(String) : void
getAppItemID() : String
setAppItemID(String) : void

+
+
+
+
+
+
+
+
+
+
+

getBehavior() : String
setBehavior(String) : void
RowContainer()
addAppItem(CellContainer) : void
getWebPartWidgets() : Collection
setWebPartWidgets(Collection) : void
isCurrent() : boolean
setCurrent(boolean) : void
getAppItems() : Collection
setAppItems(Collection) : void
getHtml(PrintWriter, Object, HttpServletRequest, HttpServletResponse, Collection) : String

CellContainer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

getBehavior() : String
setBehavior(String) : void
CellContainer()
CellContainer(String, String, String, String, String, String)
setID(String) : void
setWIDTH(String) : void
setHEIGHT(String) : void
setTITLE(String) : void
getTITLE() : String
setTIPO(String) : void
setMOSTRARCONTROLES(String) : void
getMOSTRARCONT ROLES() : boolean
setPARAMETERS(Vector) : void
setROWSPAN(String) : void
setCOLSPAN(String) : void
setCLASSSTYLE(String) : void
setSCROLLBARS(String) : void
setSHOWINFRAME(String) : void
getId() : String
getWidth() : String
getColSpan() : String
getRowSpan() : String
getClassStyle() : String
getScrollBars() : boolean
getShowInFrame() : boolean
getHtml(PrintWriter, Object, HttpServletRequest, HttpServletResponse, Collection) : String
getWebPartWidgets() : Collection
setWebPartWidgets(Collection) : void
calculaWidth(String, String) : String

Construccin de paginas Adhoc


Esquema general
Aspectos a tener en cuenta
Acceso a datos del framework

Construccin de aplicaciones (workshop)


Definicin del proyecto y planificacin de clases e interfaces
Creacin de un nuevo proyecto
Creacin de la base de datos
Creacin del men de la aplicacin
Creacin de las clases facade
Creacin de las clases helpers
Definicin y customizacin de formularios
Definicin y customizacin de Informes
Creacin de un pagina adhoc
Creacin de un reporte adHoc

Especificacin de implementacin ABM


Descripcin breve
Un ABM, se implementa a travs de la descripcin de un Entity Form un FAFReport. El cual consiste en una serie de
mapeos entre la base de datos y los widgets, dicho mapeo se logra gracias a la utilizacin de un archivo xml en el que se
definen las propiedades de los widgets y que atributo de los mismos se mapea.

Flujo de Acciones
En la siguiente tabla vemos una lista de los pasos a seguir para construir un nuevo ABM.
Paso

Accin

Implementar la clase VO, que mapear la estructura de la tabla en la base de datos.

Implementar la clase VO Helper, que se encargar de la funcionalidad requerida en combinacin con


EntidadHLP, que es el helper de entidades.

Agregar las clases definidas a los mapeos almacenados en clasesVO.xml y clasesHLP.xml

Generar un nuevo AppItem del tipo vista, para el manejo de la nueva entidad creada.

Crear una nueva tabla en el diccionario de datos para la entidad creada.

Agregar el AppItem en el rbol correspondiente al manejo de dicha entidad.


Pre-condicin: Debe existir el rbol.

Definir las prestaciones y permisos para los usuarios y grupos que se deseen.

Generar el xml para el Entity form encargado de mapear un widget con un atributo de una EntidadVO.

Generar el xml de mapeo para el FAF report.

Para nuestro caso de estudio vamos a desarrollar el ABM de frmulas, que es un ejemplo sencillo, para la aplicacin Ceres
Frutales

1. Implementacin de la clase VO
package app.ceres.formula.model;
import faf.app.base.entidad.model.EntidadPrimariaVO;
import faf.app.base.exceptions.FunctionalException;
public class FormulaVO extends EntidadPrimariaVO {
public FormulaVO(String sessionID)
throws FunctionalException {
super("FM_ID","vFormula",sessionID);
//no hay atributos propios para agregar
}
}

2. Implementacin de la clase HLP


package app.ceres.formula;
import
import
import
import
import
import
import
import
import
import

java.util.Collection;
app.ceres.formula.model.FormulaVO;
faf.app.base.data.FafResultSet;
faf.app.base.entidad.EntidadHLP;
faf.app.base.exceptions.FunctionalException;
faf.app.base.exceptions.SecurityException;
faf.app.base.exceptions.TechnicalException;
faf.app.base.security.session.model.SessionVO;
app.ceres.integration.Integration;
faf.app.base.util.SerializeUtil;

public class FormulaHLP extends EntidadHLP{


private static Collection findByPrimaryKey(String sessionID, int aBuscar) throws
SecurityException, FunctionalException, TechnicalException {
FormulaVO formula = null;
if (formula == null)
formula = new FormulaVO(sessionID);
else
formula.setSessionID(sessionID);
return findByPrimaryKey(formula, aBuscar);
}
public
static
FormulaVO
getByPrimaryKey(String
sessionID,
int
aBuscar)throws
SecurityException, FunctionalException, TechnicalException {
FormulaVO
formula
=
(FormulaVO)findByPrimaryKey(sessionID,aBuscar).iterator().next();
return formula;
}
public
static
Integer
insertar(FormulaVO
formula)
throws
SecurityException,
FunctionalException {
Integration.dispatch(formula,SerializeUtil.INSERT_METHOD);
return new Integer(0);
}

public
static
void
eliminar(FormulaVO
formula)
throws
SecurityException,
FunctionalException {
Integration.dispatch(formula,SerializeUtil.DELETE_METHOD);
}
public
static
void
modificar(FormulaVO
formula)
throws
SecurityException,
FunctionalException {
Integration.dispatch(formula,SerializeUtil.UPDATE_METHOD);
}
public static Collection findByString(String sessionID, String searchString) throws
SecurityException, FunctionalException, TechnicalException {
FormulaVO formula = null;
if (formula == null)
formula = new FormulaVO(sessionID);
else
formula.setSessionID(sessionID);
return findBySearchString(formula, searchString);
}
public
static
FafResultSet
findAll(SessionVO
session,
Collection
orders)
FunctionalException{
return findAll(new FormulaVO(session.getCryptedSessionID()));
}
public String getSelectorDescription(Integer pk,String sessionID){
String description = new String("");
try{
description = getSelectorDescription(new FormulaVO(sessionID),pk);
}catch(Exception e){}
return description;
}
}

3. Agregar las clases a los mapeos correspondientes.


En el archivo clasesVO.xml:

<fafClass>
<atribute name="name" value="FORMULAVO"/>
<atribute name="className" value="FORMULAVO"/>
<atribute name="FullClassName" value="app.ceres.formula.model.FormulaVO"/>
</fafClass>
En el archivo clasesHLP.xml:

<fafClass>
<atribute name="name" value="FORMULAVO"/>
<atribute name="className" value="FORMULAVO"/>
<atribute name="FullClassName" value="app.ceres.formula.FormulaHLP"/>
</fafClass>
4. Generar un nuevo AppItem para el manejo de la entidad.

throws

5. Crear una nueva entrada en el diccionario de datos.

6. Agregar el AppItem al rbol correspondiente.


Esto lo hacemos directamente desde la consola de SQL, agregando el ID del appitem creado en la tabla FAFArbolNodoHoja,
por ejemplo:

INSERT INTO FAFArbolNodoHoja(ArbolNodoID,ID,Orden) VALUES (8,61,32)

7. Definir las prestaciones y permisos.


Debemos definir las prestaciones Select, Insert, Update, Delete.

8. Generar el XML para el Entity Form.


<?xml version = '1.0' encoding = 'windows-1252' ?>
<widgetForm library="" onInit="">
<widgetTab name="Tab1">
<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="Nombre"
type="WidgetTextBox"
classProperty="nombre"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="true"
cols="1"
rows="1"
operation=""
caption="Nombre:SP;Name:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="Activo"
type="WidgetCheckBox"
classProperty="Activo"
javaType="java.lang.Integer"
visible="true"
readOnly="false"
required="false"
cols="2"
rows="1"
operation=""

caption="Activo:SP;Active:EN"
onEnter=""
onExit=""
valueName=""
value="0"
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="Codigo"
type="WidgetTextBox"
classProperty="Codigo"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="true"
cols="1"
rows="1"
operation=""
caption="Codigo:SP;Code:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="Descrip"
type="WidgetMemo"
classProperty="Descripcion"
javaType="java.lang.String"
visible="true"
readOnly="false"
required="false"
cols="1"
rows="1"
colSpan="4"
width="100%"
operation=""
caption="Descripcin:SP;Description:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
</widgetTab>
</widgetForm>

9. Generar el XML para el FAFReport.


<?xml version = '1.0' encoding = 'windows-1252' ?>
<root name="default">
<fields>
<field
name="Nombre"
url="FAF:EDIT:FormulaVO:formula;primaryKey=FM_ID"
order ="1" />

type="visible"
caption="Nombre:SP;Name:EN"

<field name="Codigo" type="visible" order ="2" caption="Codigo:SP;Code:EN"/>


<field
name="Descripcion"
caption="Descripcin:SP;Description:EN"/>
</fields>
</root>

type="visible"

order

="3"

Definicin XML del formulario de Laboreo


<?xml
version
=
'1.0'
encoding
onInit="refrescarLaboreo">
<widgetTab name="General">

'windows-1252'?><widgetForm

<widget
name="primaryKey"
type="WidgetTextBox"
classProperty="primaryKey"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="2"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties=""/>
<widget
name="AsientoTipo"
type="WidgetTextBox"
classProperty="AsientoTipoID"
classReference="faf.client.selector.helpers.SelectorGenericoHLP"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption="AsientoTipo:SP;AsientoTipo:EN"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType="1"
fillMethodOptions="findAll"
extraProperties=""/>
<widget
name="DocumentoTipo"
type="WidgetSelector"
classProperty="DocumentoTipoID"
classReference="faf.client.selector.helpers.SelectorGenericoHLP"
javaType="java.lang.Integer"
visible="true"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption="DocumentoTipo:SP;DocumentoTipo:EN"
onEnter=""
onExit=""
onClick="clearfilterSelector;filterSelectorText('AsientoTipo')"
valueName=""
value=""
fillMethodType="1"
fillMethodOptions="findAll"
extraProperties="DocumentoTipo"/>

library="laboreo"

. . .

</widgetTab>
<widgetTab name="Insumos" caption="Insumos:ES;Insumes:EN">
. . .
<widget
name="LaboreoItem"
type="WidgetLine"
classProperty="LaboreoItem"
javaType="java.util.Collection"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption=""
onEnter=""
onExit=""
valueName=""
fillMethodType=""
fillMethodOptions=""
extraProperties="">
<lines
cantRowsMin="3"
mappingClass="faf.app.fxi.laboreo.model.LaboreoItemVO">
<widget
name="Laboreo"
type="WidgetTextBox"
classProperty="LaboreoID"
javaType="java.lang.Integer"
visible="false"
readOnly="false"
required="false"
cols="1"
rows="1"
operation=""
caption="LaboreoID"
onEnter=""
onExit=""
valueName=""
value=""
fillMethodType=""
fillMethodOptions=""
extraProperties="" width="150"/>
</lines>
</widget>
</widgetTab>
</widgetForm>

cantRowsExtra="2"

Tratamiento de Exceptions
Introduccin
El tratamiento de errores y situaciones fuera de lo previsto, en JAVA se realiza mediante el mecanismo de Exceptions. El
Framework de Finnegans tiene declaradas cuatro clases que heredan de la clase nativa de JAVA Exception:
FafException extends Exception
FunctionalException extends FafException
TechnicalException extends FafException
SecurityException extends FafException

En general, nunca deberamos lanzar Exception, ni capturar Throwable. Exception es muy genrico como para lanzarlo, no
informa mucho que tipo de exception tira el mtodo, y dicha informacin puede usarse en tiempo de compilacin.
Throwable, tambin representa Errores de la mquina virtual, por ej. OutOfMemoryError, por lo que nunca deberamos
capturarlos, ya que por lo general son irrecuperables.
El compilador no obliga a lanzar explicitamente las Exceptions que hereden de Runtime Exception, es equivalente a que la
clusula throws RuntimeException est en cada declaracin de mtodo.

Templates de Exceptions para cdigo JAVA.


El siguiente template aplica a CUALQUIER mtodo JAVA, deber ser usado por todos los programadores. No pretende
manejar todos los casos, es un tratamiento general. Para algo particular se debe examinar y tratarlo de la manera ms
adecuada, aunque esta forma manejar la mayora de los casos.
public metodoA() throws FunctionalException, TechnicalException, SecurityException {
try{
/*Bloque de cdigo
*
*
*

}
}
}
}

}
}
}

*
*
*
*
*
*
*
*/
catch (FunctionalException fex){
throw fex;
catch (TechnicalException tex){
throw tex;
catch (SecurityException sex){
throw sex;
catch (CualquierOtraException cex){
String [] parametros = new String[]{"",""};
//usar alguna de estas opciones, en este rden de prioridad o preferencia.
throw new FunctionalException(FAFMensajes.GENERIC_FUNCTIONAL,"Detalle", parametros, cex);
throw new FunctionalException(FAFMensajes.GENERIC_FUNCTIONAL, "Detalle", cex);
throw new FunctionalException(FAFMensajes.GENERIC_FUNCTIONAL, cex);
catch (InvocationTargetException itex){
//el mensaje debe indicar el mdulo donde se produjo..
throw new FunctionalException(FAFMensajes.GENERIC_ERROR_FOUND, itex.getTargetException());
catch (Exception ex){
//el mensaje debe indicar el mdulo donde se produjo..
throw new FunctionalException(FAFMensajes.GENERIC_ERROR_FOUND, ex);
finally {//en el caso que se hubiere creado un dbh localmente.
try {
dbh.close();
} catch (Exception ex){
throw new FunctionalException(FAFMensajes.GENERIC_ERROR_FOUND, ex);
}

}
}
Los bloques throws y catch de FunctionalException, TechnicalException, SecurityException y CualquierOtraException no
pueden colocarse en el caso de que el cdigo contenido en el bloque try, no lance FunctionalException,
TechnicalException, SecurityException, o CualquierOtraException, respectivamente.
El throw del ltimo bloque catch, el mensaje debe indicar el mdulo donde fall el sistema. El bloque finally debe ir luego
de todos los catch, en el caso de que queramos hacer algo siempre, haya ocurrido o no una Excepcin. Este es el caso de
cerrar el DBHelper antes de terminar la llamada a la funcin.
Si los mensajes de Exceptions no llegan correctamente a la pantalla, el programador deber corregir en los lugares donde
no estn tratadas de manera correcta las exceptions, para que el caso funcione. Incluir informacin en el informe del
objetivo, de las clases involucradas en dichas modificaciones, en todos los casos. Tambin debe revisar que no afecte otras
funcionalidades.
Si el impacto es demasiado grande, debe discutirse la creacin de un objetivo nuevo para realizar dicha correccin.

Templates de Exceptions para cdigo JSP.


El siguiente template aplica a CUALQUIER pgina JSP que no sea llamada por AJAX, deber ser usado por todos los
programadores. No pretende manejar todos los casos, es un tratamiento general. Para algo particular se debe examinar y
tratarlo de la manera ms adecuada, aunque esta forma manejar la mayora de los casos.
Como prerrequisito, se necesita cargar en la pgina los archivos T_head.jsp, y fwkCommons.jsp, que son los que cargan
las libreras utilizadas por el tratamiento de errores de los bloques catch para mostrar los mensajes al usuario.
<html>
<head>
<%@ include file="./T_head.jsp"%>
<%@ include file="./fwkCommons.jsp"%>
</head>
<body >
<%
try {
/*Bloque de cdigo.
*
*
*
*

*
*
*
*
*
*
*
*
*
*/
} catch (InvocationTargetException itex){
%>
<%@ include file="./InvocationTargetExceptionManager.jsp"%>
<%
} catch (FafException fex){
%>
<%@ include file="./FunctionalExceptionManager.jsp"%>
<%
} catch (Exception cex){
%>
<%@ include file="./NativeExceptionManager.jsp"%>
<%
}
%>
</body >
</html>

Si los mensajes de Exceptions no llegan correctamente a la pantalla, el programador deber corregir en los lugares donde
no estn tratadas de manera correcta las exceptions, para que el caso funcione. Incluir informacin en el informe del
objetivo, de las clases involucradas en dichas modificaciones, en todos los casos. Tambin debe revisar que no afecte otras
funcionalidades.
Si el impacto es demasiado grande, debe discutirse la creacin de un objetivo nuevo para realizar dicha correccin.

JSP llamado mediante AJAX.


En el caso de que un jsp se cargue mediante AJAX, como el caso de editor.jsp, ajaxInvoke.jsp, etc, debe usarse el siguiente
template:
try {
/*Bloque de cdigo.
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
} catch (InvocationTargetException itex){
%>
<%@ include file="./InvocationTargetExceptionAJAXManager.jsp"%>
<%
} catch (FafException fex){
%>
<%@ include file="./FunctionalExceptionAJAXManager.jsp"%>
<%
} catch (Exception cex){
%>
<%@ include file="./NativeExceptionAJAXManager.jsp"%>
<%
}

Templates de Exceptions para cdigo JavaScript.


El siguiente template aplica a CUALQUIER funcin JavaScript, deber ser usado por todos los programadores. No pretende
manejar todos los casos, es un tratamiento general. Para algo particular se debe examinar y tratarlo de la manera ms
adecuada, aunque esta forma manejar la mayora de los casos.
function exceptionErrorAlert(xmlObj) {
try{
/*Bloque de cdigo.
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
}catch(ex){
jsExceptionAlert(ex);
throw ex;
}
}
Los nuevos mtodos para mensajes de usuario en JavaScript fueron colocados en el archivo ExceptionUtil.js.

Mensajes Funcionales en JavaScript.


Para mostrar un mensaje funcional al usuario, se debe usar ste mtodo:
showFunctionalMessage(titulo, mensaje);
Para utilizar directamente overlib, se crearon estos dos mtodos:
function showMessage(mensaje);
function showMessageDraggable(mensaje);
La funcin showMessage muestra un mensaje en un dilogo que no se puede desplazar con el mouse.
La funcin showMessageDraggable muestra un mensaje en un dalogo que se puede desplazar con el mouse.

Llamadas AJAX.
Siempre al recibir una respuesta AJAX, en todas las funciones callBack debemos verificar si no hubo un error. Para
realizar este chequeo se cre la funcin AJAXFinishWithNoErrors(xmlObj), la cual pasandole el xml recibido nos devolver
true si no se recibi un error. En el caso de que un error se haya recibido, la funcin devuelve false, y muestra una
ventana de alerta para mostrar al usuario la informacin del error recibido.

Ejemplo de uso en una funcin callBack.


function onChangeEjercicioCallback(){
try{
if (ajaxRequestComplete(document.objRequest)){
var xmlObj = document.objRequest.responseXML;
document.objRequest = null;
if(AJAXFinishWithNoErrors(xmlObj)){
var valor='';
var formName = '';
if (xmlObj.getElementsByTagName("ResponseData")[0].getAttribute("value1")!=null)
var
valor1
=
xmlObj.getElementsByTagName("ResponseData")
[0].getAttribute("value1");
if (xmlObj.getElementsByTagName("ResponseData")[0].getAttribute("value2")!=null)

var

valor2

xmlObj.getElementsByTagName("ResponseData")

[0].getAttribute("value2");
if
(xmlObj.getElementsByTagName("formName")!=null
&&
xmlObj.getElementsByTagName("formName")[0]!=null)
formName
=
xmlObj.getElementsByTagName("formName")
[0].childNodes[0].nodeValue;
var form = document.forms[formName];
setearValorWidget(form,'FechaDesde',valor1);
setearValorWidget(form,'FechaHasta',valor2);
}
}
getLoading().style.display = 'none';
}catch (ex){
jsExceptionAlert(ex);
throw ex;
}
}

JasperReports
Introduccin
Es una poderosa herramienta Open Source de reportes en Java que puede exportar sus reportes en un visualizador propio,
PDF, HTML, XLS, CSV y archivos XML.
Est totalmente escrita en java y puede ser usuado en cualquier aplicacin Java, incluyendo J2EE y Web Applications para
generar contenidos dinamicos.
URL:

http://jasperreports.sourceforge.net

Requerimientos

JDK 1.2.2+
SAX 2.0 XML Parser
Jakarta Commons Digester Component (v1.1+)
Jakarta Commons BeanUtils Component (v1.1+)
Jakarta Commons Collections Component (v1.0+)
Jakarta Commons Logging Component (v1.0+)
JDBC 2.0 Driver
iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares
Jakarta POI (v1.5.1+)

Funcionamiento
La definicin del reporte se aloja en un XML (ver Definicin XML). Para que pueda ser ejecutado el reporte este tiene
que estar compilado por la herramienta Jasper, se puede hacer en el momento (on the fly) o guardar el archivo ya
compilado (.jasper).

Instalacin
Usa la libreria que se encuentran en el directorio \Dist
jasperreports-0.6.1.jar que es la libreria de la aplicacin. Y las que se encuentran en el directorio \Lib que incluye
las librerias de XML Parsers, iText (para exportar a PDF), las de Yakarta, las de JDBC, etc.

iReports
Es una herramienta visual para desarrollar/armar/ejecutar reportes para JasperReports. Esta GUI nos permite
armar de una forma sencilla el XML que utilizar el Jasper. Tambin sirve para compilar el xml en un .jasper y
adems nos permite ejecutar el reporte y exportarlo en cualquiera de los formatos que de jasper. Es un free
software y est publicado bajo la licencia GNU GENERAL PUBLIC LICENSE.
http://ireport.sourceforge.net/
Requerimientos:

Sun JDK 1.4 or greater

Ant (required if you want recompile sources, but strongly reccomended to lunch iReport too)

JasperReports 0.4.6 (*)

SAX 2.0 XML Parser (Apache Xerces 1.3 or later recommended) (*)

Jakarta Commons Digester Component (version 1.1 or later) (*)

Jakarta Commons BeanUtils Component (version 1.1 or later) (*)

Jakarta Commons Collections Component (version 1.0 or later) (*)

Jakarta Commons Logging Component (version 1.0 or later) (*)

JDBC 2.0 Driver (A MySql driver is already included) (*)

iText - Free Java-PDF library by Bruno Lowagie and Paulo Soares (*)

Jakarta POI (version 1.5.1 or later) (*)

JFreeChart (version 0.9.8 or later) (*)


Instalacion:
1. Unzip iReport-x.x.x.zip.
2. Copiar el archivo tools.jar que se encuentra en el directorio del jdk y copiarlo en el directorio lib del
iReport.

Ejemplos:

Codigo comn:
//Se lee la definicin del reporte que est alojada en el xml
JasperDesign
jasperDesign
=
JasperManager.loadXmlDesign("path-to-your-jrxmlfile\\sample.jrxml");
//Se compila el XML
JasperReport jasperReport = JasperManager.compileReport(jasperDesign);
//Si se necesitan pasar parmetros se crea el Hash y se incluyen
Map parameters = new HashMap();
parameters.put("desde", varDesde);
parameters.put(hasta,varHasta);
//se le pasa los datos de la coneccion, si la necesita el datasource
Connection conn = Database.getConnection();

Para Exportar a un archivo en alguna ubicacin especial:


JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, conn);
//a un PDF
JasperManager.exportToPdfFile(jasperPrint,strDestino);
//a un HTML
JasperManager.exportToFile(jasperPrint,strDestino);
//a un XML
JasperManager.exportToXmlFile(jasperPrint,strDestino);

Para incluir el PDF como respuesta dentro del html:


byte[] bytes = JasperRunManager.runReportToPdf(jasperReport,parameters,conn);
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bytes, 0, bytes.length);
outputStream.flush();
outputStream.close();

Para incluir dentro del html en distintos formatos:


JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, parameters, conn);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = baos.toByteArray();
response.setContentLength(bytes.length);
En XML
JRXmlExporter exporter = new JRXmlExporter();
response.setContentType("text/Xml");
En Excel
JRXlsExporter exporter = new JRXlsExporter();
response.setContentType("application/vnd.ms-excel");
En HTML
JRHtmlExporter exporter = new JRHtmlExporter();
response.setContentType("text/Html");
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
exporter.exportReport();
try{
baos.close();
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
}
catch(Exception e){e.printStackTrace();}

Para que el reporte tenga un Custom DataSource:


Para utilizar un Custom DataSource hay que crear una clase que implemente a la clase JRDataSource, en esta
clase que que implementar los metodos:
public boolean next()
public Object getFieldValue(JRField field)
el primero verifica que el dataSource tenga un elemento siguiente, y el Segundo es el que devuelve el dato
segn el JRField.
Esta clase puede contener un constructor donde ubiquemos el datasource, o directamente se lo podemos pasar
como parmetro.
Ejemplo de un Custom DataSource que ejecuta un stored procedure con parmetros:

public class CustomDataSource2 implements JRDataSource {


private int index = -1;
private Connection conn;
private Map parameters;
private ResultSet rs;
public CustomDataSource2(Connection conn2, Map parameters2)
{
conn=conn2;
parameters=parameters2;
try{
CallableStatement cs = conn.prepareCall("Execute myproc2 '"
+
parameters.get("desde")
+
parameters.get("hasta") +"'");
rs = cs.executeQuery();
}catch(Exception e){};
}
public boolean next() throws JRException {
try{
return rs.next();
}catch(SQLException e){
return false;
}
}
public Object getFieldValue(JRField field) throws JRException {
try{
Object value = null;
String fieldName = field.getName();
if (fieldName.equals("Tipo"))
{
value = rs.getObject(1);
}
else if (fieldName.equals("Categoria"))
{
value = rs.getObject(2);
}
else if (fieldName.equals("Cuenta"))
{
value = rs.getObject(3);
}
else if (fieldName.equals("Movimiento"))
{
value = rs.getObject(7);
}
else if (fieldName.equals("Fecha"))
{
value = rs.getObject(5);
}
else if (fieldName.equals("Mes"))
{
value = rs.getObject(6);
}
return value;
}catch(SQLException e){
return null;
}
}

"','"

Definicin XML:
El documento XML que contiene la definicin del reporte define exactamente como, donde y que va a aparecer en el reporte, escribir este
documento manualmente no es muy prctico, aca es donde aparece la utilidad del iReport (entorno que crea el XML con un entorno
WYSIWYG). De todas formas este documento se puede editar con cualquier editor de textos, como el NotePad.
Este XML a su vez est definido con una estructura especial declarada en un DTD provisto por JasperReports.
El documento tiene que estar organizado de la siguiente forma:
<?xml version="1.0"?>
<!DOCTYPE jasperReport
PUBLIC "-//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="name_of_the_report" ... >
...
//Elementos
...
</jasperReport>

Elementos:

Parmetros:
Son referencias a objetos que son pasados para operaciones de filling del reporte.
Ejemplo:
<parameter name="ReportTitle" class="java.lang.String"/>
<parameter name="MaxOrderID" class="java.lang.Integer"/>

Data Source:
Soporta varios tipos de data sources usando la interface JRDataSource.
Ejemplo:
<queryString>
<![CDATA[ select pres_id,pres_form from prestacion order by pres_alias]]>
</queryString>

Fields
Los Report Fields sirven para mapear los datos desde el data source en el reporte.
Ejemplo:
Para los siguientes datos:

Column Name
Datatype
Length
-------------------------------------EmployeeID
int
4
LastName
varchar
20
FirstName
varchar
10
HireDate
datetime
8

Pgina 53 de 57

Podemos definir los siguientes fields en el reporte:


<field
<field
<field
<field

name="EmployeeID" class="java.lang.Integer"/>
name="LastName" class="java.lang.String"/>
name="FirstName" class="java.lang.String"/>
name="HireDate" class="java.util.Date"/>

Expressions
Las Expressions son Java Expressions que son usadas para declarar variables del reporte que sirven para ejecutar calculos, por ejemplo
para un Data Group en el reporte, etc.
Hay varios elementos que definen las Expresiones:
<variableExpression>,
<initialValueExpression>,
<groupExpression>,
<printWhenExpression>,
<imageExpression> and <textFieldExpression>.

Ejemplo:
<textFieldExpression>
$F{FirstName} + " " + $F{LastName}
</textFieldExpression> <!-- el $F{} significa el valor de un field -->
<textFieldExpression> "Total quantity : " + $V{QuantitySum} + " kg." </textFieldExpression> <!el $V{}
significa el valor de una variable -->

Variables
<variable name="QuantitySum" class="java.lang.Double"
resetType="Page" calculation="Sum">
<variableExpression>$F{Quantity}</variableExpression>
<initialValueExpression>new Double(0) </initialValueExpression>
</variable>

Existen varias variables built-in del sistema listas para usar sin definir en el reporte:
PAGE_NUMBER
COLUMN_NUMBER
REPORT_COUNT
PAGE_COUNT
COLUMN_COUNT
GroupName_COUNT

Report Sections
Existen las siguientes seccines:
<title>,
<pageHeader>,
<pageFooter>, <summary>.

<columnHeader>,

<groupHeader>,

<detail>,

<groupFooter>,

<columnFoter>,

Ejemplo:
<pageHeader>

Pgina 54 de 57

<band height="30">
<rectangle>
<reportElement x="0" y="0" width="555" height="25"/>
<graphicElement/>
</rectangle>
<staticText>
<reportElement x="0" y="0" width="555" height="25"/>
<textElement textAlignment="Center">
<font fontName="Helvetica" size="18"/>
</textElement>
<text>Northwind Order List</text>
</staticText>
</band>
</pageHeader>

Groups
<group name="pres_alias" isStartNewColumn="false" sStartNewPage="false">
<groupExpression>
<![CDATA[ $F{pres_alias}]]>
</groupExpression>
<groupHeader>
...
</groupHeader>
<groupFooter>
...
</groupFooter>
</group>

Pgina 55 de 57

Documentacin Tcnica FinnAp XII.................................................................................................................1

Seguimiento de documentacin.........................................................................................................................................1

Introduccin.............................................................................................................................................2

Arquitectura de n-Capas..................................................................................................................................................2
Web Server...............................................................................................................................................................3
Soporte Multilenguaje..................................................................................................................................................3
DynamicForm............................................................................................................................................................3
FAFReport.................................................................................................................................................................4
WebParts..................................................................................................................................................................4
Widgets................................................................................................................................................................... 4
Lgica de la aplicacin....................................................................................................................................................5
Facade....................................................................................................................................................................5
Business Logic Layer....................................................................................................................................................5
Gestor de Sesiones......................................................................................................................................................6
Seguridad.................................................................................................................................................................6
FAF Data Engine.........................................................................................................................................................6
Personalizacin..........................................................................................................................................................6
Auditoria..................................................................................................................................................................6
Gestor de errores........................................................................................................................................................6
Messaging Services......................................................................................................................................................6
Multilenguaje............................................................................................................................................................6

Detalles Tcnicos y de Desarrollo sobre el Framework........................................................................................7

Introduccin................................................................................................................................................................7
Plataforma................................................................................................................................................................7
Base de datos............................................................................................................................................................7
Diccionario de Datos.................................................................................................................................................8
Query Builder..........................................................................................................................................................8
FAFDataEngine y FAFDataSet........................................................................................................................................8
Interoperabilidad........................................................................................................................................................8
Clientes ricos y finos....................................................................................................................................................9
Funcionamiento general...............................................................................................................................................9
Componentes del framework............................................................................................................................................9
Entidades.................................................................................................................................................................9
Facade...................................................................................................................................................................11
1) Archivo ejb-jar.xml.................................................................................................................................................11
2) Archivo NombreBeanEJB.java....................................................................................................................................12
3) Archivo NombreBeanEJBBean.java..............................................................................................................................12
4) Archivo NombreBeanEJBHome.java.............................................................................................................................12
Sesiones.................................................................................................................................................................12
Seguridad................................................................................................................................................................12
Auditoria................................................................................................................................................................13
Errores...................................................................................................................................................................13
Multilenguaje...........................................................................................................................................................13
Interfaz del usuario....................................................................................................................................................13
Framework Web...........................................................................................................................................................13
Introduccin............................................................................................................................................................13
Multilenguaje...........................................................................................................................................................13
Widgets..................................................................................................................................................................14
DynamicForm...........................................................................................................................................................15
FAFReport...............................................................................................................................................................18
Explotacin de grillas....................................................................................................................................................21
Vincular un webReport a un datasource distinto al de la empresa logueada................................................................................22
Web Chart...............................................................................................................................................................23
Contenido Web.........................................................................................................................................................23
Indicador Web..........................................................................................................................................................24
Diccionario de Datos - Campos adicionales........................................................................................................................26
JasperReports..........................................................................................................................................................27
AppItems................................................................................................................................................................28

Pgina 56 de 57

WebPart.................................................................................................................................................................... 31
Construccin de paginas Adhoc......................................................................................................................................34
Construccin de aplicaciones (workshop)............................................................................................................................34
Especificacin de implementacin ABM...............................................................................................................................34
Descripcin breve......................................................................................................................................................34
Flujo de Acciones......................................................................................................................................................34

Tratamiento de Exceptions.........................................................................................................................42

Introduccin...............................................................................................................................................................42
Templates de Exceptions para cdigo JAVA........................................................................................................................42
Templates de Exceptions para cdigo JSP..........................................................................................................................43
Templates de Exceptions para cdigo JavaScript................................................................................................................45
Mensajes Funcionales en JavaScript................................................................................................................................45
Llamadas AJAX.........................................................................................................................................................45

JasperReports.........................................................................................................................................47

Introduccin...............................................................................................................................................................47
Requerimientos.........................................................................................................................................................47
Funcionamiento........................................................................................................................................................47
Instalacin..............................................................................................................................................................48
iReports..................................................................................................................................................................49
Requerimientos:.........................................................................................................................................................49
Instalacion:...............................................................................................................................................................49
Ejemplos:.............................................................................................................................................................50
Definicin XML:..................................................................................................................................................- 53 Elementos:........................................................................................................................................................- 53 -

Pgina 57 de 57

You might also like