Download tutorial de aries

Document related concepts
no text concepts found
Transcript
TUTORIAL DE ARIES
Contenido
Introducción..........................................................................................................................................................................................1
Qué es Aries......................................................................................................................................................................................1
A quién va dirigido este tutorial........................................................................................................................................................1
Primeros pasos .....................................................................................................................................................................................2
Preparar nuestro entorno de desarrollo...........................................................................................................................................2
Comenzar una nueva aplicación.......................................................................................................................................................2
Ejecutar la aplicación........................................................................................................................................................................4
Establecer el paquete principal de nuestra aplicación.....................................................................................................................5
El modelo de datos................................................................................................................................................................................6
Introducción......................................................................................................................................................................................6
Nuestro modelo de datos.................................................................................................................................................................6
Escribir las clases Java del modelo....................................................................................................................................................7
Gestión de productos............................................................................................................................................................................9
Gestión de pedidos..............................................................................................................................................................................13
Las líneas del pedido.......................................................................................................................................................................14
Introducción
Qué es Aries
Muy esquemáticamente: Aries es una plataforma de desarrollo orientada a la creación de aplicaciones JEE Web de Gestión, ricas
en interacción, y de alta productividad que utiliza los estándares más aceptados por el mercado y permite la programación 100%
Java.
Puede conocer todos los detalles de sus características, documentación adicional, descargas, etc. desde http://aries.seresco.es.
A quién va dirigido este tutorial
Este tutorial va dirigido a programadores que quieran dar los primeros pasos en Aries. Conviene que el programador que lea este
tutorial esté familiarizado con los conceptos de JEE.
Tutorial Aries - Seresco
Página 1
Primeros pasos
Preparar nuestro entorno de desarrollo
Aries es independiente de la herramienta de desarrollo, aunque se recomienda el uso de Eclipse. En principio, podríamos ir
obteniendo los diferentes componentes de desarrollo, cada uno de su lugar correspondiente. Por ejemplo, bajarnos el SDK de
Java, el Eclipse, el Tomcat, etc.
Sin embargo creemos que resulta más cómodo utilizar la distribución del puesto de desarrollo que ofrece Aries para puestos de
desarrollo Windows, en su forma de un programa instalable. En el sitio Web de Aries podemos obtener este instalador. La
instalación es muy sencilla y no supone intrusión en la máquina. Solamente crea el directorio c:\aries y un acceso directo a
Eclipse en el escritorio. El puesto de trabajo incluye Eclipse, SDK de Java, Tomcat, plugins, etc. Todo el software contenido en
este paquete es de libre distribución.
Comenzar una nueva aplicación.
Vamos a crear una nueva aplicación sobre la que trabajaremos durante este tutorial. Para ello seguimos los siguientes pasos
desde Eclipse:
Ejecutar: File – New – Dynamic Web Project.
Pulsamos Next y aparece la siguiente pantalla, en la cual nos
aseguraremos de dar el nombre de la aplicación, en nuestro
caso se llamará “pedidos”.
Si es la primera vez que creamos un proyecto puede que en
Target Runtime aparezca "None". En este caso tenemos que
pusar el botón "New..." para crear uno. Una vez pulsado
"New..." elegimos Apache/Apache Tomcat 6.0 y ponemos
como directorio c:\aries\tomcat, pulsamos Finish y ya
tenemos creado el Target Runtime.
Nos aseguramos también de que aparece seleccionado como
target Runtime el Apache Tomcat 6.0.
Pulsamos Finish para terminar de crear el proyecto.
Tutorial Aries - Seresco
Página 2
A continuación vamos a importar la aplicación Plantilla de
Aries con lo que conseguiremos obtener todas las librerías
necesarias y disponer de unos ficheros fuente con los que
empezar. Podemos descargarla del sitio público de Aries.
(http://aries.seresco.es/download/plantilla.zip) y dejarla en
nuestro disco duro.
Luego, vamos al menú de Eclipse y hacemos “Import ...”. En la
pantalla que nos aparece elegimos la opción “General /
Archive File”.
A continuación elegimos el archivo plantilla.zip que nos hemos
descargado.
Pulsamos “Finish”. Cuando salgan mensajes de confirmación
de sobrescritura los aceptamos todos. Con estos pasos ya
tenemos una aplicación en blanco lista para trabajar con ella.
Tutorial Aries - Seresco
Página 3
En general, trabajaremos con
la perspectiva “JEE” de Eclipse
que nos ofrece un conjunto de
ventanas apropiado para este
tipo de desarrollo. El aspecto
resultante del Eclipse una vez
realizados los pasos anteriores
sería más o menos como sigue:
Ejecutar la aplicación
En la pestaña "Servers", que normalmente aparece abajo en
nuestro espacio de trabajo debemos añadir el servidor Tomcat
6.0. Esto nos permitirá en lo sucesivo poder arrancarlo,
pararlo, añadirle aplicaciones etc. Para ello pinchamos sobre
la pestaña servers y pulsamos botón derecho y elegimos new /
server y escogemos el Tomcat v6.0 server de la lista. Pulsamos
Finish y ya tenemos el servidor preparado.
Tutorial Aries - Seresco
Página 4
Para ejecutar la aplicación por primera vez
necesitamos añadirla al servidor Tomcat que tenemos
preparado. Para ello vamos a la ventana “Servers” y
pulsando con botón derecho sobre el servidor
Tomcat , elegimos “Add and Remove Projects ...” . Nos
aparecerá la siguiente ventana:
En ella movemos nuestra aplicación de pedidos sobre
los Configured projects. Una vez hecho esto, pulsamos
Finish.
A continuación arrancamos el servidor pulsando botón
derecho sobre él y eligiendo la opción “Start”. Al
hacerlo se activa la ventana “Console” donde nos
aparecen diversas informaciones de depuración. La
importante es la última donde debe decir “Server
Startup in xxx ms”. Si el servidor no arranca diciendo
que tenemos el puerto 8080 ocupado, debemos dar
doble click sobre el servidor y utilizar otro puerto libre
cualquiera. en ese caso al probar debemos especificar
ese otro puerto en la URL que pongamos en el
navegador
Ya tenemos arrancado el servidor. Ahora abriremos un
navegador, y en él escribimos la dirección:
http://localhost:8080/pedidos. Nos aparecerá la
aplicación. Algo así como lo siguiente:
Como vemos, la aplicación Plantilla nos proporciona un menú de ejemplo básico y una pantalla de bienvenida.
Establecer el paquete principal de nuestra aplicación
La aplicación plantilla que hemos importado en nuestra aplicación Pedidos se distribuye bajo el paquete “es.seresco.plantilla”. A
continuación convendría modificar este paquete por el que consideremos oportuno para nuestra aplicación. Supongamos que
queremos usar el paquete “es.seresco.pedidos”.
Nos aseguraremos primero de elegir la representación de
paquetes jerárquica: En la ventana de Project Explorer,
pinchamos sobre el triángulo de la cabecera, elegimos
Package Presentation y Hierarchical
Tutorial Aries - Seresco
Página 5
Usamos la opción “Refactor - rename” de botón derecho
situados sobre el paquete “es.seresco.plantilla” cubrimos la
siguiente pantalla: (Es importante marcar todos los check y
poner “*” en el patrón para que lo cambie en todas partes.
El modelo de datos
Introducción
A menudo en el desarrollo de aplicaciones surge la duda de si empezar a desarrollar el modelo de datos desde Java o desde
herramientas externas para luego importar en Java. No es competencia de la plataforma determinar un orden determinado.
Sin embargo en el tutorial nos interesa desarrollar la aplicación sin la parafernalia de herramientas externas de forma que se
pueda hacer todo directamente desde nuestro IDE sin mayores problemas. Para este enfoque Hibernate nos ayudará bastante
puesto que es capaz de crear y actualizar la estructura de la base de datos mientras desarrollamos todo ello a partir de las clases
Java del modelo.
Otra opción, que no vamos a seguir en el tutorial sería utilizar Hibernate-Tools para hacer Ingeniería Inversa, lo cual nos
permitiría obtener las clases Java a partir de una estructura de base de datos existente. (Esto se puede consultar en la Wiki de
Aries).
En este tutorial utilizamos la base de datos HSQLDB (hsqldb.org) que tiene un motor muy liviano y la incluimos en el puesto de
desarrollo. Esta base de datos es muy útil para tutoriales y pruebas por su sencillez de configuración. De hecho, tal como viene la
aplicación plantilla preparada, no necesitamos configuración adicional ni arrancar ninguna otra tarea ya que el motor está
embebido en el servidor. Los datos, físicamente, se guardan en el directorio c:\aries\datos.
Nuestro modelo de datos
El modelo de datos de la aplicación es gráficamente el siguiente:
Tutorial Aries - Seresco
Página 6
class tutorial
Pedido
-
codPedi do: Integer
fecha: Date
1
1..*
LineaPedido
-
canti dad: Integer
codArti cul o: Integer
codPedi do: Integer
l inP edido: Integer
Producto
1..*
1 -
codProducto: Integer
descri pci on: S tring
preci o: B igDeci m al
Es decir, tenemos un conjunto de productos y sobre ellos permitiremos crear pedidos. Cada pedido tiene una o más líneas de
pedido y cada línea de pedido hace referencia a un producto y establece una cantidad a vender.
Escribir las clases Java del modelo.
Las clases del modelo se escriben en el paquete datos por debajo del paquete de aplicación. Se utilizan anotaciones JPA para
definir con precisión las propiedades de la tabla, claves, relaciones y datos.
Crearemos primero la Entidad “Producto”. Para ello vamos al paquete “es.seresco.pedidos.datos” y sobre él elegimos la opción
de botón derecho “new – Class”, le damos el nombre “Producto” y escribimos el siguiente código:
package es.seresco.pedidos.datos;
import java.math.BigDecimal;
import javax.persistence.*;
@Entity
public class Producto {
private Integer codProducto;
private String
descripcion;
private BigDecimal precio;
@Id
@Column(length=8)
public Integer getCodProducto() {
return codProducto;
}
@Column(length=50)
public String getDescripcion() {
return descripcion;
}
@Column(length=10, scale=2)
public BigDecimal getPrecio() {
return precio;
}
public void setCodProducto(Integer codProducto) {
this.codProducto = codProducto;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
Tutorial Aries - Seresco
Página 7
}
public void setPrecio(BigDecimal precio) {
this.precio = precio;
}
}
Prestemos atención a lo siguiente:
•
Nótese que la clase es un simple Bean de Java con sus datos privados y sus métodos get y set.
•
La clase tiene la anotación @Entity.
•
La clave principal va marcada con la anotación @Id.
•
Los métodos get tienen la anotación @Column para ayudar a completar la información que Aries más tarde utilizará,
por ejemplo, para establecer máscaras de edición.
Crearemos la entidad Pedido siguiendo la misma idea:
package es.seresco.pedidos.datos;
import java.util.Date;
import javax.persistence.*;
@Entity
public class Pedido {
private Integer codPedido;
private Date fecha;
@Id
@Column(length=8)
@GeneratedValue(strategy=GenerationType.TABLE)
public Integer getCodPedido() {
return codPedido;
}
public Date getFecha() {
return fecha;
}
public void setCodPedido(Integer codPedido) {
this.codPedido = codPedido;
}
public void setFecha(Date fecha) {
this.fecha = fecha;
}
}
Nos queda por declarar la entidad LineaPedido que es la más compleja por una parte por tener una relación al menos con la
entidad Producto. Declararemos así la clase:
package es.seresco.pedidos.datos;
import javax.persistence.*;
@Entity
public class LineaPedido {
private Integer lineaPedido;
private Integer codPedido;
private Producto producto;
private Integer cantidad;
@Id
@Column(length=8)
@GeneratedValue(strategy=GenerationType.TABLE)
public Integer getLineaPedido() {
Tutorial Aries - Seresco
Página 8
return lineaPedido;
}
public Integer getCodPedido() {
return codPedido;
}
@ManyToOne(fetch=javax.persistence.FetchType.LAZY, targetEntity=Producto.class)
@JoinColumn(name="CODPRODUCTO")
public Producto getProducto() {
return producto;
}
@Column(length=8)
public Integer getCantidad() {
return cantidad;
}
public void setLineaPedido(Integer lineaPedido) {
this.lineaPedido = lineaPedido;
}
public void setCodPedido(Integer codPedido) {
this.codPedido = codPedido;
}
public void setProducto(Producto producto) {
this.producto = producto;
}
public void setCantidad(Integer cantidad) {
this.cantidad = cantidad;
}
}
Y prestaremos atención a lo siguiente:
•
Podríamos haber hecho un diseño de la clase con clave compuesta por codPedido y linPedido, pero por simplicidad lo
hacemos de clave simple, que además es la opción recomendada por Hibernate.
•
Para declarar la relación con la entidad Producto hemos utilizado las anotaciones ManyToOne y JoinColumn.
Gestión de productos
Vamos a crear una función para buscar, crear, consultar, modificar y borrar productos.
Situados en el proyecto “pedidos” pulsamos botón derecho “New” y elegimos “Pantalla”.
Tutorial Aries - Seresco
Página 9
En la pantalla del asistente que aparece a continuación
elegimos el tipo “Gestión”, elegimos la entidad principal que
vamos a manejar que es “Producto”, le damos un nombre, y
un título.
Marcamos también la opción de “Generar búsqueda” para
que nos genere una pantalla de búsqueda y la damos un
nombre y un título a la búsqueda .
Pulsamos Finish, y como resultado obtendremos los fuentes
Java y XML de las pantallas de Gestión y de Búsqueda.
Cada pantalla en Aries se compone de dos ficheros:
1.
Diseño: Es la “Vista” de la pantalla. Se trata de un fichero XML que define los componentes que colocamos en la
pantalla.
2.
Controlador: Es la clase Java que controla los eventos y el funcionamiento de la pantalla.
El asistente nos ha generado dos pantallas. La búsqueda y la gestión.
Comenzamos editando el fichero ProductoBusqueda.xml. Las búsquedas tienen dos partes bien diferenciadas. Los criterios y los
resultados. Introduciremos campos para poder establecer criterios de búsqueda y también introduciremos campos para mostrar
los resultados El asistente nos ha dejado dos marcas para que sepamos dónde introducir ambas partes.
Comenzamos por los criterios: Introducimos lo que aparece en negrita a continuación:
<Bloque titulo="Criterios">
<Grid >
<TextField id="producto.codProducto" etiqueta="Código"/>
<TextField id="producto.descripcion" etiqueta="Descripción"/>
</Grid>
</Bloque>
Luego, en la zona de resultados escribiremos:
<Tabla id="Resultados" height="400">
<TextField id="codProducto" etiqueta="Código"/>
<TextField id="descripcion" etiqueta="Descripción"/>
<TextField id="precio"
etiqueta="Precio"/>
</Tabla>
Ahora vamos a editar el fichero ProductoGestion.xml que es la definición de la pantalla de gestión donde vamos a poder crear,
consultar, modificar y borrar productos. En ella declaramos los campos que queremos gestionar:
<Grid size="1">
<Grid >
<TextField id="producto.codProducto" etiqueta="Código"/>
<TextField id="producto.descripcion" etiqueta="Descripción"/>
<TextField id="producto.precio"
etiqueta="Precio"/>
</Grid>
<Include ref="plantillas/BotoneraGestion.xml"/>
</Grid>
Tutorial Aries - Seresco
Página 10
Ahora solamente nos queda por añadir una referencia a la función de búsqueda de productos en el menú general. Vamos
entonces a editar el fichero src/recursos/menus/MenuEscritorio.xml e introducimos lo que aparece en negrita a continuación:
<Opcion texto="$menu.basicos" >
<Opcion texto="Productos" id="ProductoBusqueda"/>
</Opcion>
Ahora ya estamos listos para probar esta funcionalidad. Vamos a la ventana de “Servers” y pulsamos de nuevo el botón de
arrancar el servidor para asegurar que nos coge los últimos cambios.
Con el navegador vamos a la aplicación y abrimos la opción
“Productos” y vemos cómo nos ha quedado la pantalla de
búsqueda.
Desde ella podremos ir a crear nuevos productos pulsando
el botón “Nuevo...”. Introducimos los datos del nuevo
producto y pulsamos Grabar.
Tutorial Aries - Seresco
Página 11
Luego, podemos volver a la búsqueda, aceptar los criterios
y ver los registros que hayamos creado.
Tutorial Aries - Seresco
Página 12
Gestión de pedidos
Crearemos a continuación la gestión de pedidos. Seguimos los mismos pasos que habíamos seguido para crear la de productos:
Mediante la opción de botón derecho “New – PAntalla”
accedemos al asistente y cubrimos los datos tal como se ve en
esta imagen.
Nos aseguramos de marcar “Generar Búsqueda” y de cubrir
los nombres y títulos.
La entidad principal es “Pedido”.
Pulsamos Finish
Obtenemos los ficheros de diseño y control de las pantallas de búsqueda y gestión de pedidos. Del mismo modo que hicimos con
los productos, introduciremos los campos en las zonas de criterios, resultados de la búsqueda y en la gestión.
Criterios de la búsqueda:
<Bloque titulo="Criterios">
<Grid >
<TextField id="pedido.codPedido" etiqueta="Código"/>
<Row etiqueta="Entre fechas">
<CampoFecha id="pedido.fecha.min" />
<CampoFecha id="pedido.fecha.max" etiqueta="y"/>
</Row>
</Grid>
</Bloque>
En este caso hemos decidido poner como criterio el rango de fechas. Nótese que el sufijo “.min”, “.max” permite a Aries conocer
nuestras intenciones sobre el criterio que queremos que aplique.
Resultados:
<Tabla id="Resultados" height="400">
<TextField id="codPedido" etiqueta="Código"/>
<CampoFecha id="fecha"
etiqueta="Fecha"/>
</Tabla>
En la gestión de pedidos:
<Grid size="1">
<Grid >
<TextField id="pedido.codPedido"
etiqueta="Código"/>
<CampoFecha id="pedido.fecha"
etiqueta="Fecha"/>
</Grid>
<Include ref="plantillas/BotoneraGestion.xml"/>
</Grid>
Añadirlo al menú general:
Tutorial Aries - Seresco
Página 13
<Opcion texto="$menu.basicos" >
<Opcion texto="Productos" id="ProductoBusqueda"/>
<Opcion texto="Pedidos"
id="PedidoBusqueda"/>
</Opcion>
Las líneas del pedido
Ahora queremos añadir líneas al pedido para darle la funcionalidad requerida. Lo haremos editando el fichero
PedidoGestion.xml y añadiendo lo siguiente:
<Grid size="1">
<Bloque titulo="Datos generales">
<Grid >
<TextField id="pedido.codPedido" etiqueta="Código" enabled="false"/>
<CampoFecha id="pedido.fecha"
etiqueta="Fecha"/>
</Grid>
</Bloque>
<Bloque titulo="Detalle">
<GrupoTablaGestion entidad="LineaPedido"
camposCabecera="pedido.codPedido"
camposDetalle="codPedido">
<Tabla id="lineaPedido">
<Label
id="estado"/>
<TextField
id="lineaPedido.lineaPedido" visible="false"/>
<CampoConBusqueda
id="lineaPedido.producto.codProducto"
etiqueta="Producto" idBoton="buscarProducto"/>
<TextField
id="lineaPedido.producto.descripcion" etiqueta="Descripción" enabled="false"/>
<TextField
id="lineaPedido.producto.precio" etiqueta="Precio"
enabled="false"/>
<TextField
id="lineaPedido.cantidad"
etiqueta="Cantidad"/>
<TextField
id="importe" edicion="n:##,###,##0.00" enabled="false" etiqueta="Importe"/>
</Tabla>
</GrupoTablaGestion>
</Bloque>
<Include ref="plantillas/BotoneraGestion.xml"/>
</Grid>
Con este diseño de pantalla ya podemos
insertar líneas al pedido aunque de momento
aún no se muestra la descripción, ni el precio
del artículo, ni el importe. Para ello
tendremos ya que escribir código en Java.
Mostrar la descripción y el precio del producto al introducirlo.
Queremos que cada vez que se modifica el código de producto se muestre su descripción y precio asociados.
Tutorial Aries - Seresco
Página 14
1.
Declaramos la relación entre LineaPedido y Producto escribiendo lo siguiente en el método inicializar de
PedidoGestion.
getManejadorRelaciones().getRelacion(Introspector.getNombreEntidad(LineaPedido.class))
.addRelacion(
new Relacion("lineaPedido.producto", Producto.class,
new MapeadorBasico(this,"lineaPedido.producto.codProducto","codProducto")
)
);
Mediante este código le hemos dicho a Aries que debe considerar que el campo lineaPedido.producto.codProducto es clave
origen de una relación con la entidad Producto, de tal forma que cada vez que el usuario introduzca un código de producto y
pulse INTRO se cargarán los datos de la relación, en este caso la descripción y el precio.
Acceder a la búsqueda de productos
Podemos comprobar que en el diseño de la pantalla para el campo codProducto hemos decidido utilizar un componente
llamado CampoConBusqueda.
<CampoConBusqueda
id="lineaPedido.producto.codProducto"
etiqueta="Producto" idBoton="buscarProducto"/>
Este componente hace que se muestre un botón al lado del campo que permitirá al usuario elegir el código de producto
mediante una pantalla de búsqueda que será precisamente la misma pantalla de búsqueda de productos que hemos
desarrollado unos pasos atrás.
Para que esto funcione tenemos que implementar en la parte Java el evento de pulsación del botón buscarProducto. Así:
public void doBuscarProducto() {
LlamadasUtil.llamarBusqueda(this, ProductoBusqueda.class,
"codProducto" , "lineaPedido.producto.codProducto");
}
Mostrar el importe de cada fila
Queremos mostrar el importe de cada fila según se introduce la cantidad, y también al mostrar pedidos ya creados. El importe
de cada fila es el resultado de multiplicar el precio por la cantidad. En el diseño de la pantalla ya hemos preparado una columna
dentro de la tabla para mostrar el importe. Era este:
<TextField
id="importe" edicion="n:##,###,##0.00" enabled="false" etiqueta="Importe"/>
Podemos prestar atención a dos hechos:
•
Hemos tenido que especificar una máscara de edición dado que este campo no pertenece al modelo y Aries no puede
deducir la máscara de las anotaciones JPA. Nótese que para el resto de campos que hemos declarado no ha sido
necesario introducir esta máscara.
•
Lo declaramos con el atributo enabled=”false” para indicar que es un campo sólo de consulta.
Para mostrar el importe vamos a añadir un escuchador al modelo de la tabla. El “Modelo de la tabla” es realmente el contenido
de la misma y añadir un escuchador consiste en escribir código Java que será invocado cada que el contenido de la tabla cambie.
Así:
1.
Para facilitar el acceso a los componentes, utilizando el asistente de Aries vamos a generar una clase llamada
Constantes que contendrá los nombres de los controles que tenemos en la pantalla. Así podremos referirnos a ellos con
seguridad de no equivocarnos. Para ello pulsamos botón derecho sobre la clase Java PedidoGestion y elegimos la opción
“Aries – Generar literales de componentes”. Como resultado obtenemos la clase Constantes con todos los nombres de
componentes.
Tutorial Aries - Seresco
Página 15
2.
Declaramos una instancia de la tabla a nivel de la clase:
// En la clase.
private Tabla tabla;
3.
Y la inicializamos dentro del método inicializar
// Dentro de inicializar
...
tabla=getComponent(Constantes.LINEAPEDIDO);
4.
Ahora tenemos que añadir código al programa Java para que se realice el cálculo en los momentos precisos. Con este
código añadimos un escuchador a los cambios del modelo de la tabla para calcular el importe siempre que cambie
cualquier columna que no sea el importe mismo. De esta forma se calculará el importe tanto en la carga de la tabla
como cuando el usuario modifique el precio o la cantidad.
RelacionMultiple rel=(RelacionMultiple)getManejadorRelaciones().getRelacion(Constantes.LINEAPEDIDO);
rel.getGestorTabla().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent evento) {
if(evento.getFirstRow()>=0 && evento.getFirstRow()<tabla.getModel().getRowCount() &&
evento.getColumn()!=tabla.getIndiceColumna(Constantes.IMPORTE)) {
calcularImporte(evento.getFirstRow());
}
}
});
5.
Por último escribimos el método calcularImporte:
public void calcularImporte(Integer row) {
GestionTableModel modelo = (GestionTableModelEnLinea) tabla.getModel();
BigDecimal cantidad = modelo.getNumeroAt(Constantes.LINEAPEDIDO_CANTIDAD, row);
BigDecimal precioVta = modelo.getNumeroAt( Constantes.PRODUCTO_PRECIO, row);
BigDecimal importe=precioVta.multiply(cantidad);
modelo.setValueAt(importe, Constantes.IMPORTE, row);
}
Y con esto ya hemos conseguido que se
actualice el importe para cada fila.
Tutorial Aries - Seresco
Página 16