Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CursoWebObjects80 PDF
CursoWebObjects80 PDF
Para poder realizar el curso debe contar con la versión 8.0 de GENEXUS o
superior. El curso consta de los conceptos teóricos necesarios para el desarrollo de
una aplicación web, así como la puesta en práctica de los mismos en una
aplicación ejemplo. El desarrollo de esta aplicación podrá ser visualizado paso a
paso a lo largo del curso mediante videos incluidos en el mismo. La idea es que
Ud. vaya realizando esta aplicación en paralelo (a medida que avanza capítulo por
capítulo en forma ordenada).
En caso de estar interesado en consultar a un docente del curso las dudas que le
vayan surgiendo, y/o dar un examen final de forma tal de obtener (en caso de
aprobación) un certificado de haberlo realizado en modalidad no presencial,
diríjase a nuestro sitio de capacitación a distancia:
INTRODUCCION AL CAPITULO 1
Para poder entender cómo funciona el Web, necesitamos primero conocer el
significado de ciertos conceptos que vamos a usar frecuentemente a lo largo de
todo el curso. Por lo cual, comenzaremos con estas definiciones para luego sí
introducirnos en el desarrollo de aplicaciones para Internet.
El WEB permite saltar o "hyperlink" de una página web (o web page) a otras.
Puede pensarse en el WEB como una gran biblioteca. Web sites son como los
libros (libros electrónicos) y las páginas web son como las páginas específicas de
estos libros. Estas páginas pueden contener noticias, imágenes, sonidos, 3D, etc.
Además pueden estar ubicadas en computadoras de cualquier parte del mundo.
Los libros electrónicos mantienen el concepto básico del libro, y además, brindan
la oportunidad de disponer de una estructura no lineal, la que permitirá, entre
otras cosas, decidir el orden en el que se desea recibir la información.
Páginas estáticas
Las páginas estáticas son las más sencillas, se crean usando un editor de páginas
Web o bien escribiendo directamente el código HTML.
Páginas dinámicas
Las páginas dinámicas son creadas en el momento en que son referenciadas por el usuario. Si
bien tienen un estilo base, la información desplegada en las mismas es dinámica.
Son interactivas, ya que permiten que la página a visualizar pueda ser creada en base a la
información ingresada por el usuario. Por ejemplo, una consulta de los pedidos pendientes de
una orden de compra.
Las páginas dinámicas permiten interactuar con una base de datos, por lo que son una
poderosa herramienta para impulsar los negocios de la empresa.
A continuación se presenta una lista de ejemplos que se prestan para una aplicación que utilice
páginas dinámicas:
Hoy día una aplicación web ha alcanzado el mismo nivel de sofisticación de interfaz
que cualquier aplicación Win, y debido a las ventajas que presenta (facilidad en la
instalación de la aplicación, solo se requiere un cliente “fino”: un browser, y alta
escalabilidad), ha marcado una tendencia en lo que a soluciones de software se
refiere.
Por lo tanto, la clasificación en base a la frecuencia de uso de la aplicación pasa a
ser obsoleta, y los parámetros de decisión en cuanto a que tipo de solución
implementar giran en torno a otros factores.
ALGUNAS DEFINICIONES
Para poder entender cómo funciona el web, necesitamos definir ciertos conceptos,
que son los que se van a manejar de ahora en adelante:
URL
Básicamente una URL es una dirección WEB.
Cuando visualizamos una página Web con Netscape, Internet Explorer o cualquier
otro browser, los links (visualizados subrayados y generalmente en color azul),
contienen información oculta que apunta a la ubicación del recurso al que se hace
referencia.
Sintáxis protocol://host/path/filename[?parm1,…,[parmn]]
[parm1,...,[parmn]]
Información opcional para consultas
Protocolo HTTP
Como vimos antes, un documento WWW HyperMedia es servido por el protocolo
HTTP. Esto significa que los browsers WWW y los servidores WWW se comunican
entre sí para procesar las solicitudes del usuario utilizando un conjunto de
mensajes y respuestas que son únicos para el cliente (web browser) y el servidor
(programa HTTP server). Aunque existen algunas diferencias entre browsers y
servidores WWW, todos se comunican a través del protocolo HTTP.
4) Se cierra la conexión.
El lenguaje HTML está compuesto por una serie de códigos o tags ubicados dentro
de un documento ASCII, que son traducidos por un web browser como Netscape,
Internet Explorer, etc, en instrucciones específicas para formatear el documento
que se va a desplegar en la pantalla. Entre dichos tags están incluidos los tags de
hyperlinks, que permiten especificar enlaces hacia otros recursos en el Web.
Cada documento tiene un cabezal (head) y un cuerpo (body), delimitados por los
tags <head> y <body>. El cabezal es donde se indica un título al documento y
donde se indican otros parámetros que el browser podría utilizar en el momento
de desplegar el documento. El cuerpo es donde se coloca el contenido
propiamente dicho del documento HTML. Esto incluye el texto a desplegar y otros
controles que indican al browser cómo desplegar el texto. Los tags también
referencian archivos de efectos especiales como imágenes y sonido e indican los
hot spots que enlazan el documento a otros documentos.
<HTML>
<HEAD>
</HEAD>
</BODY>
</HTML>
WEB CLASSES
SERVLETS
ASP.NETCGI
Con CGI el servidor Web puede realizar llamadas a programas externos, pasando
datos específicos del usuario al programa. El programa luego procesa esos datos y
el servidor devuelve la respuesta del programa al Web browser.
Un programa CGI puede ser escrito en diferentes lenguajes como: C/C++, Visual
Basic, PERL, etc.WEB CLASSES
A partir de Visual Basic 6.0 existen nuevas facilidades para generar aplicaciones
para Internet, la más notoria es la llamada WebClasses Designers. Estos
objetos son programados en Visual Basic y al compilarlos se crea un ActiveX DLL,
que será ejecutado por el Web Server (Microsoft Internet Information Server), y
un archivo .ASP (Active Server Page) que sirve como punto de entrada para cada
clase en la DLL.
SERVLETS
Junto con JAVA aparecieron componentes para el web con la misma funcionalidad
mencionada anteriormente en relación a CGI y ASP denominados servlets. Son
clases JAVA que ejecutan en el servidor y permiten obtener información en forma
dinámica que luego envían al cliente.
ASP.NET
ASP.NET es otra alternativa de Microsoft para el desarrollo de aplicaciones web. Esta
tecnología se desarrolló para la nueva plataforma .NET de Microsoft y se trata de una
evolución de las ASP o Active Server Pages. Tambien en este caso se trata de aplicaciones que
ejecutan en el servidor y envian el HTML resultante al cliente. Los programas en el servidor son
.dll’s que se invocan con extensión .aspx.
ARQUITECTURA GENERAL
En la imagen que mostramos a continuación se puede observar un esquema
simplificado de la topología de Internet.
Los usuarios de Internet tendrán acceso a las páginas que sean públicas y podrán
acceder a los datos almacenados en la empresa a través de páginas dinámicas.
Por otro lado, los usuarios de la empresa (Intranet) podrán acceder a las páginas
públicas y a las páginas privadas de la empresa.
REQUERIMIENTOS BASICOS PARA PUBLICAR
PAGINAS (ESTATICAS O DINAMICAS) EN
INTERNET
Se debe disponer de una red TCP/IP, es decir, que tanto el servidor como el cliente deben
tener instalado el protocolo de red TCP/IP.
El servidor debe tener un software que lo habilite como servidor Web, normalmente es a este
software al que se denomina Servidor Web o Web Server.
El cliente únicamente necesita un browser para poder visualizar las páginas Web.
Más adelante, se especificará el software adicional necesario, dependiente del generador, para
poder desarrollar los objetos Web. Los requerimientos de software para el desarrollo varían
dependiendo de la plataforma y generador en la cual se esté trabajando.
EN EL SERVIDOR
EN EL CLIENTE
TCP/IP
Browser - nos permite visualizar las páginas.
¿QUE ES UN SERVIDOR WEB?
El servidor web, es un software que habilita al servidor para la publicación de
páginas web, también es denominado Web Server.
En particular en el caso del generador .Net (que hemos elegido para ejemplificar
los ejercicios prácticos del curso), el directorio virtual y su alias son creados
automáticamente y no es necesario que el usuario lo haga por su cuenta en etapa
de desarrollo.
Para poder publicar páginas dinámicas, es común definir uno o varios directorios adicionales
con permisos de ejecución.
También se pueden definir múltiples directorios virtuales con permisos de lectura para colocar
diversas páginas estáticas, imágenes, etc.
Los conceptos de directorio virtual y alias son manejados en todos los servidores
Web, lo que varía es la interfaz que provee cada Web Server para realizar la
configuración correspondiente.
El alias es el nombre que utilizarán los usuarios de Internet para acceder a las
páginas web. Estas páginas están físicamente almacenadas en un directorio
(conocido como directorio virtual).
C/SQL
.Net
Java
Visual Basic
Por lo tanto, pueden ejecutarse en un servidor Web Windows (usando C/SQL, .Net, Java o VB),
en servidores UNIX (usando C/SQL o Java) o en servidores Iseries (Java).
Los objetos web podrán usar cualquier manejador de base de datos, dentro de las plataformas
soportadas por cada uno de los generadores GeneXus.
INTRODUCCION AL CAPITULO 2
Identificamos como “objetos web” a los objetos que se utilizan para desarrollar aplicaciones
web con GENEXUS: Web Panels y Transacciones con form HTML.
A continuación, se enumeran las principales diferencias de dichos objetos con respecto al resto
de los objetos GENEXUS:
Se utiliza un editor WYSIWYG (What You See Is What You Get) orientado a páginas
para la edición de objetos web (Web Objects).
FUNCIONAMIENTO - ARQUITECTURA
Al utilizar objetos web las páginas se crean en tiempo de ejecución, basadas en el
input del usuario.
En este proceso, el servidor Web está actuando como un gateway entre la base de
datos y el cliente de browser. En realidad el servidor Web simplemente está
pasando el número de cliente al objeto web que realizará la consulta a la base de
datos, formateará los resultados y retornará los datos formateados al servidor, el
cual, a su vez, pasará esta salida al browser para que sea desplegado al usuario.
3. Los datos que devuelve el objeto web (en nuestro ejemplo, el estado de la
orden del cliente) al servidor, son simplemente escritos por el mismo utilizando el
método normal de retorno de información del lenguaje utilizado.
C/SQL
En el caso de C/SQL se utiliza CGI para los programas que devuelven la
información requerida de la base de datos.
.NET
Los objetos web generados con .Net son .dll’s que son invocados con extensión
.aspx. La tecnología utilizada en este caso se denomina ASP.NET.
VISUAL BASIC
Los objetos web generados con Visual Basic, utilizan la tecnología denominada
WebClasses Designer. Estos objetos son programados en Visual Basic y al
compilarlos se crea un ActiveX DLL que será ejecutado por el Web Server y un
archivo ASP que sirve como punto de entrada para cada clase en la DLL.JAVA
Introducción
La finalidad de este editor es potenciar y simplificar la edición del form HTML de los objetos
web, permitiendo crear fácilmente sitios web vistosos y potentes. Este editor es del tipo
"WYSIWYG" (What you see is what you get) lo que permite al desarrollador visualizar en
diseño la página web que se va a publicar. Para esto se licenció un editor similar al Front Page
de Microsoft, que fue diseñado siguiendo el estándar de las herramientas Microsoft Office, lo
que permite que los usuarios puedan utilizarlo rápidamente y en forma intuitiva.
Es un editor orientado a páginas, lo que significa que la posición de los controles que se
encuentran dentro del form en diseño es relativa al tamaño de la ventana que contenga la
página.
Complementando este editor, existe el Editor de Temas, que permite definir clases para los
controles usados en una aplicación web GeneXus y configurar de una forma sencilla las
propiedades de estos controles simplificando el desarrollo y mantenimiento de las aplicaciones
web.
El uso de este editor es muy sencillo, de forma que todo el diseño realizado se puede visualizar
en ejecución sin necesidad de incluir código HTML en el Form. A modo de ejemplo, si se desea
modificar el tamaño de la font utilizada en el objeto web, simplemente se selecciona el texto y
se cambia al tamaño deseado.
El editor facilita el formateo de textos (tamaño de letra, tipo de letra, color, etc.), y permite la
inserción de controles GeneXus (Controles edit, grid, botones, etc.).
Este editor provee el manejo de tablas, característica fundamental a la hora de diseñar páginas
web. Esta facilidad habilita al usuario a diseñar mejores páginas, así como le permite tener el
control de la alineación de los controles dentro del Web Panel.
Atributos
Variables
Botones
2. Los que son propios de los Web Objects, o tienen un comportamiento diferente que en el
resto de los objetos.
Imagenes
Grilla
Texto
Text Block
Tabla
Grilla Free Style
Error viewer
Web Components
Embedded Pages
Para insertar controles en el form del objeto web se puede utilizar la opción Insert del menú
de GeneXus o la siguiente barra de herramientas.
Más adelante se detallan los controles disponibles, así como las opciones disponibles en esta
barra de herramientas.
Formateo de texto
La barra de herramientas disponible para realizar estas operaciones es la siguiente:
Las operaciones que se pueden realizar son las estándares de edición y formateo de texto.
Una de las opciones destacables relacionada con objetos web es , que permite visualizar
los bordes de las tablas cuya propiedad Border esté con valor 0. De esta forma, se pueden ver
en diseño los bordes de las tablas aún cuando éstos no se vean en ejecución.
Otra opción interesante es que facilita el trabajo con controles de tipo Text Block.
Si se presiona el botón derecho del mouse dentro del formulario del objeto web, además de la
opción Properties (que permite configurar las propiedades del form) se visualizan dos
opciones: ‘View Source’ y ‘Edit HTML Source’. Al seleccionar la opción ‘View Source’ se abre
una ventana donde se puede visualizar el código HTML que se va a generar al ejecutar dicho
objeto. Al cerrarla, se vuelve al formulario del objeto web.
Si se selecciona la opción ‘Edit HTML Source’, se puede modificar el código HTML o agregar
código, de forma tal que el cambio se mantiene en el objeto y se genera posteriormente. En
este caso, el código se visualiza dentro de la ventana del objeto web y para volver al
formulario, es necesario volver a presionar el botón derecho del mouse y seleccionar la opción
‘Edit Web Form’.
La opción “Edit HTML Source” se usa para cualquier caso en el que sea necesario agregar
código HTML manualmente, por ejemplo, agregar código javascript (si bien esto se puede
hacer de otras formas). Todo el HTML que se agregue queda entre los Tags <Body></Body> del
objeto generado.
En ambos casos, se asigna el valor a la misma, pero lo que varía es el costo de mantenimiento
posterior que implicarán cambios a las mismas.
Esta asignación puede hacerse en tiempo de diseño y para algunas de las propiedades pueden
modificarse en tiempo de ejecución (programando los eventos del objeto). Cualquier cambio,
requerirá generar y compilar el objeto.
En este capítulo se verá una introducción al objeto Tema y el Editor de Temas, y más adelante
en el curso, se verá en detalle el funcionamiento de ambos.
Como primer paso, deben crearse la Base de Conocimiento (en GeneXus 8.0 o una
versión superior) y consolidar el archivo initial.xpz el cual contiene todas las
transacciones y procedimientos de los cuales partimos.
El generador que vamos a utilizar en el curso es .Net con SQL Server como DBMS,
pero ud. puede elegir el generador que desee y disponga. Les recordamos leer en
el Capítulo 15 ”Requerimientos y configuraciones necesarias por generador” para
conocer los detalles correspondientes al generador que ud. haya elegido, antes
de crear el modelo de prototipo.
A lo largo del curso vamos a ir desarrollando una aplicación web, un Sitio de ventas de películas
en sus diferentes formas (videos, DVD, etc.) del cual se tienen ya definidas las estructuras de
las transacciones y procedimientos necesarios y nos concentraremos únicamente en el
desarrollo de los objetos web.
MoviesType
MovieTypeId*
MovieTypeDsc Tipo de película (Video, DVD)
Actors
ActId*
ActLastName
ActName
Customer
CustId*
CustName
CustLastName
CustUsr
CustPsw
CustEmail
CustNews Si desea suscribirse a la lista de noticias del sitio (Y/N)
MovieGenre
MovGenId*
MovGenDesc
(MovieId*
MovieTitle)
Movies
MovieId*
MovieTitle
MovieSumry
(MovieTypeId*
MovieTypeDsc
(MovieLinDate*
MovieLinPrc))
(ActId*
ActLastName
ActName)
Purchase Order
PurOrdId*
CustId
CustNameCustLastName
PurOrdDate
PurOrdTot= SUM(PurOrdLinTot) fórmula
PurOrdLastLin
(PurOrdLinId*
MovieId
MovieTitle
MovieTypeId
MovieTypeDsc
PurOrdQtity
PurOrdLinUnPrc = udp(PUnitaryPrice, MovieId, MovieTypeId) fórmula
Qué es un Tema?
A partir de GeneXus 8.0 se cuenta con un nuevo objeto para el diseño de aplicaciones web, los
“Temas”; y una herramienta para el mantenimiento del nuevo objeto, que es el Editor de
Temas.
Un Tema es un objeto GeneXus, mediante el cual se pueden definir clases para los diferentes
controles Web GeneXus, y asignar propiedades a dichas clases.
Una vez asociado un Tema a un objeto (propiedad “Theme”), los controles de ese objeto
podrán ser asociados a alguna clase del Tema correspondiente.
Cuando un control es asociado a una clase éste pasa a heredar la configuración de las
propiedades dada en la clase.
Los objetos a los que se les puede asignar un Tema son Web Panels y Web Transactions.
El valor default de la property “Theme” del modelo es el valor de la misma property de la KB, y
el valor default de la property “Theme” de un objeto es el valor de la property “Theme” del
modelo.
Observe en la KB que usted ha creado para realizar los ejercicios prácticos, existe un Tema de
nombre “Default”. Este Tema se crea automáticamente siempre que se crea una nueva base
de conocimiento.
La propiedad Theme del modelo, está asociada por defecto al Tema “Default”, por lo cual, por
defecto los objetos de la KB están asociados al mismo Tema.
Vamos a modificar el Tema “Default”, de forma de ejemplificar como se trabaja con los Temas.
En la siguiente demostración veremos los pasos seguidos para modificar el Tema “Default” y el
efecto de esos cambios sobre el web panel que hemos creado en este capítulo.
Es posible configurar en la Clase Form (o derivadas de ella) en el objeto tema, varias de las
propiedades de los forms disponibles en GeneXus y otras que no están en GeneXus.
En el caso de que una propiedad esté asignada en el control (en diseño o en ejecución) ese
valor tiene precedencia respecto al asignado en el tema. Ver orden de precedencia de las
propiedades
Por detalles de propiedades del Form en los Temas, referirse a “Clase Form”
Atributos y Variables
Al seleccionar un control y presionar el botón derecho del mouse aparecen las propiedades
para ser editadas.
Para modificar las propiedades de estos controles en ejecución (es decir en algún evento del
objeto), es necesario programarlo (ejemplo: &pwd.IsPassword = 1)
Recuerde que muchas de estas propiedades pueden asignarse en el objeto Tema en la clase
Attribute.
4. Read Only
5. Auto Resize: Esta propiedad aplica a controles edit que NO tengan la
propiedad Read-Only con el valor ‘True’, ya que en este caso se ignora el
ancho especificado.
6. Fill
7. BackColor
8. ForeColor
9. Font
10. Format
11. ReturnOnClick
12. OnClickEvent
COMBO BOX
Las propiedades a nivel de diseño que aplican son:
1. Attribute
2. BackColor
3. ForeColor
4. Fill
5. Font
6. Read Only
1. Backcolor
2. BackStyle
3. Enabled
4. FontBold
5. FontItalic
6. FontName
7. FontSize
8. FontStrikethru
9. FontUnderline
10. ForeColor
11. InternalName
12. Visible
1. Attribute
2. BackColor
3. ForeColor
4. Fill
5. Font
Los radio button tienen también la propiedad Radio Direction que permite
indicar si las opciones del radio se desplegarán en forma vertical u horizontal.
1. Backcolor
2. BackStyle
3. Enabled
4. FontBold
5. FontItalic
6. FontName
7. FontSize
8. FontStrikethru
9. FontUnderline
10. ForeColor
11. InternalName
12. Visible
1. Alternate Text
2. Borderwidth
3. Class
4. Enabled
5. HSpace
6. InternalName
7. Link
8. LinkTarget
9. TooltipText
10. Visible
11. VSpace
AddItem
Clear
El formateo ocurre cuando el usuario "sale" del campo y controla únicamente que el formato
sea correcto. No se controla que la fecha y/o hora sea válida: esto lo hacen los programas.
En caso que el formato no sea correcto, se emite un mensaje de error (una ventana con el
mensaje 'Date or time format is not correct') y se vuelve el foco al campo incorrecto.
Botones
En los objetos web se pueden usar varios botones y asociarles eventos (predefinidos de
GeneXus o definidos por el usuario). Al presionar el botón derecho del mouse se visualiza el
siguiente diálogo que habilita al usuario a editar las propiedades del mismo o a editar el
evento que el botón tiene asociado.
Propiedades de botones
Las propiedades de los controles de tipo Button que pueden modificarse en diseño son:
1. ControlName
2. Class
3. OnClickEvent
4. Caption
5. Font
6. ForeColor
7. BackColor
8. BorderWidth
9. BorderColor
En ejecución se pueden modificar todas estas propiedades (excepto la control
name) del boton y además las siguientes:
1. Enabled
2. Internal Name
Tamaño de botones
El tamaño del botón queda determinado por el texto ingresado en la propiedad Caption del
mismo.
Si se desea que los botones tengan un tamaño fijo, se deben asociar mediante la propiedad
Class a una clase de un tema que tenga un tamaño definido (propiedades Heigth y Width). En
este caso, el tamaño quedará fijo independientemente del caption.
Si programamos
Variable.IsPassword = 0
Observe que como el objeto será utilizado como punto de entrada a nuestra
aplicación, lo definiremos como un objeto de tipo main.
IMAGENES
En el desarrollo de aplicaciones web al igual que cualquier tipo de aplicaciones, se distinguien
dos ambientes o fases muy diferentes: el de diseño y el de ejecución. Por ambiente de diseño,
nos referimos al ambiente utilizado por los usuarios GeneXus que desarrollan la aplicación
web; por ambiente de ejecución entendemos a la ejecución propiamente dicha de los objetos
web (normalmente realizada por los usuarios finales).
Identificar estos dos ambientes es muy importante al trabajar con imágenes ya que
determinará que las mismas sean ubicadas correctamente y no ocurran errores del estilo “File
not found”.
En el ambiente de diseño (mientras se trabaja con GeneXus editando los objetos web) las
imágenes se buscan en el camino indicado en cada imagen (Ej.: c:\modelo\imagenes\img.gif),
pero en ejecución es necesario referenciar el camino virtual donde se encuentran las mismas,
que normalmente es el Servidor Web -(Ej.: /imagenes/img.gif). Hay que recordar que el
servidor web tiene acceso únicamente a aquellos directorios definidos en el software de
administración del mismo.
Para solucionar esto, se dispone de una preferencia a nivel de diseño denominada ‘Base image
path’ .
Preferencia Base image path
En esta preferencia del modelo de diseño, se debe ingresar el camino absoluto
que se va a utilizar para referenciar las imágenes en tiempo de diseño, es decir
mientras se desarrollan los objetos web.
En el caso en que se tenga acceso al servidor Web que se usará para producción
final, este camino puede referenciarse como una URL o también como un path
absoluto (respecto al servidor de archivos).
Esta forma de trabajo, permite que las imágenes esten en un único directorio y
pueden ser accedidas tanto en tiempo de desarrollo como en producción.
Cuando no se tiene acceso al servidor Web que se usará para producción (que es
el caso mas común), se deberán tener las imágenes duplicadas para poder
accederlas en desarrollo y posteriormente en producción. En este caso, en la
preferencia se deberá referenciar el path absoluto al directorio que las contenga
en tiempo de diseño.
Luego en el objeto web, para insertar una imagen se debe seleccionar el botón de la barra
de controles disponibles, y en el diálogo para ingresar el origen de la imagen se debe
seleccionar la misma.
Observaciones:
Esta propiedad permite asociar un evento de los objetos Web a una imagen. Tiene el mismo
funcionamiento que la propiedad de igual nombre para los botones. En particular, permite
asociar un evento estándar de GeneXus (como First, Next, Previous, Last, Enter, etc.) a una
imagen.
Esta propiedad OnClickEvent es usada principalmente en las Transacciones Web para poder
asociar imágenes a los eventos estándar: Previous, Next, etc. En Web Panels, sirve para asociar
el evento Enter a las imágenes.
Todas las imágenes necesarias para el diseño del sitio se encuentran en el archivo images.zip.
Para poder usarlas hay que descomprimirlas y almacenarlas en algún directorio del disco duro.
En nuestro ejemplo, descomprimimos las imágenes en el directorio images bajo el directorio
de la KB (c:\InternetApp), y las copiamos también al directorio ‘images’ bajo el directorio raíz
de nuestro servidor web.
Primero, tenemos que ir al modelo de diseño y setear la preferencia "Base Image Path" para
indicar dónde están ubicadas de forma tal de poder verlas mientras diseñamos. Como
discutimos anteriormente (ver Imágenes), existen diferentes alternativas para completar esta
opción, y en consecuencia también el lugar donde deben estar al momento de ejecutar el
objeto en el web.
Para insertar una imagen tenemos que posicionarnos en el lugar que queremos insertarla, y
seleccionar la opción Insert/Image o el item Image de la toolbar de Controls y escribir
solamente el nombre de la imagen a insertar donde dice "Picture Source" (es decir, que
cuando ingresamos las imágenes hacemos el seteo de la propiedad "Source" de la misma).
1. BorderWidth
2. TooltipText
3. AlternateText
4. InternalName
5. Bitmap
6. Enabled: La propiedad Enabled de Runtime permite habilitar
(Enabled=1)/deshabilitar (Enabled=0) la ejecución del evento asociado a la
variable bitmap.
7. Link: Si se programa el evento Click de una imagen se ignora la propiedad
Link.
8. LinkTarget
9. Visible
10. Class
LINK
Los links son una característica única del WWW que nos permite saltar o navegar entre páginas
web.
Cuando queremos poner un link, tenemos que especificar la URL de la página web a la cual
queremos acceder.
Una url absoluta es una dirección completa que incluye el camino completo al
archivo.
Cuando se referencia un archivo (página) de alguien más,
normalmente se va a usar una url absoluta (por ej: www.yahoo.com)
Una url’s relativa es una dirección relativa al archivo que la contiene. Si solamente
se referencia el nombre del archivo, se asume que estará en el mismo directorio que
la página que contiene el link.
En las urls relativas no debe indicarse el protocolo (http, ftp, etc.).
Es suficiente con el nombre del archivo.
Dentro de GENEXUS, el link puede ser utilizado como función o como comando. A
continuación se definen ambos casos de uso.
Función LINK
La función LINK permite “enlazar” un objeto web con otro objeto web o con una URL. Esta
función se puede asociar a la propiedad link de un control dentro de cualquier evento del
objeto web, teniendo como resultado que al hacer click sobre dicho control se realiza la
llamada al objeto web o URL referenciado en el link.
el primer parámetro contiene el objeto web, o la URL a llamar y [par1]...[parn] son el conjunto
de parámetros a pasar a los mismos. El primer parámetro, tambien puede ser un atributo o
una variable con la url o el objeto a invocar.
NOTAS:
1. Solamente se puede asociar la función link a controles que sean Read Only.
3. Si se desea llamar a una URL, la URL debe ser ingresada entre ‘’ (comillas
simples/dobles). Se considera como una url absoluta.
Ej.: &var.link = link(‘http://www.artech.com.uy’).
4. Si se desea hacer un link, utilizando un atributo que contiene la url o el nombre del
objeto web correspondiente, se debe utilizar la siguiente sintaxis:
5. También se puede definir un link utilizando una variable que contiene la url o el
nombre del objeto web correspondiente con la siguiente sintaxis:
Mailto
Una característica interesante del link es que se puede definir de forma tal que al hacer clic
sobre el mismo se abre una ventana para el envío de mail. Para poder hacerlo, simplemente se
debe concatenar una dirección de e-mail a la palabra mailto como se describe a continuación:
&mail = ‘mailto:’+trim(AttMail/&varmail)
&var.link = link(&mail)
siendo &mail una variable de tipo caracter y AttMail o &varmail el atributo o variable que
contienen la dirección e-mail.
Comando LINK
Ver Comandos/LINK.
CALL
Ver Comandos/CALL.
A continuación se realiza una comparación para aclarar las diferencias entre los mismos.
Objetos web
Procedimientos
Objetos web
Páginas HTML estáticas
NOTAS:
Para alinear controles (por ejemplo: que todas las variables donde el usuario va a
ingresar los datos queden alineadas a la izquierda), se deben usar las TABLAS.
En el próximo punto veremos cómo alinear los controles del web panel "Sale of
Movies" insertándolos dentro de una tabla.
TABLAS
Cuando se trabaja con objetos web, es necesario utilizar tablas para poder alinear los controles
dentro del formulario para mejorar el diseño de los mismos.
Agregar tabla
Para insertar una tabla se debe utilizar el botón de la barra de controles. Una tabla está
compuesta por filas y celdas, dentro de las que se encuentran los controles.
Otra forma de editarlas es presionando el botón derecho del mouse estando posicionado en
cualquier celda de la tabla, y después ir a la sección de Table. En este caso, se podrán editar
además de las propiedades de la tabla, las de la fila a la que pertenezca la celda y las propias
de la celda.
1. ControlName
2. Class
La propiedad Class solo se encuentra disponible si el control está en el form de
un objeto que tiene un Tema asociado.
3. Tooltiptext
4. Align
5. Background
6. Backcolor
7. BorderWidth: 0 indica que no tendrá borde en ejecución, pero podrá
verse en diseño usando el botón de la barra de herramientas. El
valor por defecto es 1.
8. BorderColor
9. Cellpadding
10. Cellspacing
11. Height
12. Width
13. Rules
Las propiedades de las filas, son algunas de las propiedades de las tablas, más una propiedad
adicional: Vertical Align.
1. Identifier
2. TooltipText
3. Align
4. Vertical Align
5. Backcolor
6. BorderColor
Propiedades de las celdas de una tabla
Las propiedades de una celda de una tabla son las que se muestran a continuación:
1. Identifier
2. Tooltiptext
3. Align
4. VerticalAlign
5. Background
6. Backcolor
7. Bordercolor
8. Height
9. Width
10. Colspan
11. Rowspan
Dado que ya vimos todas las propiedades de las tablas, celdas, filas y form,
vamos a utilizar alguna de ellas en este web panel.
Vamos entonces a tener que crearnos una tabla de 2 x 2 donde vamos a tener
que incluir dentro los controles que ya tenemos en el formulario y hacer los
siguientes seteos en las propiedades Colspan y Width:
Haga clic aquí para ver la demostración
Text Block
Los controles ‘Text Block’ pueden ser vistos como texto insertado directamente en el form, con
la ventaja que en forma dinámica (en ejecución) se puede modificar el mismo. Para insertar un
En la barra de herramientas para el form HTML se incluye un botón que facilita el trabajo
con controles de tipo Text Block. Al presionar el botón mencionado, se visualizan los TAG’s que
lo definen permitiendo detectar cualquier problema en diseño.
3. Format: El valor por defecto para TextBlocks es Text (se puede cambiar
a través de la propiedad “Default HTML Format(Textblocks only)” del
modelo de diseño).
4. OnClickEvent
5. ReturnOnClick
1. Visible
2. Caption
3. Link
4. LinkTarget
5. Format
6. Class
Error Viewer
El control Error Viewer es utilizado para desplegar mensajes al usuario, utilizando la
función msg(). Para insertarlo ir por el menú de GeneXus: Insert -> Error Viewer
1. ControlName
2. Class La propiedad Class solo se encuentra disponible si el control está en
el form de un objeto que tiene un Tema asociado.
3. Display Mode
4. ForeColor
5. Font
6. Fill
7. BackColor
Propiedades del Error Viewer en ejecución
Además de las propiedades detalladas anteriormente, se pueden modificar las
siguientes propiedades en tiempo de ejecución:
1. BackColor
2. DisplayMode
3. ForeColor
4. Class
PROPIEDADES DEL CONTROL ERROR VIEWER EN LOS TEMAS
Además de las propiedades mencionadas, en la clase Error Viewer de un Tema (o
alguna clase derivada de ella), se pueden setear otras propiedades para el control.
Ver Clase ErrorViewer
Esto significa que los objetos web tienen un control ErrorViewer implícito que es
donde se despliega el mensaje al usar la función msg().
Volvamos entonces a nuestro ejemplo para hacer el control del usuario y password en el
evento ”Login” y agregar un Text Block en la pantalla para desplegarle al cliente el mensaje
que corresponda.
Una forma es agregar en el web panel que estamos diseñando un botón en cuyo
evento se programa un CALL a otro objeto, donde el cliente va a poder ingresar
todos sus datos por primera vez (nombre, dirección de mail, usuario, password,
etc.).
Otra forma, es incluir en lugar de un botón, un LINK al objeto web de ingreso de usuarios (el
cual no hemos creado aún). Es decir, insertar en el formulario un Texto y asociarle al mismo un
Link Estático (con la opción Insert/Hyperlink o Ctrl K teniendo el texto marcado) que nos
permita acceder al objeto web de ingreso de datos del usuario. Esto lo podemos hacer con un
Texto ya que la propiedad que le queremos asociar al mismo es "estática", es decir, queremos
que el link haga siempre referencia al mismo objeto web. Es por esto, que podemos hacerlo
con un control de tipo Texto y no es necesario un Text Block.
Vamos a realizarlo con el LINK ESTATICO ya que con el botón es conocido por
todos cómo hacerlo. Tengamos en cuenta que cuando hagamos Insert/Hyperlink
nos va aparecer la siguiente imagen, donde tenemos que especificar la URL donde
se encuentra el objeto web que queremos invocar.
Dado que el objeto web que queremos invocar todavía no lo creamos, es que
vamos a tener que definir ya el nombre que le vamos a poner, en nuestro
ejemplo va a ser una transacción con form HTML que se denominará “Customer”.
Si definimos el link en forma absoluta, también vamos a tener que saber desde ya
el nombre del servidor web en el que van a estar todos los objetos web de la
aplicación. En nuestro caso, el nombre del servidor web va a ser localhost, y los
objetos web los vamos a tener bajo el directorio “web” del modelo. Es decir, que
la URL que tenemos que poner debe ser http://localhost/services/TCustomer.aspx
(“services” es el alias del directorio virtual donde se encuentran los ejecutables)
INTRODUCCION AL CAPITULO 3
A lo largo de este capítulo profundizaremos sobre el funcionamiento de los web
panels.
En conclusión, recordemos que los web panels se comportan como work panels,
en el sentido de que si se colocan atributos en el form, la información desplegada
no puede ser modificada y si colocamos variables se puede ingresar información.
Para dar de alta en la base de datos, es necesario utilizar “procedimientos” (para
cambios batch) o invocar a “transacciones web” (en caso de querer actualizar la
base de datos en forma interactiva con el usuario).
1. Start
2. Refresh
3. Load
Luego de esto, cuando el usuario presione un botón (ya sea asociado al evento ENTER o a un
evento de usuario) que no llame a ningún otro web panel, se ejecutará nuevamente éste y el
orden de disparo de los eventos será diferente.
Relacionado con esto es importante destacar el momento en que las variables adquieren los
valores ingresados por el usuario: solamente lo harán después de presionar un botón (que es
cuando el servidor Web tiene el control del procesamiento).
Si en un Evento se usa una variable que se carga en otro evento, entonces esa variable debe
estar presente en el form. Si no está en el form, la variable no tendrá valor cuando se disparan
los otros eventos (esto es por el “orden” en que ocurren los eventos).
Además, deberá estar en el form después del control en el que se carga la variable. Por
ejemplo, si la variable se carga en el LOAD de un grid entonces la variable tiene que estar en
pantalla después del grid.
Nota:
Las especificaciones HTML definen técnicamente la diferencia entre GET y POST de la siguiente
forma:
En el GET los datos del form son codificados por el browser en la URL misma.
Entonces, cuando es METHOD="GET" los datos del form se codifican en una URL (o mas
genéricamente en una URI), lo cual significa que esa forma de someter el form es equivalente a
seguir un link a la URL codificada.
En general, el GET es para recuperar datos mientras que el POST sería para grabar, actualizar
datos, ordenar un producto, etc.
En GeneXus todos los eventos se resuelven con un POST y se ejecutan en el servidor web.
Aunque decimos que los web panels son similares a los work panels, hay una
diferencia fundamental entre ellos relacionada con el hecho que el objeto web una
vez que finaliza la ejecución, no queda en memoria. Como consecuencia, la forma
en que programamos este tipo de aplicaciones presenta algunas diferencias con
respecto a lo acostumbrado en ambientes no web.
Es por esta razón que es importante tener claro el orden de ejecución de los
eventos.
Event ‘Login’
For each
Where &CustUsr = CustUsr
If CustPsw = &CustPsw
&CustId= CustId
Message.Caption = ‘’Welcome to Movies.com’
Else
Message.Caption = ‘Invalid password, try again please’
Endif
When none
Message.Caption = ‘User name not found’
Endfor
Endevent
Para realizar la llamada al web panel Datos del Cliente (CustProfile), existen varias
alternativas: se puede definir un link en algún evento, o se puede agregar un botón
y en el evento asociado invocar al objeto.
Event profile.clic/profile
Call(HCustProfile,&CustId)
Endevent
Otra alternativa (la que vamos a implementar en este caso), es usar un control
textblock y hacer el llamado al webpanel en el evento clic del textblock.
Probemos el web panel con el usuario “myuser”, y password “mykey”. Este usuario
ya ha sido definido en los datos que se distribuyen con el curso.
Es por esta razón, que si queremos disponer del valor de la misma, deberíamos
agregar la variable &CustId en el form y la ocultaríamos usando la propiedad Visible
(por ejemplo en el evento Start).
Entonces en este caso, cuando el Web Panel ejecute por segunda vez, se
dispararán los eventos:
1. Start
2. Se leen las variables del form (en este momento se obtiene el valor de
CustId)
3. Se ejecuta el evento clic, y por consiguiente se llama al Web Panel con el
código de cliente correcto!
Nota:
Conviene hacer en este punto del curso un Estilo de Web Panels (que llamaremos
“SaleMovie”), es decir un Web Panel con la propiedad Style Object habilitada, en el que
basaremos luego la definición de los nuevos objetos.
Para quienes conocen y utilizan los Styles habitualmente, es importante destacar que en el
caso de los web panels, los styles aplican solamente al momento de inicializar el objeto,
es decir los cambios que se hacen en el style luego de estar aplicado no se heredan.
Tabla Base
La determinación de la tabla base de los Web panels es análoga a la determinación de los work
panels. La determinación de la tabla base puede encontrarse en el capítulo: ‘Múltiples Grids’.
Eventos
Los eventos de los Web Panels son los mismos que en los Work Panels, es decir evento Start,
Refresh, Load, Enter y los definidos por el usuario. La diferencia con los work panels es el
orden de disparo de estos eventos. Esto está relacionado con el esquema de trabajo en
Internet.
Variables
Como se menciona en la sección ‘Esquema de trabajo en Internet’, las variables adquieren los
valores ingresados por el usuario después de presionar algún botón en el web panel.
Por ejemplo, cualquier link a otro web panel especificado en el evento Start con una variable
que se ingresa en un web panel no va a tener ningún valor cuando se haga clic sobre el link.
Si en un Evento se usa una variable que se carga en otro evento, entonces esa variable debe
estar presente en el form. Si no está en el form, la variable no tendrá valor cuando se disparan
los otros eventos (esto es por el “orden” en que ocurren los eventos).
Además, deberá estar en el form después del control en el que se carga la variable. Por
ejemplo, si la variable se carga en el LOAD de un grid entonces la variable tiene que estar en
pantalla después del grid.
Las fórmulas que se gatillan ANTES del evento Start son aquéllas que sólo dependen de los
parámetros que llegan al programa (regla parm())
Las fórmulas que se gatillan DESPUÉS del evento Start son aquéllas que dependen de atributos
o variables instanciados (vía asignación, Call, etc.) en el evento Start.
WORKFILE_LINES
Esta regla no aplica a los Web Panels. La forma de hacer esto es usando la
propiedad ROWS del grid.
Propiedades
En los Web Panels para resolver la visualización de grandes cantidades de registros se dispone
de la paginación automática del grid.
CALL
El comando Call no presenta grandes diferencias con respecto al resto de los objetos GeneXus.
Es importante tener en cuenta que los objetos web ejecutan en el servidor y por consiguiente
no pueden realizar llamadas a programas que tengan salida en pantalla, ya que la ejecución de
dicha llamada cancelaría por time-out. En resumen, desde un objeto web, se puede llamar a
otro objeto web, a un procedimiento o reporte que no tengan salida en pantalla.
Link
El comando link es equivalente al comando call para llamar a páginas estáticas o redireccionar
a una URL. Este comando puede ser utilizado dentro de cualquier evento de un objeto web con
excepción del evento Load. El resultado de la utilización de este comando es el
redireccionamiento en forma automática a la URL especificada dentro del mismo.
donde
Por ejemplo:
Event ENTER
Link(‘http://www.ARTech.com.uy’)
Endevent
Load
El comando Load es análogo al resto de los objetos GeneXus.
Refresh
El comando Refresh vuelve a cargar la página, teniendo el mismo efecto que el F5 del browser.
La página se cargará manteniendo los últimos valores sometidos para las variables ingresadas
por el usuario.
Return
Incluir el comando return en un objeto web, es equivalente a hacer un CALL al objeto que lo
invocó. En consecuencia no equivale a presionar el botón ‘Back’ del browser, ya que si se
ingresaron valores en variables del Web Panel llamador, los mismos no son mantenidos al
ejecutar el comando Return.
Este comando Return puede ser ejecutado en cualquier evento o subrutina del
Web Panel, salvo el evento Load y los métodos Load de subfiles. Tampoco puede
ser ejecutado en subrutinas llamadas directa o indirectamente por el evento Load
o métodos Load de subfiles. En caso que se ejecute en las mencionadas
situaciones los resultados son impredecibles.
Se quiere que en este Web Panel (el cual es de acceso público) se muestre todo el
"Catálogo de películas", pudiendo filtrar por "género" y por "título", cargando 5
películas cada vez.
El título a su vez, deberá de contener un link a otro web panel que muestre más
información de la película seleccionada y nos permita comprar dicha película en
sus diferentes formas (dvd, video, etc.).
Más adelante veremos cómo hacer esto, ya que por lo que se pide podemos notar
que esto no se puede hacer en una grilla estándar ya que queremos para cada
película de la grilla desplegar un control debajo del otro).
A lo largo de este capítulo iremos implementando todo esto a medida que vamos
viendo los conceptos teóricos necesarios para su desarrollo.
Grilla estándar
Grilla Freestyle
1. si dentro de un evento del Web Panel se está utilizando el comando For each line o
For each line in <grid>, todas las variables que están dentro del grid pasan a ser de
ingreso. Es posible indicar en este caso cuáles son las variables que no van a poder
ser modificadas, utilizando la regla noaccept() o modificando la propiedad Read Only
de la variable dentro del grid.
2. si dentro de la fila hay algún control con un evento clic asociado.
1. LinesBackColor
2. TitleBackColor
Si BackColorStyle = Report
1. LinesBackColor
2. LinesBackColorEven
3. TitleBackColor
Si BackColorStyle = Uniform
1. BackColor
El ancho de cada columna de un grid se especifica como un porcentaje del ancho total del
grid (que por defecto no se especifica, el browser lo calcula en función al contenido de todas
las celdas).
El ancho del grid NO se deduce como la suma de los anchos de las columnas, ya que si estos
se especifican en valores relativos (porcentajes), puede no corresponderse a lo deseado.
Aplican a todas las columnas del grid, para modificar los valores correspondientes a una
determinada columna, se deben modificar las propiedades de la misma (ver mas adelante).
Table
Los grids también tienen algunas propiedades configurables para las tablas Estas
propiedades son:
1. ToolTiptext
2. Align
3. Background
4. BorderWidth
5. Cellpadding
6. Cellspacing
7. Rules.
Propiedades modificables en ejecución
A continuación se detallan las propiedades que se pueden modificar a los grids en tiempo de
ejecución:
En ese diálogo, seleccionando Properties sobre una columna se despliega un diálogo, como el
siguiente:
1. ControlName
2. Class La propiedad Class solo se encuentra disponible si el control está en el form de
un objeto que tiene un Tema asociado.
3. ControlType
4. ReadOnly
5. Autoresize
6. Font
7. ForeColor
8. Title
9. TitleFont
10. TitleForeColor
11. Format
12. Visible
13. ReturnOnClick
1. Backcolor
2. Backstyle
3. Enabled
4. FontBold
5. FontItalic
6. FontName
7. FontSize
8. FontStrikeThru
9. FontUnderline
10. ForeColor
11. Format
12. Title
13. TitleBackcolor
14. TitleBackstyle
15. TitleFontBold
16. TitleFontItalic
17. TitleFontName
18. TitleFontSize
19. TitleFontStrikeThru
20. TitleFontUnderline
21. TitleForeColor
22. TitleFormat
23. Visible
24. Class
PROPIEDADES DE GRIDS EN LOS TEMAS
GRID FREESTYLE
El grid Freestyle permite al usuario definir el formato de los datos a desplegar de una forma
menos estructurada que el grid tradicional.
Para insertar el grid Freestyle se debe utilizar el botón de la barra de controles disponibles.
El grid Freestyle es básicamente una tabla a la que se le pueden insertar los atributos /
variables, text blocks, imágenes, botones, web components, embedded pages, grids freestyle
y/o grids que se van a mostrar posteriormente en la pantalla. Este tipo de grid no posee títulos
para las columnas y además permite tener más de un tipo de control, atributo / variable en
una misma celda, proporcionando de esta forma mayor libertad de diseño. Cabe destacar que
el grid Freestyle posee las mismas propiedades mencionadas anteriormente para el grid
tradicional.
En este caso para poder visualizar las propiedades hay que seleccionar la tabla donde se
encuentran los atributos / variables.
1. Control Name
2. Class La propiedad Class solo se encuentra disponible si el control está en el form de
un objeto que tiene un Tema asociado.
3. BackColorStyle
4. Rows
5. Columns
6. AllowCollapsing
7. Collapsed
4. LinesBackColor
5. LinesBackColorEven
Si BackColorStyle = Uniform
1. BackColor
Introducción
A partir de la versión GeneXus 7.5 se brinda al usuario una serie de métodos que habilitan el
paginado automático en grids y grids freestyle.
Alcance
Objetos: Web Panels
Plataformas: Web
Descripción
El paginado de grids aplica a grids comunes y freestyle cuya propiedad ‘Rows’ tiene un valor
diferente de cero. Los grids pueden estar anidados.
Existen algunas diferencias relacionadas con la paginación cuando un grid tiene tabla base o
no.
Métodos
A continuación se describen los métodos disponibles:.
FIRSTPAGE:
El método FirstPage lleva al usuario al primer conjunto de registros devueltos.
Los valores devueltos por este método son los siguientes:
0: Operación exitosa
1: No está habilitado el paginado en el grid
NEXTPAGE
El método NextPage lleva al usuario al siguiente conjunto de registros.
Los valores devueltos por este método son los siguientes:
0: Operación exitosa
1: No está habilitado el paginado en el grid
2: Ya se encuentra en la última página.
PREVIOUSPAGE
El método PreviousPage lleva al usuario al conjunto anterior de registros.
Los valores devueltos por este método son los siguientes:
0: Operación exitosa
1: No está habilitado el paginado en el grid
2: Ya se encuentra en la primera página
LASTPAGE
El método LastPage lleva al usuario al último conjunto de registros. Puede ser
utilizado únicamente si el grid tiene tabla base.
Los valores devueltos por este método son los siguientes:
0: Operación exitosa
1: No está habilitado el paginado en el grid
3: El grid no tiene tabla base
GOTOPAGE
El método GotoPage(PageNumber) permite acceder en forma directa a un
determinado conjunto de registros. Puede ser utilizado únicamente si el grid
tiene tabla base.
Los valores devueltos por este método son los siguientes:
0: Operación exitosa
1: No está habilitado el paginado en el grid
RESUMEN
A continuación se incluye una tabla con un resumen de los métodos disponibles
cuando un grid tiene tabla base y cuando no.
RecordCount
PageCount
Consideraciones
Si el web panel que se está paginando tiene filtros, se debería agregar el método
FirstPage dentro del evento que aplica el filtro, a los efectos de evitar que el
resultado desplegado corresponda a la página en la que se encontraba
anteriormente.
El método LastPage determina cuál sería la última página, para lo que utiliza la
propiedad Rows y la propiedad RecordCount del grid. El hecho de utilizar la
propiedad RecordCount implica que el DBMS (no el código generado) barre dos
veces la tabla base del Grid (la primera vez para contar y la siguiente para "cargar").
El método LastPage ha sido pensado para que se ejecute un único comando Load por
cada registro de la tabla base. Por ello, si existen IFs en el evento Grid.Load que
pueden condicionar la ejecución del comando mencionado o se ejecuta más de una
vez el método Load por cada registro, los resultados pueden ser inesperados.
Implementación
El paginado se realiza por "número de registro". Esto quiere decir que, la página 1 tendrá los
registros del 1 al valor de la propiedad Rows, la página 2 los que van del Rows +1 al Rows * 2 y
así sucesivamente. Para mostrar la página 2, internamente, se "pasa por" los registros de la
página 1 sin mostrarlos. En general, para mostrar la página N, se "pasa por" los registros de las
páginas anteriores (N-1) sin mostrarlos.
Dada la implementación, se recomienda:
1. Tener un buen filtrado de datos (de forma que no existan muchas páginas)
2. Evitar, cuando el costo sea alto, el uso de GotoPage( N) con valores altos de N, así
como el uso de LastPage.
3. También se recomienda salvar el valor de la propiedad RecordCount en una variable
ya que cada invocación de la propiedad implica un COUNT en la base de datos.
Ejemplo
Los métodos de paginado de grids pueden ser utilizados en los eventos escritos por el usuario.
Por ejemplo:
Event Start
&Count = MyGrid.RecordCount
Pagina2.Visible = 1
EndIf
Pagina3.Visible = 1
EndIf
Endevent
Event Siguiente.Click
MyGrid.NextPage()
Endevent
Event Anterior.Click
MyGrid.PreviousPage()
Endevent
Event Enter
MyGrid.FirstPage()
Endevent
APLICACION PRACTICA
Paginación a pedido
Como ya mencionamos en la introducción de este capítulo, se quiere mostrar en el
web panel ”Sale of Movies” el "Catálogo de películas" programando la paginación a
pedido en la grilla de películas, cargando 5 películas a la vez y pudiendo filtrar por
género y por título.
Para hacer esto vamos a tener que crearnos dos variables en la parte fija del web
panel, donde el usuario va a indicar los filtros correspondientes (&genre y &title),
pudiendo en el caso de la variable &genre definirnos un dynamic combo box que
nos cargue los géneros existentes de la tabla de géneros, agregando una opción
(con el método additem) para poder ver las películas de “todos” los géneros. Es
decir, poner la siguiente sentencia en el evento start: &genre.additem(0,'All')
Dado que en la grilla de Películas queremos desplegar las películas filtradas por
género o simplemente desplegar todas las películas, una posibilidad es realizar la
carga en forma “manual” utilizando variables.
La ventaja de la carga manual (con respecto a usar tabla base) es que se puede
optimizar la consulta si el usuario no ingresa un género, recorriendo únicamente
la tabla Movies, evitando el join.
Por defecto, GeneXus propone nombres para los controles (que los genera según
el tipo de control y la cantidad de ese tipo que existan en el form). En muchos
casos para simplificar la comprensión de la lógica del control puede ser útil
asignarles nombres más intuitivos.
Es por este motivo que a esta grilla le asignaremos como nombre Movies y a la
otra (con los Actores de la película del mes) la llamaremos Actors.
Por otro lado, vamos a agregar dos imágenes en el formulario “Ver anteriores” y
“Ver siguientes” (prev.jpg y next.jpg respectivamente), programando su
comportamiento en el evento click de cada una.
Endevent
Event 'Search'
Movies.FirstPage()
EndEvent
Event Movies.Refresh
EndEvent
Event Movies.Load
If null(&genre) // si no se filtra por género, se recorre la tabla de Movies
For each
Where MovieTitle >= &title when not null(&title)
&photo = loadbitmap(MovieImg) //cargamos la imagen de la
película
&MovieTitle = MovieTitle
load //cargamos la película
Endfor
For each
where (MovGenId = &genre)
where MovieTitle >= &title when not null(&title)
&photo = loadbitmap(MovieImg)
&MovieTitle = MovieTitle
load
Endfor
Endif
EndEvent
Notar que la condición de filtro por película se realiza con la cláusula WHEN para
indicar que la misma se toma en cuenta cuando la variable tenga un valor. En el
caso de tener un valor nulo, no se considera la condición por lo que se recorrerá
toda la tabla.
Si ejecutamos el web panel, podemos notar que los controles que están en la
columna 1 (imagen de Chaplin, link de Registrar nuevo usuario, Usuario, Password
y botón de Login) aparecen alineados verticalmente en el "centro" de la celda en
la que se encuentran, y como esa celda crece verticalmente según el tamaño de la
grilla de películas, puede ocurrir que en ciertas ocasiones no podamos ver a todos
esos controles (a menos que hagamos scroll vertical). Para cambiarle la alineación
a TOP, lo que tenemos que hacer es presionar el botón derecho del mouse
estando posicionado en la celda de dichos controles y seleccionar la opción de
"Top" en la propiedad "Vertical Align".
Introducción
Poder diseñar Web Panels con más de un grid potencia el desarrollo de estos objetos, ya que
permite, entre otras cosas resolver en el mismo objeto accesos a diferentes tablas.
Descripción
El uso de varios grids en un web panel, implicaron un cambio en la forma de especificar en
GeneXus las reglas, los eventos y las condiciones asociados a los mismos.
Atributos.
No se permite referencias <Grid Control Name>.<Attribute>.
Esto implica que si un atributo se encuentra en más de un grid, los cambios de las propiedades
afectan a todos los grids en los que se encuentra.
Variables.
No se permite <Grid Control Name>.<Variable>.
Esto implica que no se recomienda tener la misma variable en mas de un grid ya que cuando la
misma variable está presente en más de un grid, los cambios de las propiedades afectan a
todos los grids en los que se encuentra.
Propiedades.
Las propiedades de los grids conservan la implementación y comportamiento actual ya que
siempre estuvieron asociadas al objeto.
Eventos.
Los eventos del grid conservan su comportamiento actual.
Los eventos Load y Refresh deben referenciar al grid usando la siguiente nomenclatura:
....
EndEvent
Comandos.
Los comandos que actúan específicamente sobre el grid cambian de forma de que, en caso de
haber más de un grid, se pueda determinar a cual grid se aplica, estos comandos son:
For each line: Este comando debe incluir una referencia al grid de la siguiente forma:
For each line IN <Grid Control Name>
Load: Dispara la carga del grid. La sintaxis continua siendo Load, pero debe incluirse
dentro del evento load asociado a dicho grid. Si el objeto solo tiene un grid, no es
necesario usar la nomenclatura nueva.
Ejemplo
Event Grid1.Load
Load
Endevent
Reglas.
Order: Quedan asociadas al grid. (Se puede editar dando clic con botón derecho
sobre el grid)
Hidden: Los atributos / variables nombrados en esta regla son colocados como
“hidden” en cada uno de los grids. No se recomienda su uso, en contrapartida se
recomienda agregar el atributo / variable al grid y luego ocultarlo usando la
propiedad visible.
La razón para promover el uso de los atributos / variables con la propiedad Visible en
False en lugar de la regla hidden es que los atributos referenciados en las reglas hidden
están en TODOS los grids mientras que los otros sólo están para el grid en que fueron
definidos. Esto redunda en menos código HTML a enviar al Browser y, en
consecuencia, mejor performance
Precedencias
Order: Si el conjunto de atributos de la regla se corresponde con los de algún grid y
este tiene un orden asignado explícitamente este último es el que se toma en
cuenta.
Conditions.
Las condiciones se pueden indicar por cada grid o en forma general para el objeto.
Si hay condiciones generales y particulares sobre los mismos atributos, se toman en cuenta
todas.
Los atributos que participan en la determinación de la tabla base de cada grid son los que:
Están en el grid
Están referenciados en las reglas Hidden y Order aplicadas al grid y en conditions
aplicadas al grid
Tampoco participan los atributos que están en los Eventos (fuera de los grupos For each) como
ocurre en los work panels. Estos, deberán pertenecer a la tabla extendida de alguno de los
grids.
Carga.
La carga se realiza para cada grid de forma independiente, es decir, aún si los datos que se
muestran en ambos grids están relacionados, el especificador no relaciona las cargas.
La carga incluye el evento refresh, o sea que la secuencia de carga de un objeto con 2 grids es:
El orden en que se cargan los grids es como aparecen en el form: de arriba hacia abajo y de
izquierda a derecha.
Aplicacion practica
Multiples subfilesgrillas
Lo que nos quedaría por hacer en este web panel es desplegar la imagen y
resumen de la "Película del Mes" (que para simplificar la supusimos fija, la de
código 4), y una grilla subfile con los Actores de dicha película.
Parm(MovieId);
Event Start
Endfor
EndEvent
Grid de actores
Vamos a desplegar en cada línea del grid, la concatenación del apellido y nombre
de cada actor separado por coma, para lo cual vamos a tener que realizar la carga
“manualmente”, esto es, en el evento Actors.load.
Haga clic aquí para ver como incluímos en el form el grid de Actores, y le
llamamos “Actors”.
Event Actors.Load
For each MovieId //se recorre la tabla Movie_Act
&actorname = concat(ActLastName, ActName,', ') // &actorname es la
variable presente en el grid de actores.
actors.load()
Endfor
Endevent
Grid de precios
Carga del grid
En el grid de precios vamos a tener que desplegar “para cada tipo de película” un único
registro con el precio (el de fecha máxima).
Recuerde que el MovieId se recibe como parámetro. Entonces recorremos la tabla Movie_Prc,
para obtener para cada tipo de película (MovieTypeId), el precio (MovieLinPrc) que se
corresponde con la fecha más reciente (MovieLinDate).
En una variable el usuario indicará la cantidad que desea comprar (la vamos a implementar
con un combo box con los valores del 0 al 5, y la llamaremos Qty).
Observe que hay que tener disponible para cada línea del grid el valor del
MovieTypeId , ya que lo vamos a tener que pasar como parámetro al momento de
presionar el botón de “Add to cart” para generar la orden de compra
correspondiente.
Entonces, haremos la carga del grid en forma manual, incluyendo las siguientes
variables:
Variable Type
&Qty N(5)
&MovieTypeDsc Based on MovieTypeDsc
&MovieTypeId Based on MovieTypeId
&MovieLinPrc Based on MovieLinPrc
Event Prices.Load
for each MovieTypeId
defined by MovieLinPrc
&Movietypeid = MovieTypeId
&MovieTypeDsc = MovieTypeDsc
&flag = 0
for each (MovieLinDate)
if &flag = 0
&MovieLinPrc = MovieLinPrc
&flag = 1
endif
endfor
prices.Load()
endfor
EndEvent
Se va a tener que recorrer el grid de precios para ver las cantidades que se
desean comprar para cada tipo de película y acceder a la tabla de órdenes para
ver si existe una orden para ese cliente que se encuentre en estado de
"Pendiente", y de ser así agregar esta compra a las líneas de la orden. En caso de
no existir una orden pendiente para ese cliente, se deberá dar de alta una orden
nueva (como "Pendiente") y las líneas que correspondan.
Una vez recorridas todas las líneas del grid se quiere llamar a una web transaction
(“Purchase Order”) que despliegue los datos de la orden generada hasta el
momento, donde se va a permitir eliminar o modificar los datos de las líneas de la
orden.
For each
&PurOrdId = PurOrdId
Endfor
For each line in Prices se recorre el grid de precios, donde se indicó la cantidad que se
desea comprar
if not null(&Qty)
If null(&PurOrdId)
&PurOrdId = udp(PAddHead, &CustId)
endif
call(PAddLine,&PurOrdId ,MovieId, &MovieTypeId,&Qty)
endif
Endfor
call(TPurchaseOrder,&PurOrdId) muestra la orden de compra generada hasta el
momento
EndEvent
Nota Importante
Observe que en ese evento se usa el CustId, para armar la orden de compra. Por
el momento (hasta que no veamos el capítulo de Seguridad), asumiremos que el
usuario ingresa su usuario, contraseña y presiona el botón de LOGIN
“inmediatamente antes de” presionar el botón de “Add to cart”. De esta forma
obtenemos en el evento correspondiente al botón de LOGIN, en la variable
&CustId, el CustId del cliente logueado, para luego poder usuarlo en el evento
correspondiente al botón de “Add to cart”. Como vimos en capítulos anteriores, es
necesario en este caso tener la variable &CustId en el form. Revise lo visto en
“Ejemplo: Esquema de trabajo en Internet”
GRIDS ANIDADOS
Es posible definir grids 'anidados' en un web panel.
Los grids anidados consisten en un grid Freestyle al que se puede insertar dentro de una celda
otro grid estándar u otro Freestyle.
Por ejemplo, se quiere tener un web panel que muestre los productos, pero indentados por
categoría:
Electrodomésticos
Heladera
TV
Muebles de escritorio
Silla ejecutiva
Mesa de directorio
...
Para ello se define un grid free-style con la categoría y dentro de este se inserta otro grid con
los productos.
Puede haber grids anidados de varios niveles y puede haber también paralelos. Puede decirse
que se está definiendo un árbol en donde cada nodo es un grid.
Cada grid puede ser un free-style o un grid común, aunque si es común no puede tener
ninguno anidado.
Los grids comunes solo pueden ser hojas del árbol de anidación.
Para relacionarlas, se deben incluir en los grids los atributos relación necesarios.
Generalizando el concepto, se deben incluir atributos que determinen específicamente la tabla
base deseada.
Como existen las propiedades Visible y Hidden, no tendrán porque visualizarse en el grid, pero
sí deben participar en la definición.
Siguiendo con el ejemplo anterior, el grid de Productos deberá tener el código de la categoría
para que los relacione.
Sf1: CatDsc
Disparo de Eventos
El manejo de eventos es análogo al del resto de los grids: se tienen los eventos refresh, load.
Cada vez que se ejecuta el comando Load en un grid con anidaciones, se llama al
evento Refresh y load de cada hijo. Cada grid puede o no tener tabla base (es
decir un for each implícito). Si no lo tiene, se deben cargar los datos con el
comando Load como en el resto de los grids sin tabla base.
Una posible aplicación del uso de grids anidados en nuestro Sitio de Venta, es
disponer de un catálogo completo de películas clasificadas por su género.
Para eso creamos un web panel con el estilo del sitio, denominado ‘MovieCatalog’ y
agregamos un grid freestyle donde colocamos los atributos MovGenId, MovGenDesc
y dentro de este grid colocamos otro (también de tipo freestyle) con los atributos
MovieId, MovieTitle para desplegar la información de la película.
Como vimos anteriormente el grid puede ser estándar o Freestyle, en este caso
elegimos un grid Freestyle simplemente por el modo en que esta página va a ser
diseñada.
La manera de ocultar los atributos que no queremos que se vean dentro de los
freestyle grids, es poner lo siguiente en el evento start:
MovGenId.Visible = 0
MovieId.Visible = 0
Para mejorar el diseño de nuestro catalogo, podemos agregarle las imágenes de las
películas y realizar algunas pequeñas modificaciones.
CustId*
CustAddssId*
CustAddssDsc
2) Agregar una imagen o botón en cada línea del grid, y en el evento asociado
llamar a otro objeto que permita realizar la modificación
AllowHovering
AllowCollapsing
Porque de querer hacerlo así, en el código asociado al botón tendríamos que hacer
lo siguiente:
Es por este motivo que la única forma de implementar esto como lo explicamos
anteriormente.
La forma de hacer que una variable dentro de un grid sea editable, para que el
usuario la pueda modificar es la siguiente:
Tener un for each line en el evento asociado a algún control del form, ó
un evento click asociado a algún control en las líneas del grid
Si se quiere que algunas variables sean editables y otras no, usar la Regla
noaccept() para aquellas variables que se quiere que sean readonly.
Nota:
Y el evento sería:
Event 'My Addresses'
call(HCustAddresses ,CustId)
INTRODUCCION AL CAPITULO 5
En nuestra aplicación ventas de películas el área de login, se repite en gran parte de
los web panels que hemos diseñado. Hasta el momento, usábamos un style para
inicializar el objeto, pero como se mencionó anteriormente los styles en ambiente
web no tienen el dinamismo que tienen en ambiente win.
Los ‘Web Components’ son Web Objects que tienen una propiedad que indica que
son componentes. Es decir, pueden ser ejecutados en forma independiente como
cualquier otro Web Object o pueden formar parte de otro objeto web (Web Panel o
Web Transaction); por ende permiten a los diseñadores de aplicaciones Web GeneXus
un alto grado de reutilización de los mismos.
Cualquier parte de un Web Panel que se repita en varios objetos web de una
aplicación, puede ser definida como Web Component.
La idea entonces es, en lugar de tener implementado, por ejemplo, la carga del
menú en cada uno de los Web Panels que requieren el mismo, programarla en un
Web Component y reutilizarlo en cada Web Panel que requiere un menú.
Los Web Components se generan dentro del mismo HTML del Web Panel que los
contiene. Esto significa que el servidor resuelve la inclusión del Web Component en
tiempo de ejecución y devuelve al navegador el código HTML con el Web
Component ya incluido.
Uso de Web Components
Para insertar un Web Component en un Web Panel o Web Transaction se debe
Propiedades
El objeto Web Component tiene las siguientes propiedades de diseño:
&variable = ‘HMenu’
Comp1.Object = Create(&variable)
Do Case
Case &Var=”Objeto1”
Create(Objeto1)
Case &Var=”Objeto2”
Create(Objeto2)
....
endcase
Observaciones
En diseño, el tamaño del Web Component permanece fijo, pero en
ejecución, el tamaño quedará sujeto al espacio ocupado por el mismo.
La forma de fijar el tamaño del Web Component en ejecución es
entonces incluyéndolo en una tabla y fijando el tamaño de la celda.
Un Web Component puede a su vez contener otros Web Components.
Los parámetros de los Web Objects cuando son utilizados como Web
Components no son opcionales. Notar que esto es una diferencia con
los Web Panels ‘comunes’ cuyos parámetros sí son opcionales.
La asignación de un Web Component puede realizarse dentro de
cualquier evento del web panel ‘padre’.
Si se asigna un Web Component en el evento Start del padre, los
parametros se pasarán solamente la primera vez que se crea. En
sucesivos POST, los parámetros se recordarán del render anterior.
Si se asigna un Web Component en cualquier otro evento (Refresh,
Load, de usuario, etc.), los parámetros se pasarán siempre que se
ejecute dicho evento.
Si se asigna el web panel en la propiedad Object del control Web
Component en diseño, el pasaje de parámetros se realiza en forma
análoga a lo descrito en el punto anterior.
Los controles y las variables de los Web Components no son accesibles
por los objetos que los contienen (objeto web ‘padre’). Si por ejemplo
se desea que un campo del Web Component tenga un color
determinado por el padre, se le tendrá que pasar por parámetro el
color y asignarlo en el evento Start del Web Component.
En ejecución, las propiedades del form del Web Component son
heredadas del objeto web que lo contiene. Por ejemplo si el form de un
Web Component tiene color verde, pero el form del objeto web que lo
contiene tiene color blanco, entonces este último predominará sobre el
primero. No es así con las propiedades de los demás controles.
No se soporta el uso de atributos como primer parámetro de la función
Create.
En C/Sql y Visual Basic el .EXE o .ASP del main incluirá los fuentes de
todos los web components llamados por él. Esto es diferente en Java y
.Net, donde cada objeto tiene su propio .class o .dll. Esto no
necesariamente es un problema para Visual Basic o C (los servidores
tienen tecnología de “swapping” lo cual implica que no haya perdida de
performance por el tamaño del EXE o ASP).
TRANSACCIONES COMO WEB COMPONENTS
Introducción
A partir de la versión 8.0, no solo un Web Panel puede ser un Web Component, sino tambien
cualquier Transacción con interfaz web.
Alcance
Objetos: Transacciones
Interfaces: Web
Descripción
La posibilidad de definir una transacción como Web Component permite tener en un Web
Panel varios componentes, algunos conteniendo Transacciones (para altas, bajas y
modificaciones de datos) y otros conteniendo Web Panels que despliegan información
relacionada, menues, etc.
La definición y el uso de una transacción como Web Component es similar al caso de Web
Panels como Web Components
Observaciones
Es posible tener varios web components con transacciones en un mismo web panel, pero se
deben tener en cuenta los siguientes puntos:
El estado de grabación no se mantiene por cada componente. Esto significa que si el usuario
ingresa a un componente y realiza una operación (por ejemplo modifica un atributo de la
transaccion y oprime el boton “Aplicar Cambios” por primera vez) y no reconfirma la misma, al
realizar una operación en otro componente (por ejemplo un GET), se pierden los cambios
realizados en el primero (es decir se refresca la página con el valor y estado que tenía antes de
modificar el atributo).
Ejemplos
Puede obtener un ejemplo en esta URL:
http://www.gxopen.com.uy/hproject.asp?122
EJECUCIÓN DE OBJETOS WEB CON WEB COMPONENTS
A continuación se describe la ejecución de objetos Web que contienen Web
Components.
Ejemplo:
A B
En este caso el orden de los eventos cuando se ejecuta por primera vez es el
siguiente:
Todos los eventos del Web Component (START, REFRESH y LOAD si tiene
subfiles) se ejecutan cada vez que aparece el Web Component.
Un Text Block tiene menos funcionalidad que una variable. Sin embargo, en la
medida en que la funcionalidad adicional no sea necesaria es recomendable
utilizar un Text Block en lugar de una variable ya que el código HTML generado
para un Text Block es normalmente menor (en algunos casos la mitad) que el
de una variable. Es importante notar que la cantidad de código HTML generado
depende del contenido de la variable o del valor de la propiedad Caption de un
Text Block.
Lo que vamos a hacer ahora es reemplazar el área de login en el web panel ‘Sale of
Movies’ por un web component.
Para poder hacerlo, lo primero que vamos a hacer es definir un nuevo web panel,
que llamaremos Login, e indicar que el mismo es un web component.
Nota:
EMBEDDED PAGES
Introducción
El objetivo de las ‘Embedded Pages’ es poder incluir información externa, es decir desplegar el
contenido de cualquier URL en objetos web generados por GeneXus.
Alcance
Objetos: Web Panels, Web Transactions
Interfases: Web
Descripción
Una ‘Embedded Page’ es un control que se puede insertar en un Web Panel o una Web
Transaction. A este control se le puede asociar cualquier página u objeto web GeneXus, cuyo
contenido luego será incluido en ejecución dentro del objeto.
Requerimientos
Para poder visualizar objetos Web que contienen ‘Embedded Pages’, se requieren browsers
que soporten el tag correspondiente al ‘inline frame’ (<IFRAME>). En consecuencia, el browser
(en el cliente) debe ser como mínimo Internet Explorer 4.0, Netscape 6.0 o versiones
superiores.
Propiedades
El control ‘Embedded Page’ tiene las siguientes propiedades:
ControlName: Nombre del control.
BorderStyle
Scrollbars
Source
TooltipText
Height
Width
Align
PROPIEDADES MODIFICABLES EN EJECUCIÓN
A continuación se detallan las propiedades modificables en tiempo de
ejecución:
BorderStyle
TooltipText
Source
Visible
Height
Width
HeightUnit
WidthUnit
Observaciones
Si en las propiedades del control no se especifica la propiedad
Source, entonces en el evento START o REFRESH se debe
asignar algún valor a la misma. Por ejemplo EP.Source =
“http://www.genexus.com”, siendo EP el nombre del control
‘Embedded Page’.
Se permite la asignación dinámica de URLs, es decir se permite
algo del estilo
&url = “http://www.genexus.com”
EP.Source = &url
Se pueden incluir Embedded Pages dentro de subfilegrids freestyle.
INTRODUCCION AL CAPITULO 6
A lo largo de este capítulo discutiremos como se comportan las transacciones que
se ejecutan en el web (transacciones con form HTML).
TRANSACCIONES WEB
Descripción
Las Transacciones Web no son un nuevo tipo de objeto GeneXus, sino un nuevo form para las
transacciones tradicionales que permiten su ejecución en navegadores.
También facilitan el diseño de aplicaciones Web porque permiten resolver el ingreso de datos
sin tener que definir Web Panels y Procedimientos para resolverlo, realizando
automáticamente todos los controles de integridad referencial necesarios.
Para diseñar este nuevo form Web, que será el que se visualizará en ambientes Internet se
utiliza el mismo editor HTML que en el diseño de Web Panels.
¿Cómo se define en GeneXus?
Para diseñar el form Web de una transacción, se debe abrir la transacción y
seleccionar la opción Object/Web Form del menú GeneXus.
Inicialmente se crea un form donde se muestran los botones de movimiento, los atributos que
componen la transacción y sus descripciones y los botones para confirmar los datos.
También tiene un control denominado Error Viewer donde se despliegan los mensajes. Este
control podrá ubicarse en cualquier parte del form y se le podrán asignar propiedades (tipo de
letra, color, etc.).
Los botones definidos automáticamente por GeneXus pueden cambiarse por imágenes a las
que se les asocian en la propiedad OnClickEvent los eventos estándar de GeneXus (por
ejemplo, ‘Next’, ‘Last’, ‘Get’, etc.)
Las Transacciones Web tienen un diálogo a pantalla completa, semejante al que se provee en
el iSeries en pantallas de texto. La razón de este diseño es facilitar el uso en ambientes de
Internet donde un diálogo de tipo campo a campo como en los ambientes visuales (Visual
Basic, Visual FoxPro, etc.) resultaría inviable por performance.
Arbol de evaluación
Con este tipo de diálogo, las reglas se disparan en dos momentos: al ingresar a
la transacción (las que no tienen condiciones de disparo) y también al
confirmar los datos. Esto determina diferencias en el comportamiento de
aplicaciones que tienen diálogo campo a campo:
1. Evento Start
2. Lectura de los atributos/variables de la pantalla
3. Reglas
REGLAS
La regla Default_mode no aplica en Transacciones Web.
La regla Default (Att,&today) se dispara únicamente la primera vez que se
ejecuta la Transacción Web, en su lugar se aconseja utilizar
default(Att,today()). Lo mismo ocurre con la variable &time y la función Time()
correspondiente.
Integridad transaccional
Por la forma de trabajo en Internet, las Transacciones Web “viven” solamente
el tiempo entre que el usuario de un navegador seleccionó el link o presionó un
botón y la nueva página es mostrada. Toda modificación a la base de datos que
se haga durante la “vida” debe ser confirmada o eliminada antes de que la
Transacción Web “muera” y retorne la página resultante.
Como consecuencia, una Transacción Web inicia una UTL (unidad de trabajo
lógica) al comenzar a ejecutar y la cierra (ya sea por COMMIT o ROLLBACK)
antes de terminar. No puede formar parte de otra UTL. Si un programa llama a
una Transacción Web, ésta iniciará otra (nueva) UTL.
Control de concurrencia
Las Transacciones Web utilizan el diálogo pseudo-conversacional. Esto implica
que, mientras el usuario esta realizando modificaciones a los datos o
simplemente viéndolos, no existe ningún tipo de locks en la base de datos.
El control de cambios (es decir la validación entre la lectura inicial y la
confirmación) se realiza a nivel de cada tabla involucrada en la Transacción
Web. Los valores leídos al momento de “enviar” los datos son comparados con
sus correspondientes, en cada tabla, en el momento de “recibir” las
modificaciones (cuando el usuario presiona Confirm). Si los valores no
coinciden, se informa al usuario que hubo cambios y que debe intentar
nuevamente.
Modo Insert
Al ingresar a una Transacción Web de este tipo, se comienza en modo Insert, y se despliega
una pantalla con la siguiente forma:
Si se quiere ingresar un registro nuevo, se digitan los datos en la pantalla y se presiona el
botón ‘Apply Changes’. Esto provoca, en primera instancia, que se validen los datos ingresados
en forma similar a cuando se presiona el botón ‘Check’. En caso de que ya exista el registro va
a dar un mensaje de error que se despliega en el Error Viewer. El mensaje es ‘Record already
exists’.
Luego de actualizada la base de datos, se despliega el mensaje ‘Data has been successfuly
added’.
Modo Update
Para entrar en modo Update, se deberá poner un valor en la clave y presionar el botón ‘Get’ (
). Esto hace que se carguen los datos del registro.
Al cargar los datos también se traen las descripciones. Se pueden modificar los datos y
presionar el botón ‘Apply Changes’, y se actualizarán los datos con un procedimiento análogo
al que se sigue para el modo Insert.
Modo Delete
Para eliminar un registro primero se debe ingresar en modo ‘Update’ (ingresando la clave y
presionando el botón ‘Get’), y luego presionar el botón ‘Delete All’, lo que provoca que se
deshabilite dicho botón. En el caso de trabajar con confirmación, se desplegará el mensaje
‘Confirm deletion’
Al presionar el botón ‘Apply Changes’, se eliminarán los datos y de desplegará el mensaje ‘Data
has been successfuly deleted’:
Ahora que ya vimos como funcionan las transacciones web, podemos definir la
transacción para registrar un nuevo usuario que es invocada en el link que
definimos en el Web Panel Sale of Movies.
Parm(&CustId,&Mode);
Además, debemos agregar una regla que evite que el código de Cliente sea
ingresado:
Noaccept(CustId);
El ingreso de todos los campos es “obligatorio”, por lo cual debemos agregar reglas
que hagan este control:
Accept(&PswConf);
En el evento start, agregar el código siguiente para que los controles de ingreso de
passwords queden enmascarados:
Event Start
&PswConf.IsPassword = 1
CustPsw.IsPassword = 1
EndEvent
Ahora que ya definimos la transacción web, podemos modificar el link para registrar
un nuevo usuario, en la página principal, de forma de que le pase los parámetros
adecuados a la transacción “Customer”.
Grid
Eliminación de líneas
Nota: Es importante considerar nuevamente que cuando se está en una Transacción Web se
está modificando todo el “documento” y no se está en un nivel en particular de la misma. Por
eso para eliminar líneas se debe utilizar el botón ‘Apply Changes’ porque en realidad se está
actualizando el “documento”. Lo mismo para agregar líneas, se debe utilizar el botón ‘Apply
Changes’ porque se está actualizando el “documento”.
REGLA PROMPT ON
Introducción
Es posible definir el control que activa la llamada a un determinado prompt en objetos Web,
en lugar del bitmap utilizado por defecto.
Esto posibilita además la llamada desde Web Panels a prompts de GeneXus o de usuario.
Alcance
Objetos: Web Panels, Transactiones
Interfaz: Web
Descripción
La regla PROMPT permite especificar (opcionalmente) el nombre del control que activa la
llamada a un determinado prompt.
Nota: Esta regla aplica únicamente a objetos que se especifiquen para interface Web, en caso
que se utilice en otros objetos, se ignora la nueva funcionalidad.
Introducción
En muchas circunstancias, en una transacción Web es necesario utilizar Web Panels de usuario
en lugar de las listas de selección generadas automáticamente por GENEXUS, mediante el uso
de la regla Prompt.
Alcance
Objetos: Transacciones
Interface: Web
Descripción
Existen casos en los que un usuario requiere crear un Web Panel que luego quiere utilizar
como prompt para obtener valores de atributos.
Para invocar el Web Panel, simplemente se utiliza la regla prompt en una transacción web o
dentro de un web panel.
Al dispararse la regla prompt (haciendo click sobre un control) se abre una ventana con el Web
Panel y, al seleccionar un valor (nuevamente haciendo click) se cierra la ventana y el valor se
asigna a lo(s)/la(s) atributos/variables que corresponda.
El web panel que será utilizado como prompt debe cumplir ciertas condiciones:
1. Debe tener uno o más parámetros de tipo output. Puede tener de in, de inout
también pero lo importante es que tenga de output que son los que devolverá.
2. Alguno de los atributos, variables, text blocks o imagenes del form debe tener la
propiedad de diseño ReturnOnClick en True. Puede tener habilitada esta propiedad
en más de un atributo/variable. En caso de ser un atributo o una variable, tiene que
estar Read Only para que la propiedad esté habilitada.
3. Los valores a retornar (de los parámetros definidos como de output) no se
determinan al realizar click, sino al desplegarse la pantalla por lo que tienen que
tener el valor válido a retornar en cada Load (si se muestra un grid, por ejemplo).
Si uno de los atributos variables, text blocks o imagenes del form que tienen la propiedad de
diseño ReturnOnClick en True también tiene programado el evento Click, el código que este en
el dicho evento se ignora. Simplemente al hacer click se asignan los valores a las variables de
tipo OUT y se retorna.
Uso avanzado
Esta funcionalidad puede no contemplar todos los casos. Por ello, también se implementó la
función ReturnOnClick() (sin parámetros) que puede ser asignada a la propiedad Link de
cualquier control (que tenga esta propiedad).
Ejemplos
Prompt de Clientes
Un prompt de clientes se programa así:
En los Eventos:
event Grid1.load
&CliCod = CliCod
endevent
En el form:
Un grid que tiene CliNom y CliCod, donde CliNom (por ejemplo) tiene la propiedad
ReturnOnClick en true.
Parm(PurOrdId);
Además, tenemos que modificar el web panel ‘Sale of Movies’ para poder devolver
el código de la película elegida cuando el cliente haga clic sobre la imagen. Esto se
logra modificando la propiedad Returnonclick (valor “True”) de la imagen, y
poniendo como parámetro de salida el MovieId.
Se quiere dar al usuario la posibilidad de dar por finalizada la orden, para lo cual
agregaremos en la pantalla de la transacción un botón de "Confirm Order". En el
evento asociado, vamos a tener que cambiar el status de la orden a "Finalizada"
(invocando al procedimiento ProcofPurchOrder) y llevar en forma automática al
usuario al web panel principal del Sitio (‘Sale of movies’).
Haga clic aquí para ver la demostración
INTRODUCCIÓN AL CAPÍTULO 7
Las aplicaciones Web necesitan un look & feel bastante más sofisticado que las aplicaciones
Winform y los desarrolladores no tenemos las habilidades y el tiempo para lograr un diseño
con esas características.
Por esa razón, por lo general se opta por contratar servicios de diseño. Por lo cual, es necesario
luego integrar ese diseño con la aplicación GeneXus. Esta integración se logra a través de los
“Themes”.
Para el diseño gráfico contamos con el “Editor de Themes”, una herramienta de libre
distribución que se puede ejecutar en forma independiente de GeneXus.
Mientras que en versiones anteriores las propiedades de los controles en los “html forms”
(Web Panels y forms html de las transacciones) debian ser configuradas en los controles,
hoy mediante los “Themes” se pueden definir “Clases” para los diferentes tipos de controles y
asignarles propiedades a esas Clases.
Luego, los controles se asocian a esas clases, y éstos heredarán las propiedades allí
configuradas. Por lo tanto ya no es necesario establecer los valores de las propiedades para
cada control en el form. Las propiedades de los controles se configuran en un único lugar: en
las clases del Theme.
Recuerde que en el capítulo 2 se dió una introducción del objeto Theme e incluso se realizaron
algunos ejercicios para comprender su funcionamiento.
Veremos a lo largo de este capítulo en forma más completa, las diferentes funcionalidades que
brinda este objeto, que se introdujo en la versión 8.0 de GeneXus.
El editor de Themes es una herramienta de libre distribución que se puede ejecutar en forma
independiente de GeneXus. Esto es para que la herramienta pueda ser usada por el diseñador
gráfico, y el desarrollo de la aplicación se independice e incluso se paralelice con su diseño.
Se despliega como una estructura jerárquica de Clases, la siguiente es una imagen del editor
de Themes:
Se puede observar que descendiendo en la estructura jerárquica, se presentan un nodo
“Classes” y un nodo “HTML tags” (parte izquierda). Al centro, tenemos las propiedades
correspondientes a cada una de las Clases, y Tags HTML; y a la derecha un preview que es una
vista de cómo se visualizará en ejecución un control asociado a la clase correspondiente.
CLASES
A partir del nodo “Classes” se despliega un conjunto de clases predefinidas, correspondientes
a controles GeneXus.
Una clase podrá ser asignada a un control en tiempo de diseño, y en runtime a través de la
“Propiedad Class”.
clases predefinidas
1. Attribute
2. Button
3. Error Viewer
4. FreeStyle Grid
5. Grid
6. HyperLink
7. Image
8. Table
9. Textblock
10. Form
Nota 1:
BTnCancel
BtnCheck
BtnDelete
BtnEnter
BtnFirst
BtnGet
BtnHelp
BtnLast
BtnNext
BtnPrevious
BtnRefresh
BtnSelect
Nota 2:
Las propiedades del Form, que se definen en GeneXus se aplican al BODY del HTML. Esto es
porque algunas de esas propiedades no son soportadas por el tag FORM (por ejemplo, el
background color).
Por la misma razón, la clase Form queda en runtime asociada al tag BODY.
Clases derivadas
La parte inferior del editor muestra el nombre de la propiedad, junto con una
descripción de la misma. Además dirá “Inherited: True” o “Inherited: False
según corresponda.
Si para una propiedad de una clase dice “Inherited: True”, significa que su valor es un reflejo
del valor de la misma propiedad del padre. Es decir, cualquier cambio en la clase padre se
traduce en un cambio en la misma propiedad en el hijo.
Propiedades de un Theme
Las propiedades de un Theme son las siguientes:
Nota:
En este panel es posible configurar las propiedades de la clase seleccionada, o del HTML Tag
seleccionado, como se visualiza en la figura:
1. Background Properties
2. Box
3. Classification
4. Font
5. Misc
6. Text
BorderColor
BorderStyle*
BorderWidth
Font
Height
Width
TooltipText
Word Wrap
Caption
Background
BorderStyle*
Height
Width
Además, se tienen todas las propiedades, fuera del grupo “Misc”, que como se
mencionó anteriormente son propias de los CSS.
Clase Attribute
Dentro de las propiedades del grupo “Misc”, se tienen las siguientes propiedades, que si bien
pertenecen a ese grupo, no se encuentran dentro de GeneXus para los atributos/variables:
Background
BorderColor
BorderStyle*
BorderWidth
Height
Width
Las propiedades de los demás grupos aparte del “Misc” tienen su definición correspondiente al
pié del Editor de Temas, y pertenecen al estándar de CSS.
Clase Image
La clase Image se puede asignar tanto a controles imagen, como a variables de tipo bitmap.
Las propiedades del grupo “Misc”, que no se encuentran disponibles en diseño en GeneXus
para imágenes son las siguientes:
BackColor
BorderColor
BorderStyle*
Font
ForeColor
Las propiedades de los grupos distintos de “Misc” pertenecen al estándar de CSS.
En particular, el valor de la propiedad Margin del Editor de Themes, se suma al valor de las
propiedades Hspace y Vspace de GeneXus (caso de imágenes).
Margin
Border
Padding
Content
La hspace y vspace son similares al border, por eso se "suman" cuando se define un margin.
Clase Table
Las propiedades del grupo “Misc”, que no se encuentran disponibles en diseño en GeneXus
para tablas son las siguientes:
BorderStyle*
LinesColor
LinesFont
Clase Grid
La propiedad que se encuentra en el grupo “Misc”, y no está en diseño en GeneXus, es:
Borderstyle*
Clase FreeStyleGrid
Clase TextBlock
Las propiedades del grupo “Misc”, que no se encuentran disponibles en diseño en GeneXus
para textblocks son las siguientes:
BackColor
Background
BorderColor
BorderStyle*
BorderWidth
Height
Width
Font**
ForeColor**
Clase ErrorViewer
Las propiedades del grupo “Misc”, que no se encuentran disponibles en diseño en GeneXus
para el control ErrorViewer son las siguientes:
Background
BorderColor
BorderStyle*
BordeWidth
Height
Width
Nota:
*La propiedad BorderStyle, en el Tema, tiene una gama de valores más amplia que en el caso
de la misma propiedad en GeneXus.
Los valores que la propiedad acepta en el Tema son los que admite la tecnología CSS y son los
siguientes:
None
Dotted
Dashed
Solid
Double
Groove
Ridge
Inset
outset
Preview del editor de Themes
En la barra vertical derecha del editor, hay un botón “Preview” mediante el cual se
puede mostrar o no, una vista previa de cómo se visualizaría un control asociado a
dicha clase.
La vista previa del editor se puede personalizar, agregándole “Custom Views”, que son
archivos .HTML. Para eso, agregar una nueva vista a través del menú contextual del nodo
Custom Views, o presionando la tecla INS sobre el mismo.
Se puede modificar el source y ver los cambios reflejados en el HTML, pero no se salvan dichos
cambios en el documento que esté activo.
Si se tienen diferentes clases form definidas (es decir, distintas clases hijas de la
clase predefinida form), el preview para el resto de los controles se ve con un
aspecto de fondo correspondiente a la configuración de aquella clase form que sea
la default.
HERENCIA DE LAS PROPIEDADES DE UNA CLASE
En el caso de que una propiedad de una clase esté marcada como
“Inherited:False”, es posible revertir la situación.
Haciendo click con botón derecho sobre la propiedad correspondiente, aparece un
menú “Inherit Value”. Seleccionando dicha opción, la propiedad pasará a heredar
el valor de la misma propiedad del padre.
Por ejemplo si se define una clase “Bullet” derivada de Texblock, con el fin de
definir las propiedades de los textos en listas con viñetas.
Supongamos que ahora se quiere tener otra clase para los textos anidados a
aquellos que estan asociados a la clase “Bullet”, y se desea que tengan las
mismas características que la clase “Bullet” a excepción de la indentación.
Llamemos a esa clase “SubBullet” y creémosla como hija de “Bullet”. Esta clase
solo difiere con su padre en la propiedad “TextIndent”. Por lo cual, esa es la única
propiedad que no hereda, y la única propiedad que habiéndose modificado en el
padre no se refleja en la clase “SubBullet”.
Herencia: aplicación práctica
Como ejemplo del concepto de herencia en los Temas, edite el Tema “default” de la KB, y
modifique la propiedad “BackColor” de la clase Button.
Observe que para todas las clases hijas de “Special Buttons”, que es a su vez hija de “Button”,
la propiedad “Backcolor” está indicada como inherited:True, por lo cual, las clases hijas
heredan esa propiedad del padre.
Vea en la web transaction “Customer” como todos los botones cambian el “Backcolor”, siendo
que cada uno de ellos está asociado a una clase diferente derivada de “Button”.
Haga clic aquí para ver cómo se pierde la herencia de las propiedades, al ser modificadas en la
clase hija.
HTML TAGS
Los HTML Tags complementan la funcionalidad de los Themes, en cuanto a que permiten
definir las características de un Tag HTML, en un determinado contexto. Es decir, siempre que
se quiera establecer la configuración de un determinado Tag dentro de un contexto, se puede
hacer mediante el Editor de Themes. Por ejemplo, definir las propiedades de los links dentro
de una tabla.
La configuración de los Tags HTML, dada en el editor, se ve reflejada en la página Web si esos
Tags están en el HTML de la página, en el mismo contexto con el cual fueron definidos en el
editor.
El contexto está determinado por la jerarquía con la cual se definen los Tags.
Para el ejemplo que mencionábamos anteriormente, de definir las propiedades de los links
dentro de una tabla, se haría como se muestra en la figura:
Otro caso de ejemplo sería definir un tag body y la propiedad “ForeColor” del mismo, con lo
cual el texto libre de la página tomará ese color.
Aplicación práctica: Temas
Cuando se hace una aplicación Web es necesario que el sitio se vea “uniforme”.
Esto implícitamente requiere de un alto costo de mantenimiento, ya que si por ejemplo hay
que cambiar el color de una grilla de azul a celeste, probablemente habría que hacerlo en
todas las páginas del sitio para mantener la uniformidad del mismo. Antes, había que ir por
cada uno de los controles de cada objeto. Hoy el cambio se realiza en un solo lado: el Tema.
En tiempo de ejecución, ese archivo .CSS (que contiene la definición de las clases)
es referenciado en el Header de las páginas generadas, y se transfiere al pc del
cliente para almacenarse en su caché.
Observe que los objetos de la Kb del curso están asociados al Tema “Default” (a
través de la propiedad “Theme” del objeto), y los controles de cada uno de los
objetos están asociados a la clase default correspondiente (propiedad “Class” de los
controles).
En ese Tema vamos a definir una clase “BtnLogin” para la cual definiremos algunas
propiedades. En particular, vamos a asignarle una imagen a la propiedad “Background” de la
clase.
Observe que la propiedad “Base Image Path” del Tema coincide con la misma propiedad del
modelo de diseño. Entonces, dado que vamos a usar una imagen que se encuentra bajo el
“Base Image Path”, el path de la propiedad Background del Tema quedará relativo.
Al Tema “Movie” lo vamos a asociar al web panel “Login”. Debemos cambiar la clase del botón
“Login” para que sea “BtnLogin”.
Dentro de la KB es posible salvar los Themes como archivos con extensión .CSS
(objeto theme de la KB). Asimismo, dentro y fuera de GeneXus, el editor permite
trabajar con archivos con extensión XML.
Esta última funcionalidad (trabajar con archivos XML) es la que permite la
integración entre el editor como aplicación independiente y como tool de GeneXus.
Por otro lado, también se podrá desde la KB salvar un Theme con extensión .XML
de manera de poder editarlo y modificarlo por fuera de GeneXus.
Con esto se logra independizar el trabajo de diseño de las páginas, del desarrollo de
la aplicación.
Dado un diseño en formato XML (un Template creado con el Editor por fuera de
GeneXus), se puede incorporarlo a la KB rápidamente siguiendo los siguientes
pasos:
1. Abrir el Template usando el Editor desde dentro de GeneXus (opción File –>
Open Template)
2. Salvar el Template como un Theme (opción File -> save as)
Si el Editor se ejecuta por fuera de GeneXus la única opción del “save as” es
guardar un Template como otro Template.
Notas:
1. Se puede optar por crear un XML o un objeto Theme GeneXus. Si el check
“GeneXus” está seleccionado, se creará un objeto Theme, de lo contrario,
se crea un Template.
Los Templates que son incluidos con la versión son los siguientes:
Beach.xml
Classic.xml
Executive.xml
Extreme.xml
Fancy.xml
Light.xml
PinkPanther.xml
Los cuatro primeros son “serios” y siguen las recomendaciones de "buen uso" del diseño en
internet, el resto son divertidos y radicales.
1. Default
2. Designer
Cuando se crea una nueva base de conocimiento en GeneXus, se crea un objeto Theme por
defecto.
Para la inicialización de este objeto se utiliza el Theme definido como Default en el editor
(“Default Template” –ver sección “Uso del editor”). En particular, se utiliza aquel Theme
definido en el registry de la máquina: HKEY_LOCAL_MACHINE\Software\Artech\GxTheme
Editor\1.0\ThemeTemplates\DefaultTheme.
Veremos en un ejemplo práctico, como a través del Editor de Temas, se logra independizar el
diseño de las páginas, del desarrollo de la funcionalidad de la aplicación.
Una vez abierto el Editor de Temas como aplicación independiente a GeneXus, “diseñaremos”
un Template y lo salvaremos en algún directorio (es un archivo con extensión XML).
Haga clic aquí para ver como creamos el template por fuera de GeneXus.
Una vez salvado el Template en algún directorio, vamos a ejecutar esta vez el Editor de Temas
desde dentro de la aplicación GeneXus (mediante la opción “Tools->GX Theme Editor”)
Para editar el Template anteriormente creado, ir al menú del Editor de Temas “File -> Open
Template” y seleccionar el Template del directorio donde lo hemos guardado (con extensión
XML).
Para salvarlo como un Theme de la KB, ir al menú “File -> Save As”, y estando chequeada la
opción GeneXus del diálogo, salvarlo con el nombre “Movie2”.
Una vez que es un Theme de la KB, lo podemos asociar a la propiedad “Theme” del modelo.
Haga clic aquí para ver como integramos el template anteriormente creado, al modelo del
curso.
INTRODUCCION AL CAPITULO 8
Una pregunta muy importante a la hora de desarrollar una aplicación para
Internet, es la siguiente:
¿Es segura nuestra aplicación en Internet?
Intercepción de información
El protocolo TCP/IP no fue diseñado para ofrecer servicios de comunicación seguros. En
consecuencia, la información enviada desde el navegador al servidor web o viceversa puede
ser interceptada por alguien.
Es por esta razón que se debe agregar tecnología adicional para resolver problemas de
seguridad.
Desde siempre, existe una única tecnología que provee los principios para resolver estos
problemas: CRIPTOGRAFIA.
Existen servidores web, que pueden trabajar como servidores seguros. Un servidor seguro es
un servidor web, al cual se le habilitó la posibilidad de encriptar los datos que se envían al
navegador, así como desencriptar la información recibida del mismo.
El standard más conocido de autenticación y encriptación de datos para el Web es el SSL. Este
standard fue propuesto por Netscape Communications Corporation y es el que soportan la
mayoría de los navegadores (Internet Explorer, Netscape).
Finalmente, para activar la encriptación de los datos a transferir, todo lo que el usuario debe
hacer es realizar la solicitud del recurso a través del protocolo HTTPS: en lugar de HTTP.
La seguridad ofrecida por el servidor web, depende en parte también del largo del certificado
soportado. Cuanto más largo sea el mismo más segura es la comunicación de los datos.
Hay que destacar que los servidores seguros protegen “únicamente” la información
confidencial de ser interceptada por terceros, pero sin seguridad a nivel del sistema el servidor
web sigue siendo vulnerable a ataques.
La mayor parte de los usuarios únicamente visitan el sitio, otros, sin embargo intentarán entrar
por la “ventana” abierta. Los resultados pueden ser variados, desde el simple descubrimiento
que la página principal del sitio web fue cambiada, hasta el robo de la base de datos que
contiene la información de sus clientes.
Es entonces importante que el administrador del sistema defina políticas de seguridad, así
como tome las medidas necesarias para evitar el acceso de usuarios no deseados. Estas
medidas pueden ser a nivel del sistema operativo (restringir las operaciones que se pueden
realizar, limitar los permisos sobre documentos y directorios, deshabilitar servicios no
utilizados, etc.), como a nivel del servidor (aislamiento de la red, instalación de firewall).
Existe abundante documentación sobre el tema, que es recomendable leer, para saber que
pasos debería seguir al publicar documentos, o aplicaciones en su sitio web.
Bibliografía:
Verisign:
http://www.verisign.com/products/site/faq/40-bit.html#6
El correo:
http://www.correo.com.uy/CorreoCert/sitio_seguro.htm
Microsoft:
http://www.microsoft.com/resources/documentation/WindowsServ/200
3/enterprise/proddocs/en-
us/Default.asp?url=/resources/documentation/WindowsServ/2003/ent
erprise/proddocs/en-us/iis_security.asp
http://www.microsoft.com/technet/security/topics/hardsys/default
.mspx#XSLTfullModule122121120120
http://www.securityfocus.com/infocus/1694
SEGURIDAD A NIVEL DE LA BASE DE DATOS
A nivel de la aplicación, la seguridad depende del tipo de aplicación que se esté desarrollando.
La razón por la cual son necesarios dichos controles, es que los parámetros que se pasan entre
objetos web (y entre páginas dinámicas en general) viajan visibles al usuario, como por
ejemplo:
http://www.artech.com.uy/cgibin/hmyapp.exe?1,’NOMBRE’.
Por lo tanto, por más que se disponga de una página de login, donde se valida el usuario y su
contraseña para ingresar al sistema, el usuario eventualmente podría saltearse la misma,
ingresando en el navegador la URL de la siguiente página con un código de usuario válido.
Para evitar que se burle el control de acceso y permitir que se acceda a información
confidencial, es que se debe agregar algún tipo de control adicional de seguridad.
MANEJO DE SESIONES
Una de las posibles alternativas para solucionar el problema de seguridad mencionado
anteriormente, es el uso de sesiones.
La primera vez que un usuario ingresa al sitio debe registrarse al mismo, creando un nuevo
usuario (navegando a través del link “Click here to complete a brief registration form”, el cual
lo lleva a la transacción “Customer”). De esa forma se da de alta el cliente, y se crea un
registro en la tabla SECURITY con el identificador del cliente, el número randómico de sesión,
la fecha y hora de la registración.
Luego se llama a la página donde se muestra la información a la cual únicamente los clientes
registrados pueden acceder, en este caso, ingresar productos al carrito de compras e ingresar
a la transacción de orden de compra “PurchaseOrder” para modificar detalles de la compra y
confirmar la misma.
“InsertSec” “CheckSession”
FUNCIONES DE COOKIES
Introducción
El objetivo es proveer funciones que permitan leer y grabar cookies desde objetos web
generados por GeneXus.
El uso más común de las cookies es la identificación de usuarios. Cuando un usuario se registra
en un web site (Portal o E-Store), el sitio graba una cookie en la máquina del cliente con la
identificación del cliente. De este modo la próxima vez que el cliente visite este sitio, intenta
leer la cookie y si la misma existe usa el valor de la cookie para identificar el usuario y
recuperar sus preferencias desde una base de datos.
También existen otros usos de las cookies, como rotación de contenido (especialmente avisos),
mantener estado de una aplicación, etc. Incluso se pueden usar como método de almacenar el
“carrito de compras” de modo que la información del mismo quede en la máquina cliente y se
mantiene entre conexiones.
Como se menciona anteriormente, generalmente se usa una cookie para identificar el usuario
(en algunos casos, una para la sesión, en otros para el usuario), aunque se podrían poner
todos los valores de las preferencias en cookies. Lo ideal es tener una clave que viaje y con
esta clave leer la información del usuario. De este modo la información del usuario no viaja
hacia el cliente, ni está en la URL. (Ej. tarjetas de crédito, nombre, dirección) simplemente
permanece en el servidor.
Hay que tener en cuenta que existe un límite en cuanto a la cantidad de cookies que el cliente
puede aceptar. El máximo son 300 cookies en total por cliente (para todos los servidores juntos
por cada browser/cliente) y 20 cookies por server o dominio lo cual quiere decir que si una
aplicación graba más de 20 cookies las últimas van a borrar los valores de las primeras.
Además existe un límite de tamaño de 4K por cookie, si una cookie supera ese límite es
truncada.
El usuario puede preferir no grabar la cookie permanentemente (por ej. si está accediendo
desde una máquina pública como podría ser un cybercafe) o incluso puede deshabilitar el uso
de cookies, por lo cual esta no debe ser la única manera de identificar al usuario, sino que se
debe poder usar un método alternativo en caso de que el browser no soporte o no tenga
habilitado el manejo de cookies.
Otra particularidad es que el lugar donde se almacenan las cookies (al menos en Windows)
depende del browser, por lo que si un usuario tiene más de un browser, cada uno tendrá un
conjunto independiente de cookies.
1. El usuario se conecta a un servidor que por alguna razón quiere grabar una cookie.
4. Cada vez que el usuario se conecte a una URL de este dominio el browser enviará al
server las cookies que se hayan grabado desde el dominio y no hayan expirado.
http://www.cookiecentral.com
Descripción
Se dispone de las siguientes funciones, las que pueden ser utilizadas en cualquier objeto
GeneXus, el resultado tiene sentido únicamente si dicho objeto fue llamado en forma directa o
indirecta por un objeto web o está ejecutando en un ambiente Web.
GetCookie
La sintaxis es:
&var_char = GetCookie(NombreCookie)
NombreCookie – carácter
&var_char – carácter
SetCookie
La sintaxis es:
Los parámetros entre paréntesis rectos son opcionales. Si alguno de los parámetros va nulo se
asume el default.
&var_num – variable numérica.
NombreCookie -Carácter
Nombre de la cookie
Valor - Carácter
Valor a almacenar
path - Carácter
Exp-date - Date/Datetime
Domain-name - Carácter
Secure - Numérico
Observaciones
Las funciones mencionadas anteriormente siempre devuelven 0. La única forma de
detectar si una cookie fue almacenada es leerla. En consecuencia no se puede
obtener la configuración del navegador.
Ejemplos
Algunos ejemplos sencillos sobre cómo grabar una cookie son:
Aquí se está grabando una cookie -válida para todo el dominio- de nombre ID_USER con el
valor correspondiente al atributo UsrId y que expirará el 1° de Enero de 2002.
Aquí se está grabando una cookie -válida para los web panels de la misma aplicación -de
nombre SESSION_ID_GX- con el valor correspondiente a la variable &Strsession. La cookie
expirará al cerrar la sesión del browser.
Aquí se está grabando una cookie -válida para todo el dominio ‘otrodom’- de nombre
USER_PAIS con el valor UY y que expirará exactamente dentro de un año.
TIPO DE DATOS WEBSESSION
Introducción
WebSession es un nuevo tipo de datos de GeneXus que permite almacenar datos en una
sesión de usuario del servidor Web. De esta manera se pueden tener variables globales,
accesibles mientras la sesión esté activa.
Alcance
- Objetos: Transacciones, Web Panel, Procedimientos
- Interfaces: Web
Descripción
Los servidores Web permiten manejar el concepto de sesión. Una sesión se identifica por una
clave única, que se mantiene mientras el usuario continúe en el sitio Web.
El objeto WebSession permite almacenar información que será visible desde cualquier objeto
Web dentro de la sesión activa como si fueran variables globales al sitio.
Para utilizar el objeto WebSession, se debe definir una variable de este mismo tipo y aplicarles
los métodos y propiedades adecuados.
Propiedades:
Id
&Iden = &Session.Id
Metodos:
Set(key, value)
Permite hacer una entrada en la sesión activa. Key y value deben ser del tipo
String. Por ejemplo
&Session.set(“user”, &User)
Get(key)
&User = &session.get(“user”)
Remove(key)
&Session.remove(“user”)
Destroy()
&Session.destroy()
Consideraciones Generales
El ID de la sesión se guarda en una cookie en el cliente, aunque esto es transparente
para el programador.
La validez de la Websession es similar a la validez de las cookies que solo valen por la
sesión. Esto quiere decir que si se abre una instancia nueva del browser, se pierde la
sesión, pero si abro en una ventana nueva se mantiene.
Los datos y el ID de una sesión son diferentes para cada generador. Esto implica que
no puedo hacer un link de un Web Panel VB a un Web Panel Java y mantener los
valores de la sesión
Ejemplos
For each
Where UsrNom = &User
Where UsrPsw = &Password
&Session.Set(“Name”, UsrNombre)
Call (HWelcome)
When none
Return
//Usuario no valido
endfor
&UsrNombre = &session.Get(“Name”)
If Trim(&UsrNombre)=””
Return ///Sesión no valida
Else
TX.Caption = “Bienvenido “+ &UsrNombre + “a nuestro sitio!”
Endif
ENCRIPTACION DE PARAMETROS
Introducción
Los objetos Web generados con GeneXus, permiten visualizar los parámetros que se pasan
entre los objetos en la barra de dirección del navegador.
Esto hace que, si se pasa información reservada como parámetro entre objetos Web (Número
de cliente, por ejemplo), las aplicaciones no sean muy confiables en cuanto a la seguridad,
porque un usuario podría simplemente cambiar el valor de dicho parámetro en la URL y
disponer de información sobre la que no debería tener acceso. No sucede lo mismo si se
utilizan cookies, en este caso no hay problemas de seguridad.
Es por eso que se hace necesario pasar los parámetros sin que el usuario de la aplicación los
conozca o sea encriptar los parámetros.
Alcance
Objetos: Web Panels, Transacciones
Interface: Web
Descripción
Para poder realizar la encriptación de parámetros en objetos Web se implementaron funciones
estándar que contienen las funciones básicas de encriptación y algunas funciones adicionales
(las que requieren manejo de parámetros y cookies).
Que los usuarios finales no sepan el o los datos que van en los parámetros
Que los usuarios finales no puedan modificar el o los datos que van en los
parámetros
No
Indica que No se van a encriptar los parámetros que van en la URL de los
objetos Web, siendo éste el valor por defecto.
Session Key
Indica que se van a encriptar los parámetros que van en la URL, utilizando una
clave diferente para cada sesión. La encriptación se realiza a través del uso de
cookies locales.
Site Key
Se encriptan los parámetros que van en la URL de los objetos Web, pero la
clave de encriptación va a ser la misma para todo el sitio.
La propiedad a nivel de objeto, además de los valores mencionados tiene el valor “Use model’s
preference value”. Este valor indica que se va a tomar el valor de la preferencia del modelo
para realizar la encriptación de ese objeto. Este es el valor por defecto.
Consideraciones Generales
Sesiones del Navegador
Una sesión del navegador queda determinada por una instancia del mismo. Por ejemplo, si en
un máquina se ejecuta el navegador de Internet y a partir de ese navegador se abre otra sesión
(a partir de la opción de menú File/New/Window o a partir de un link), ambas sesiones
pertenecen a la misma instancia del navegador.
En cambio, si se abre una sesión del navegador, y luego se ejecuta nuevamente el exe del
navegador para abrir una nueva ventana, las dos ventanas no pertencen a la misma instancia.
Con esto, si se ejecutan objetos Web, y se configuró la preferencia del modelo (o la propiedad
a nivel de objeto) con el valor “Session Key”, la cookie que se defina para guardar este valor va
a funcionar en las sesiones del navegador que compartan la misma instancia.
Preferencia a nivel de modelo vs. Propiedad a nivel de objeto
Los valores “Session Key” y “Site Key” a nivel de la preferencia del modelo,
determinan que todos los llamados entre objetos Web se harán con parámetros
encriptados. Para tener unicamente las llamadas entre algunos objetos con
parámetros encriptados se debe indicar el valor “No” en la preferencia a nivel de
modelo y el valor “Session Key” o “Site Key” en el objeto Web que lo requiera.
Lo mismo sucede si el arbol de llamadas involucra a más objetos Web, todos (los
llamados y los llamadores) deben tener configurada la propiedad Encrypt URL
Parameters y todos deben tener el mismo valor en la propiedad.
Ejemplos
Si se tiene un Web Panel que recibe parámetros y no se utiliza la encriptación de parámetros,
la URL correspondiente al Web Panel será del estilo:
http://localhost/HINGRESO_WebObj/hdospar.asp?2,3
Si, en cambio se utiliza encriptación de parámetros (preferencia Encrypt URL Parameters =
Session Key ó Site Key), la misma URL se generará de la siguiente forma:
http://localhost/HINGRESO_WebObj/hdospar.asp?lQ/tK1lefxCZMVoXrnmrTQ==
COMPARACION DE ALTERNATIVAS DE
SEGURIDAD EN LA APLICACIÓN
A continuación se realiza una comparación entre las soluciones disponibles para agregar
seguridad a una aplicación web.
Cookies
Ventajas:
No es necesario el pasaje de parámetros entre Web Panels, ya que los
valores se graban en la cookie.
Si las cookies no son temporales, se puede saber si el usuario ya accedió
anteriormente a la aplicación.
Desventajas:
Tienen limitaciones en cuanto al tamaño máximo, cantidad de cookies que se
pueden grabar. Se tiene dependencia de la configuración del navegador.
Manejo de sesiones
Ventajas
Es independiente de la configuración del navegador del PC del cliente.
Desventajas
Mayor complejidad de programación
Pérdida de información: si el usuario pasa a una página estática, y luego
vuelve a ingresar la URL en el navegador, debe volver a loguearse.
Encriptación de la URL
Ventajas
No se requiere programación alguna, simplemente se modifica el valor de
una preferencia.
Desventajas
El tamaño de la URL aumenta al ser encriptada, por lo tanto si el
pasaje de parámetros es importante, se puede llegar al máximo
aceptado por el browser. Requieren del uso de cookies en el caso de
“Session Key”.
Utilizaremos cookies “temporales” para evitar que todo usuario que se registre al sitio desde el
mismo computador utilice la misma información de conexión.
Disponemos de un Business Object (security.xpz) que brinda los objetos
necesarios para definir la “seguridad” en las aplicaciones Internet utilizando
cookies.
Una tabla denominada Security donde se almacena para cada nuevo cliente el
número generado en forma aleatoria para su sesión, así como la fecha y hora de la
última sesión activa.
La estructura de la tabla sería entonces la siguiente:
SecId*
SecRnd (Número de sesión randómico)
SecDate (Fecha de Inicio de Sesión)
SecHour (Hora de Inicio de Sesión)
Una cookie denominada SECURITY que concatena (separados por una coma) el
número identificador del cliente (atributo CustId), así como un número generado en
forma aleatoria de la sesión de este cliente (atributo SecRnd).
SECURITY
INSERTSEC
Este procedimiento da de alta en la tabla SECURITY la primera vez que el
usuario inicia una sesión en el web.
CHECKSESSION
Este procedimiento valida el número de sesión recibido con el usuario que está
logueado, y devuelve el código de validación resultante. A la sesión se le da
una validez de 1 día.
Se distinguen tres casos: cuando el Usuario tiene iniciada una sesión vigente
(valor S), cuando el usuario tiene una sesión vencida (valor V) y cuando el
usuario tiene una sesión, pero no coincide el número randómico de sesión
(valor I).
GENSESNUM
RETSTR
Este procedimiento devuelve los dos valores almacenados en la cookie: el
número de usuario y el número de sesión.
ERROR
Este web panel se invoca siempre que sea necesario cancelar la ejecución de la
aplicación (por ejemplo: cuando la sesión ya no está vigente se invoca
automáticamente a este web panel, desplegándole al usuario el mensaje
correspondiente).
La cookie se debe grabar cuando el cliente se registra en el sitio por primera vez
(en la transacción TCustomer)) y cada vez que se identifique (evento LOGIN de
todos los web panels del sitio).
Event 'Login'
for each
where CustUsr = &CustUsr
if upper(CustPsw) = upper(&CustPsw)
&SecRnd = Udp(PGenSesNum,CustId)
&CookieVal = Concat(trim(Str(CustId)),trim(Str(&SecRnd)),',')
&result = SetCookie('SECURITY',&CookieVal)
else
EndEvent // 'Login'
2) El otro lugar donde tenemos que grabar una cookie es cuando se da de alta
un usuario nuevo. Es decir, que en la transacción ‘Customer’ (TCustomer), luego
de dar de alta el cliente, tenemos que grabar una cookie en el PC Cliente con el
CustId del cliente nuevo y el número de sesión randómico. Para esto vamos a
crear un procedimiento Login con el siguiente código:
&SecRnd = Udp(PInsertSec,&CustId)
&result = SetCookie(‘SECURITY’,&cookieVal)
Call(Plogin,CustId) if after(Trn);
Como ya dijimos antes, todos los web panels del sitio de “acceso limitado a
usuarios registrados”, deben realizar el control de la seguridad leyendo la cookie y
comparando los valores obtenidos con los valores almacenados en la tabla de
SECURITY. En nuestro caso, en el evento asociado al botón de “Add to cart” y en
el evento Start de la transacción ‘Orden de Compra’ (“Purchase Order”).
&CookieVal = GetCookie('SECURITY')
Call(PRetStr,&CookieVal,&CustStr,&SecStr)
&CustId = Val(&CustStr)
&SecRnd = Val(&SecStr)
&result = Udp(PCheckSession,&CustId,&SecRnd)
Call(PRetStr,&CookieVal,&CustStr,&SecStr)
&CustId = Val(&CustStr)
&SecRnd = Val(&SecStr)
&result = Udp(PCheckSession,&CustId,&SecRnd)
For each
&PurOrdId = PurOrdId
Endfor
if not null(&Qty)
If null(&PurOrdId)
endif
endif
Endfor
call(TPurchaseOrder,&PurOrdId)
Call(HError)
Endif
EndEvent
Nota:
1. Observe que para el usuario de prueba que se estaba usando en los ejercicios
anteriores, al momento de creado no se tenía en cuenta la seguridad del sistema, por
lo cual no fue dado de alta en la tabla de seguridad, y cualquier intento de realizar
una compra con él va a dar error. Entonces, para probar el ejercicio hecho en este
capítulo, dé de alta un nuevo usuario a través de la transacción “Customer”, y luego
pruebe agregar alguna película al carrito de compras.
INTRODUCCION AL CAPITULO 9
Existen otras características interesantes para el desarrollo de aplicaciones en el
web, que presentamos en este capítulo…
WAP
WebWrapper
Manejo HTTP
Funciones de acceso al header de un objeto Web
Tipos de datos estructurados
Introducción
En los últimos años tanto Internet como la telefonía celular han tenido un gran crecimiento y
se han hecho accesibles a millones de personas. Es posible ahora unir estas dos tecnologías
accediendo de forma fácil y rápida a la información que brinda Internet desde los teléfonos
celulares (ó móviles).
A partir de esta versión GeneXus permite generar salidas para Internet móvil, generando
objetos con contenido WML.
Alcance
Objetos: WebPanels
Interfaces: Web
Algunas definiciones
WAP (Wireless Aplication Protocol)
Es el protocolo más común de Internet Móvil.
Los dispositivos móviles más comunes son los teléfonos celulares con “microbrowser” pero
también entran en esta categoría, los dispositivos de tipo palm y cualquier dispositivo de
información portátil, que pueda disponer de una conexión inalámbrica.
WML
Lenguaje de “tags” basado en XML. Es interpretado por los celulares WAP compatibles. Es
parecido al HTML, pero tiene menos potencia y soporta algunas cosas que el HTML no y es
bastante más estricto en la sintaxis.
WML vs HTML
Por el tamaño de la pantalla, es imposible traducir o ver de forma satisfactoria una página de
web normal (HTML) en un celular. El tamaño, los tipos de letra, las imágenes y la cantidad de
información que se soporta en el WEB no se puede soportar en un microbrowser y no es
práctico hacerlo.
La navegación, además, es diferente, el usuario no tiene ratón, ni teclado por lo que el ingreso
de datos debe ser limitado y la navegación, mucho más simple.
MicroBrowser
Es un software instalado en el teléfono o dispositivo inalámbrico que interpreta el WML (y el
WMLScript, WTAI, etc.) y despliega la información en la pantalla.
Es posible acceder a emuladores de celulares y sus microbrowser. Algunos de los más
conocidos son UP Browser (Unwired Planet) de Phone.com, RS380 Ericsson, Nokia, etc.
Arquitectura
La arquitectura es similar a Internet. El cliente es el teléfono celular con MicroBrowser y en el
servidor se encuentra la lógica en objetos (ejecutables o ASP) con contenido WML o sea que al
ser interpretados por los browsers generan WML.
Descripción
Para generar Web Panels con contenido WML, se implementó una nueva propiedad (a nivel de
objeto) denominada ‘Tag Language’.
HTML
WML
Con el valor WML es posible generar objetos con contenido WML, estos podrán ser vistos
desde un browser WAP.
Requerimientos
Para testear esta característica directamente en la máquina de desarrollo es necesario tener
instalado el emulador de microbrowser.
http://www.openwave.com/products/developer_products/sdk/
El producto es sin cargo, para acceder al mismo se debe realizar la registración en dicha
página.
Diseño
Se deben definir los Web Panel como hasta el momento y configurar la propiedad ‘Tag
Language = WML’.
En el diseño del objeto se deben tener en cuenta las siguientes limitaciones del lenguaje
generado (WML):
Los objetos WML están limitados en el tipo y cantidad de controles que se soportan
así como en el tamaño de las páginas debido a la cantidad de memoria de los móviles
y el tamaño de la pantalla.
Las pantallas permiten entre 4 a 8 líneas de texto, dependiendo del móvil, por lo que
no se recomienda que las pantallas superen estos tamaños. No es conveniente que
se tenga scroll en una pantalla de teléfono celular.
Solo se soportan los siguientes controles:
o Edit
o Textblocks
o Texto libre
o Tablas simples
o Subfile freestyles simples
No se soportan
o Variables dentro de tablas
o Ninguna anidación de tablas y/o subfile freestyle
o Subfiles comunes
o Campos LongVarchar
o La letra ñ
o Tag <BR>
o Botones
o Cookies
o Encriptación de parámetros
Ejemplo
Se desea desplegar un texto de prueba en un teléfono celular, los pasos a seguir son los
siguientes:
- Ejecutar el UP.Simulator.
El texto completo del error se debe visualizar en el ‘Phone information’ (ventana DOS que se
ejecuta detrás del emulador).
http://www.gxtechnical.com/main/Hdcenter.aspx?2,5,36,408
Errores comunes
Error Síntoma
“Error : Invalid element ‘br’ in contents of Se debe a un tag <BR> en el Source del objeto
card.”
“Error : Uncompiled data from http <head>.” La página no es WML es HTML, se debe
configurar la preference ‘Tag Language=WML’
“Error : Invalid element ‘P’ in content of ‘p’. Se introdujo algun tag <P> anidado, esto no es
excpectde PCDATA | em | b …” válido en WML
Consideraciones
o Existen algunos tags HTML (no válidos en WML) generados por el editor. Por
ejemplo el tag <BR> es generado por la combinación de teclas Shift+Enter en
el editor.
o Subfiles o tablas no deben limitarse por tags <P>. Es posible generar este
código con algunas combinaciones de teclas.
Introducción
WebWrapper es un nuevo tipo de datos de GeneXus que permite encapsular la ejecución de
los objetos Web (el código HTML generado). En particular permite enviar el contenido de un
Web Panel por mail.
Alcance
- Objetos: Transacciones, Work Panel, Web Panel, Procedimientos
Descripción
Para poder enviar el contenido de un Web Panel vía mail desde un objeto GeneXus es
necesario definir una variable de tipo WebWrapper, para luego aplicar los métodos y
propiedades necesarios.
La idea es capturar el contenido de un Web Panel en su código HTML, y enviar este vía mail,
por lo tanto hay que tener en cuenta que el cliente de correo que reciba el mail debe tener la
capacidad de interpretar lenguaje HTML, en caso contrario verá el código del Web Panel.
Propiedades:
La dirección base determina el servidor y directorio virtual al que apuntarán los links y a donde
se irá a buscar el Web Panel en caso de que se presione algún botón. La dirección base es
agregada al código HTML que devuelve el método GetResponse.
Object
Objeto Web a encapsular en la variable de tipo WebWrapper
Metodos:
GetResponse
Consideraciones Generales
Los objetos Web Panel de GeneXus, no son estáticos, por este motivo al enviarlos
vía mail, en realidad se está enviando una imagen estática. Por lo tanto cualquier
evento que se produzca en el Web Panel que realice un post al servidor ( por
ejemplo hacer click en un botón, disparar un procedimiento, etc) producirá que se
abra el web panel en el browser, en la dirección especificada en la propiedad
BaseURL.
Si se utiliza un objeto WebWrapper para mandar un Web Panel mediante mail, y dicho Web
Panel tiene un botón o evento click, el comportamiento al apretar dicho botón (o control con
evento click) en Outlook XP difiere del de Outlook 2000 y Outlook Express.
Otro ejemplo: el evento asociado al botón modifica la base de datos y hace un call a otro
webpanel. En Outlook 2000 y Outlook XP, al apretar el botón se hace la modificación a la base
de datos y se abre un browser donde se muestra el Web Panel llamado. En Outlook XP se hace
la modificación a la base de datos pero no se muestra nada, ni siquiera se abre el browser.
Hay dos formas en las cuales podemos cambiar nuestra programación para asegurarnos de
que el comportamiento sea el mismo en los 3 clientes de mail:
2) Usar un Web Component. Es decir, el Web Panel que se manda por email está compuesto
solamente por un webcomponent. Dicho WebPanel tendría en el evento Refresh algo así:
Event Refresh
else
endif
End Event
El objeto Web que se crea para enviar por mail por medio de la función Create no
puede ser main, si puede ser un WebComponent.
La propiedad BaseUrl debe estar después de la función Create.
Ejemplo
El siguiente ejemplo es un procedimiento que ilustra como enviar por mail,
mediante Outlook, el Web Panel Hnotify para cada registro de la tabla CLIENTE.
Dicha tabla tiene clave primaria CliCod, el cual se pasará como parámetros al
Hnotify. También tiene entre sus atributos secundarios a CliNom, con el nombre
del cliente, y CliMail, con la dirección de correo el electrónico del cliente.
Variables Definidas:
&Wrap del tipo WebWrapper
&MailMsg del tipo MailMessage
&Outlook del tipo OutlookSession
&Wrap.BaseURL = “http://myserver/mysystem/”
For each CliCod
&Wrap.Object = Create(Hnotify, CliCod)
&MailMsg.To.New(CliNom, CliMail)
&MailMsg.HTMLText = &Wrap.GetResponse()
&Oulook.Send(&MailMsg)
EndFor
Introducción
Esta funcionalidad provee a los usuarios GeneXus una forma de poder utilizar el protocolo
HTTP en sus programas. Para ello se crearon los tipos de datos HttpClient, HttpResponse y
HttpRequest.
Alcance
Objetos: HttpClient (Transacciones, Work Panels, Web Transactions, Web Panels, Reportes,
Procedimientos), HttpResponse y HttpRequest (Procedimientos y Reportes con el valor http en
la propiedad call protocol, Web Panels y WebTransactions ).
Descripción
Los tres tipos de datos que se definen para interactuar con http son:
HttpClient
HttpResponse y HttpRequest
Permiten leer los datos del request y grabar el response. Son objetos disponibles solo en
WebProcs.
HttpClient
Este objeto refleja una conexión http. Puede usarse desde cualquier objeto GeneXus.
PROPIEDADES:
Host
Define el nombre del host.
Tipo- String
Port
Define el puerto del host.
Tipo- String
Secure
Indica si el protocolo es http o https.
Tipo- Boolean
Timeout
Determina el Timeout de la conexión.
Tipo- Integer
BaseURL
Indica la URL base de los request que se hagan al host.
Tipo- String
StatusCode
Retorna el código de error HTTP.
Tipo- Integer
ReasonLine
Retorna el texto del error HTTP.
Tipo- String
ErrCode
Retorna si ocurrió algún error en algún comando, en cuyo caso retorna un
valor distinto de cero.
Tipo- Integer
ErrDescription
Retorna el mensaje del error si ocurrió alguno en algún comando.
Tipo- String
Basic y Digest
Son constantes que determinan un tipo de autenticación. Se utilizan en el
método AddAuthentication.
Basic=0 : Para autentificar se envía el usuario y password sin encriptar.
Digest=1: Para autentificar se envía el usuario y password encriptados.
ProxyHost y ProxyPort
Permiten especificar un proxy http. En ambiente windows se utiliza
automáticamente el que esta configurado en la máquina.
ProxyHost- String
ProxyPort- Integer
MÉTODOS
AddHeader(<Name>, <Value>)
Agrega un header con el valor dado.
Ejemplo: AddHeader(“User-Agent”, “GeneXus”)
<Name>- String
<Value>- String
AddVariable(<Name>,<Value>)
Agrega una variable al ‘form’.
<Name>- String
<Value>- String
AddString(<Value>)
Agrega el contenido del string al buffer de datos a enviar.
<Value>- String
AddFile(<Value>)
Agrega el contenido del archivo al buffer de datos a enviar.
<Value>- String
Execute(<Method>,<URL>)
Ejecuta un método en la URL definida. Se pondría solo la parte final de la
URL
Ejemplo: execute("POST", "/servlet/awebproc")
<Method>- String
<URL>- String
ToString()
Retorna un String con todo el ‘cuerpo’ del response.
ToFile(<FileName>)
Graba en un archivo el contenido del stream.
<FileName>- String
GetHeader(<Name>,<Value>)
Retorna en <Value> el valor del header convertido al tipo de la variable.
<Name>- String
<Value>- Anytype
HttpRequest
Este objeto permite leer el request http. Puede instanciarse solo en el contexto de un
WebProc.
PROPIEDADES
Method
Retorna el método HTTP.
Tipo- String
ServerHost
Retorna el nombre del servidor
Tipo- String
ServerPort
Retorna el puerto en el servidor
Tipo- Integer
Secure
Indica si se esta utilizando HTTPS. Si el valor retornado es 1, se esta
utilizando HTTPS; si es 0, se esta utilizando http.
Tipo- Integer
ScriptPath
Retorna la porción de URL correspondiente el nombre del directorio virtual.
Tipo- String
ScriptName
Retorna el nombre del objeto con la extensión correspondiente que se esta
ejecutando, tal como aparece en la URL
Tipo- String
Referrer
Retorna la URL del llamador
Tipo-String
QueryString
Retorna la porción de la URL que está después del signo “?”; o sea los
parámetros.
Tipo- String
RemoteAddress
Devuelve la dirección del cliente.
Tipo- String
ErrCode
Retorna si ocurrió algún error en algún comando, en cuyo caso retorna un
valor distinto de cero.
Tipo- Integer
ErrDescrption
Retorna el menaje del error si ocurrió alguno en algún comando.
Tipo- String
MÉTODOS
GetVariable(<Variable>)
GetHeader(<Header>)
Retorna un String con el valor del header <Header>.
<Header>- String
ToString()
Retorna un String con todo el ‘cuerpo’ del request.
ToFile(<FileName>)
Graba en un archivo el contenido del stream.
<FileName>- String
HttpResponse
Este objeto permite escribir el response http. Puede instanciarse solo en el contexto de un
WebProc.
PROPIEDADES
ErrCode
Retorna si ocurrió algún error en algún comando, en cuyo caso retorna un
valor distinto de cero.
Tipo- Integer
ErrDescrption
Retorna el menaje del error si ocurrió alguno en algún comando.
Tipo- String
METODOS
AddHeader(<Name>,<Value>)
Agrega un header con el valor dado.
Ejemplo: AddHeader(“User-Agent”, “GeneXus”)
<Name>- String
<Value>- String
AddString(<Value>)
Agrega el contenido del string al buffer de datos a enviar.
<Value>- String
AddFile(<Value>)
Agrega el contenido del archivo al buffer de datos a enviar.
<Value>- String
XMLReader.openRequest(HttpRequest)
Se utiliza en un WebProc para leer un xml que viene en el body del http request.
XMLReader.openResponse(HttpClient)
Se utiliza en cualquier objeto para leer como XML lo que devolvió un request.
XMLWriter.openRequest(HttpClient)
Se utiliza en un WebProc para escribir un xml que se retornara en el body del http response.
Ejemplo
Este ejemplo muestra como un objeto GeneXus llama a otro vía http, pasándole parámetros en
un XML y recibiendo los mismos también en un XML.
<parameters>
<a>valor</a>
<b>valor</b>
</parameters>
El XML que se devuelve es igual, con los valores de ‘A’ y ‘B’ modificados.
&client.host = "localhost"
&client.port = 88
&writer.WriteStartElement("parameters")
&writer.WriteElement("a", &A)
&writer.WriteElement("b", &B)
&writer.WriteEndElement()
&writer.close()
&client.execute("POST", "/servlet/awebproc")
&reader.openResponse(&client)
&reader.read()
&reader.read()
&a = val(&reader.value)
&reader.read()
&b = val(&reader.value)
&reader.close()
&reader.openRequest(&Request)
&reader.read()
&reader.read()
&a = val(&reader.value)
&reader.read()
&b = val(&reader.value)
&reader.close()
&a = &a + 1
&b = &b + 1
&writer.openResponse(&Response)
&writer.WriteStartElement("parameters")
&writer.WriteElement("a", &A)
&writer.WriteElement("b", &B)
&writer.WriteEndElement()
&writer.close()
Consideraciones para el generador Java
En el caso de que se ejecute el motor de servlet en Windows, la aplicación obtendrá
automáticamente la configuración del proxy http y la lista de hosts para los que no se debe
utilizar el proxy.
En caso de que se ejecute en otra plataforma, es necesario especificar el proxy como una
‘System Property’ desde la línea de comandos del intérprete, por ej:
(Consideraciones Generales)
La propiedad secure del tipo de datos HTTPClient en el generador C/SQL solo puede Con formato: Numeración y viñetas
ser utilizada en clientes Microsoft.
En los generadores Visual Basic, Visual FoxPro, y C/Sql el tipo de datos HTTPClient Con formato: Numeración y viñetas
permite manipular solamente URLs cuyo Response tenga contenido de tipo texto. No
esta implementado para otros tipos de contenido (por ej. imágenes).
Alcance
Objetos: Web Panels, Transacciones
Interfaz: Web
Introducción
Se introducen controles, con métodos y propiedades para manejar TAG en el header de un
objeto Web. Esto posibilita agregar información descriptiva, que puede utilizarse para ser
referenciado por buscadores, agregar referencias a JavaScript para dar dinamismo a la
aplicación o todo aquello que se pueda definir entre los TAgs <Head></Head> para aprovechar
al máximo las características del HTML.
Descripción
Se denomina Header de un objeto WEB a código HTML definido entre los TAGS <HEAD>
</HEAD>.
Se puede agregar información en el Header, que puede servir, entre otras cosas, para ser
referenciado por buscadores, o simplemente para agregar funcionalidades a la página, como
es el caso de JavaScript.
Para poder trabajar con estos Tag, se implementaron una serie de propiedades y métodos del
Form:
Form.Meta
Esta propiedad permite trabajar con los TAG de la forma <meta name=X content=Y/>.
AddItem
Permite agregar un TAG <meta name=X content=Y/>, a partir de los valores X e Y pasados por
parámetros
Sintaxis:
Form.Meta.AddItem(<name>,<content>)
Donde
RemoveItem
Sintaxis:
Form.Meta.Remove(<name>)
Donde
<name> : Character
Text
Sintaxis:
Form.Meta.Text(<indice>)
Donde:
Value
Sintaxis:
Form.Meta.Value(<indice>)
Donde:
Count
Sintaxis:
Form.Meta.Count
Clear
Sintaxis:
Form.Meta.Clear()
Form.MetaEquiv
Esta propiedad permite trabajar con los TAG de la forma <meta http-equiv=X content=Y/>.
AddItem
Permite agregar un TAG <meta http-equiv=X content=Y/>, a partir de los valores X e Y pasados
por parámetros
Sintaxis:
Form.MetaEquiv.AddItem(<name>,<content>)
Donde
RemoveItem
Sintaxis:
Form.MetaEquiv.Remove(<name>)
Donde
<name> : Character
Text
Sintaxis:
Form.MetaEquiv.Text(<indice>)
Donde:
Value
Sintaxis:
Form.MetaEquiv.Value(<indice>)
Donde:
Count
Sintaxis:
Form.MetaEquiv.Count
Valor de Retorno: Numérico
Clear
Sintaxis:
Form.Meta.Clear()
Form.JScriptSrc
Permite referenciar fuentes con código JavaScript que se deseen incluir en el Header de la
página generada, de la forma <script language="JavaScript" src="Y”>
Add
Sintaxis:
Form.JScriptSrc.Add(<src>)
Donde:
(ej: “ValidarFecha.js”)
Clear
Form.JScriptSrc.Clear()
Item
Sintaxis:
Form.JScriptSrc.Item(<Indice>)
Donde:
Count
Sintaxis:
Form.JScriptSrc.Count
Form.HeaderRawHTML
Esta propiedad del form permite agregar texto libre en el Header (los Tag <head> </head>)
Sintaxis:
Form.HeaderRawHTML = <Texto>
Donde:
<Texto>: Character
Consideraciones
GeneXus agrega por defecto en los objetos web los tags Generator, Version y
Description de tipo Meta Name. Por ejemplo:
Alcance
Objetos: Transactions, Work Panels, Web Panels, Procedures, Reports
Lenguajes: Java, .NET, Visual Basic
Interfaces: Web, Win
Introducción
El objeto GeneXus Structured Data Type (SDT), permite definir estructuras de datos. Estas
representan, de una forma simple, datos cuya estructura está compuesta por varios
elementos. Esto facilita y potencia la programación.
Descripción
Los SDT tienen múltiples usos posibles:
- facilitan el pasaje de parámetros (en particular permite proveer/consumir
información estructurada en el uso de webservices)
- simplifican la lectura y escritura automática de XML (con funciones de alto nivel),
- permite mejorar la legibilidad del código,
- permite el manejo de listas de largo variables de elementos.
Detallamos algunos de los posibles casos de uso.
Estructura
La estructura puede ser multinivel, semejante a la de las transacciones, cada nivel puede tener
uno o más elementos (o ítems). Podemos clasificarlos en elementos simples o elementos
compuestos (por otros elemento).
ELEMENTOS SIMPLES
En el diseño de un SDT, al definir un elemento, se debe especificar la propiedad Name que
identifica al elemento, por lo tanto no pueden existir dos elementos con el mismo nombre. La
propiedad Data type permite seleccionar entre los siguientes tipos de datos :
ELEMENTOS COMPUESTOS
Se identifican con un bullet de color, en el editor, y son aquellos que definen un nuevo
agrupamiento de elementos (una nueva colección o un agrupamiento de elementos simples).
Tiene las mismas propiedades que los elementos simples, pero no se habilita la propiedad
data type. Hay una excepción en el caso de un SDT que sea colección de tipo simple, ver caso
de uso 2.3
Se habilita la propiedad Item Name solo cuando el elemento compuesto define una Collection
(propiedad Collection en True).Esta propiedad indica el nombre de cada uno de sus elementos.
Este nombre, calificado por el nombre del SDT, será seleccionable como tipo de datos para la
definición de variables, esto significa que se crearan dos tipos de datos uno con el “Name”
(nombre del SDT) y otro con Name.ItemName.
Documentación
Permite escribir un texto descriptivo del objeto.
La propiedad External Namespace es un string que representa el name space que aplica al
External name (WSDL). El valor por defecto es el nombre del modelo sustituyendo los
caracteres no válidos.
Operadores
NEW
Este operador retorna una nueva instancia inicializada, o sea una nueva referencia al tipo de
datos que se especifica. La sintáxis es:
New SDTName()
SDTName es el nombre de un SDT o un ítem de una collection (cualquiera que pueda ser el
tipo de datos de una variable). Por ejemplo
A = New Client() o
Métodos
Cualquier SDT tiene los métodos que se describen a continuación.
TOXML
Retorna un string con el formato XML de los datos de la variable SDT.
<Nombre>Uruguay</Nombre>
<Idioma>Español</Idioma>
<Coordenadas>
<Latitud>30</Latitud >
<Longitud>35</Longitud>
</Coordenadas>
<Ciudades>
</Ciudades>
FROMXML
Es el opuesto del ToXML. recibe como parámetro un string que tiene una estructura XML
desde la cual se carga el SDT.
CLONE
Crea una nueva área de memoria y copia los datos de la variable en esta. Sintaxis:
&var1 = &var2.clone()
Siempre debe estra asignado a una variable, la única excepción es dentro del comando Add
&var1.add(var2.clone())
El método Clone equivale a new de una variable y la asignación de cada item de la misma o
sea:
z.a = y.a
z.b = y.b
La ventaja del método clone, frente al new, es que realiza la copia automática de cada item del
estructurado sin necesidad de hacer la asignación.
En el caso de subestructuras dentro del SDT (colecciones o no) no se crea una nueva instancia
de ésta con el método clone (la copia es shallow), es necesario hacer un new o clone explicito
por cada subestructura. En el caso de subestructuras “definidas” dentro del SDT, que no sean
colecciones no esta habilitado el método clone. Por ejemplo, con el SDT
Pais
Nombre Char
Continente
Nombre Char
&Pais.Nombre = 'Uruguay'
&Pais.Continente.Nombre = 'América'
&Paises.Add(&Pais.clone())
&Pais.Nombre = 'Senegal'
&Pais.Continente.Nombre = 'Africa'
&Paises.Add(&Pais.clone())
En ambos países el continente es Africa. Para que cada registro tenga distinto continente se
debe programar con el operador new.
Collections
Existen un conjunto de métodos y propiedades que solo aplican a colecciones de SDT.
Item( Position)
No es válido asignar un valor con esta propiedad, por lo tanto no es correcto el código
&sdt.item(&i) = Att, para cambiar un valor se debe remover (método remove) y
agregar (método add)
Remove( Position)
Clear()
IndexOf( Item)
Tener en cuenta que este método trabaja con las referencias de los elementos y no
con su contenido. Esto implica que si por parámetro se recibe una variable con una
lista de SDT y se carga una variable temporal con el contenido de un item, IndexOf
devolverá 0 (vacío) pues esa referencia no esta dentro de la lista. Puede resultar útil
únicamente al momento de cargar la lista.
Consideraciones
DEFINICIÓN DE VARIABLES
Para cada SDT se define un tipo de datos y otro por cada uno de los Items de sus collections.
Por ejemplo Si se define una colección de Ciudades, se define un tipo de datos Ciudades y otro
Ciudades.Ciudad
Las variables cuyo tipo sea una SDT no pueden ser vectores o matrices.
PASAJE DE PARÁMETROS
No es posible referenciar variables de tipo SDT en:
Si bien no se controla, no es posible definir en la rule parm un item de una SDT, por ejemplo:
Parm(&sdt.item)
DISPARO DE RULES
Se deben instanciar los elementos de una variable SDT, para poder disparar rules que
dependen de dicha variable. Para esto se debe cumplir al menos una de las siguientes
condiciones:
ASIGNACIÓN
La asignación de una variable de tipo Structure a otra del mismo tipo implica un incremento en
la cantidad de referencias a la estructura. Hecha la asignación, una modificación a cualquier
elemento de la estructura se verá reflejado en todas las variables que "apunten" a la
estructura.
&Pais.PaisNom = ‘Uruguay’
&PaisAux = &Pais
&PaisAux.PaisNom = ‘Brasil’
&PaisNom = &Pais.PaisNom
La variable PaisNom tiene el valor ‘Brasil’, pues la dirección de la variable Pais y PaisAux es la
misma luego de la asignación
FORM
No es posible incluir un SDT en el form o printblock de un objeto, en ese caso ocurrirá un error
de spec “spc0071: '%1 cannot be displayed or printed due to its data type (%2)”
RECORRIDA
Para recorrer una colección de elementos, es posible hacerlo con el comando for in array
&paisCod = &pais.Codigo
&PaisNom = &pais.Nombre
Load
Endfor
O con el comando do while:
&Pais =&Paises.Item(&I)
...
&I=&I+1
Enddo
INTEGRIDAD
No es posible eliminar un SDT que esta siendo utilizado por otro objeto.
Si es posible modificar la estructura de un SDT y por ejemplo eliminar un elemento del mismo,
aunque este siendo referenciado por otro objeto.
ESPECIFICACIÓN Y GENERACIÓN
No es posible especificarse/generarse directamente un SDT. La especificación/generación es
implícita cuando se especifica un objeto que lo utiliza si el SDT cambió desde la última vez que
fue especificado o se realiza una generación forzada.
Las variables definidas como estructuras son ignorada si la especificación es para lenguajes que
no las soportan (RPG, Cobol, etc.). Esto evitará errores de generación si las variables no son
utilizadas (esta parte corre por cuenta del desarrollador).
KNOWLEDGE MANAGER
Si es posible exportar/consolidar un objeto SDT, al exportar un objeto que usa un SDT, se
exportan automáticamente los SDT llamados.
Si se exporta un objeto que contiene variables que son estructuras a un modelo que no
contiene la definición de dichas estructuras aparecerá, al especificar, el mensaje: spc0056,
Internal error. Variable %1 definition is incorrect or not available. Data:%2.
WEBSERVICES
Los Web Services normalmente retornan valores en estructuras de datos. Por ejemplo,
retornan un "Cliente" que es una estructura que tiene "Codigo" y "Nombre" que a su vez es
otra estructura que tiene "PrimerNombre", "SegundoNombre", etc.
Ahora es posible acceder a estos datos con variables de tipo "Cliente" y modificar/acceder a
sus "miembros"
Al consumir un servicio, con el WSDL Inspector, en el caso de recibir datos complejos, este
incluirá por lo tanto nuevas definiciones de SDT
RECURSIVIDAD
No son soportadas las definiciones recursivas. El Data type de una elemento de una estructura
no puede ser el mismo que se esta definiendo.
INTRODUCCION AL CAPITULO 10
Cada vez se escucha mas el concepto de ‘Web Services’, fundamentalmente
relacionado con Internet y el futuro de una arquitectura orientada a servicios. Es
por esta razón, que GENEXUS incluye la posibilidad de desarrollar y consumir Web
Services.
Abstract
En los últimos tiempos ha surgido con mucha fuerza el concepto de ‘web services’, incluso
afirmándose que el mismo cambiaría la forma de programar las aplicaciones orientadas a
Internet hacia una arquitectura orientada a servicios. Todo esto se ha visto potenciado luego
del anuncio de Microsoft de su nueva estrategia .NET que está basada en el modelo de web
services.
Este documento describe que son los web services y como es la arquitectura general del
modelo, adicionalmente se provee una introducción de los estándares en los cuales se basa
este modelo como ser SOAP, WSDL y UDDI.
Al igual que los componentes, los web services son funcionalidades que se encuentran dentro
de una caja negra, que pueden ser reutilizados sin preocuparse de cómo fueron
implementados. A diferencia de la actual tecnología de componentes, no son accedidos por
medio de protocolos específicos del modelo de objetos como ser RMI, DCOM o IIOP; sino que
son accedidos utilizando protocolos web como ser HTTP y XML.
La interface de los web services esta definida en términos de los mensajes que el mismo
acepta y retorna, por lo cual los consumidores de los web services pueden ser implementados
en cualquier plataforma y en cualquier lenguaje de programación, solo tiene que poder crear y
consumir los mensajes definidos por la interface de los web services.
Proveedor
Publicar Enlazar
Corredor Consumidor
Encontrar
Por todo lo anterior hay ciertos requerimientos a la hora de desarrollar o consumir un web
services:
Ventajas y retos.
Los web services apuntan a ser la piedra fundamental de la nueva generación de sistemas
distribuidos. Estos son algunos puntos para fundamentar esta afirmación:
Interoperabilidad:
Cualquier web service puede interactuar con otro web service. Como los
web services pueden ser implementados en cualquier lenguaje, los
desarrolladores no necesitan cambiar sus ambientes de desarrollo para
producir o consumir web services.
Ubicuidad:
Los web services se comunican utilizando HTTP y XML. Por lo tanto cualquier
dispositivo que soporte estas tecnologías pueden implementar o acceder web services.
Muy pronto estarán presentes en teléfonos, autos e incluso máquinas expendedoras,
las que avisarán a la central cuando el stock sea menor al indicado.
A la vez hay ciertos retos técnicos que los web services tienen que sortear para
poder tener éxito. Muchos de estos retos están relacionados con el ambiente
abierto en el que tienen que sobrevivir. Estos son algunos de esos puntos:
Descubrimiento:
¿Como un web service se anuncia para ser descubierto por otro servicio?
¿Qué pasa si el servicio se cambio o se movió luego de ser anunciado?
WSDL y UDDI son dos nuevos estándares que manejan este punto.
Confiabilidad:
Algunos web services son más confiables que otros. ¿Cómo puede ser
medida esa confiabilidad y comunicada? ¿Qué pasa cuando un web service
esta off-line en forma temporaria? ¿Localizamos y utilizamos un servicio
alternativo brindado por otra empresa o esperamos a que el servicio este
de nuevo on-line?
Seguridad:
Muchos web services son publicados para ser utilizados sin ninguna
restricción, pero muchos otros van a necesitar autenticación para que los
utilicen solo los usuarios autorizados. ¿Cómo autentifica a los usuarios un
web service? ¿Lo hace a nivel del método que lo implementa o utiliza otro
web service para realizar la autenticación?
Responsabilidad
En caso de que el web service no sea de acceso libre, ¿Cómo puedo definir
cuantas veces un consumidor puede acceder al web service una vez
contratado? ¿Cómo se cobra su uso? ¿Cómo se indica que un servicio ya no
esta más en línea?
Tecnologías asociadas
El modelo de web services está basado en ciertas tecnologías emergente que es el resultado
del trabajo de varias compañías y organizaciones entre las cuales se destacan IBM y Microsoft.
Esta basado en XML y potencialmente puede ser utilizado en combinación con una variedad de
protocolos de comunicación, siendo el más utilizado HTTP. Por lo tanto se utiliza HTTP para
transportar la información, y XML para representar la misma.
Request
Cliente Servidor
Response
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>DIS</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Body>
<m:GetLastTradePriceResponse xmlns:m="Some-URI">
<Price>34.5</Price>
</m:GetLastTradePriceResponse>
</SOAP-ENV:Body>
Si usted quedo asustado por la aparente complejidad del protocolo SOAP pensando lo
engorroso que sería armar los mensajes de requerimiento y parsear los mensajes de respuesta
despreocúpese; la mayoría de los lenguajes de programación proveen o proveerán soporte
para realizar esto. La idea fundamental consiste en utilizar algún objeto al cual se le brinda un
WSDL y se le indica que método se quiere llamar y con que parámetros. Esto arma en tiempo
de ejecución el mensaje SOAP, lo manda y parsea el resultado adjudicándoselo a alguna
variable en forma trasparente para el usuario como si hubiera hecho un call común.
Un archivo con formato WSDL provee información de los distintos métodos (operaciones) que
el Web Services brinda, muestra cómo accederlos y que formatos deben de tener los mensajes
que se envían y se reciben. Es como un contrato entre el proveedor del servicio y el cliente, en
el cual el proveedor se compromete a brindar ciertos servicios solo si el cliente envía un
requerimiento con determinado formato. Es el documento principal a lo hora de documentar
un Web Services, pero puede no ser el único. En la mayoría de los casos es conveniente que
este acompañado por un documento escrito en lenguaje natural que brinde información de
que es lo que hace cada uno de los métodos brindados por el Web Services así como también
ejemplos, por ejemplo, de los mensajes SOAP que espera y responde el servicio.
Type: Describe los tipos no estándar usados por los mensajes (Message).
Message: Define los datos que contienen los mensajes pasados de un punto a otro.
PortType: Define una colección de operaciones brindadas por el servicio. Cada operación tiene
un mensaje de entrada y uno de salida que se corresponde con algún Message antes definido.
Binding: Describe los protocolos que se utilizan para llevar a cabo la comunicación en un
determinado PortType; actualmente los protocolos soportados son SOAP, HTTP GET, HTTP
POST y MIME, siendo SOAP el más utilizado.
<definitions name="FooSample"
targetNamespace=http://tempuri.org/wsdl/
xmlns:wsdlns=http://tempuri.org/wsdl/
xmlns:typens=http://tempuri.org/xsd
xmlns:xsd=http://www.w3.org/2001/XMLSchema
xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/
xmlns:stk=http://schemas.microsoft.com/soaptoolkit/wsdl-extension
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="Simple.foo">
</message>
<message name="Simple.fooResponse">
</message>
<portType name="SimplePortType">
INTERFASE E IMPLEMENTACIÓN
La estructura básica de archivo con formato WSDL podría ser dividido en dos partes lógicas: la
interfase del servicio, y la implementación del mismo.
Port, Service.
A partir de esta división lógica se puede definir por medio de una Interfase del servicio una
estándar para realizar, por ejemplo, ordenes de compras que puede ser reutilizada e
implementada por todas las empresas, sin tener que redefinir cada una de ellas la interfase.
Si al igual que con SOAP se siente preocupado por la complejidad de los archivos WSDL de
nuevo despreocúpese; la mayoría de los lenguajes de programación proveen o proveerán
herramientas para generar en forma automática el archivo WSDL a partir de un determinado
método o función.
EL ESQUEMA UDDI
El modelo de información base utilizado por los registros UDDI es definido en un esquema
XML. Este esquema define cuatro tipos básicos de información, cada uno de los cuales proveen
la clase de información que un usuario necesita saber para utilizar un web service de otra
empresa.
businessEntity
tModel
businnessEntity
bindingTemplate
http://www.uddi.org/pubs/ProgrammersAPI_v2.pdf
API UDDI
El acceso al registro UDDI, ya sea para realizar búsquedas o para ingresar o
modificar un registro, se puede realizar a través de una página web que
implemente el acceso o utilizando ciertas interfaces (web services) que provee la
especificación de UDDI. Estas interfaces están descriptas en una API, que puede
ser dividida en dos partes lógicas, la API de consultas y la API de publicación.
Por más información sobre la API UDDI: http://www.uddi.org/pubs/ProgrammersAPI_v2.pdf
Un ejemplo
Las formas en que se puede realizar negocios utilizando web services es muy variada. El
consumidor podría pagar por utilizar los servicios brindados por un proveedor, o el proveedor
podría pagar para que aparezcan los servicios que él ofrece en un determinado consumidor, o
incluso existen casos en los cuales ni el consumidor ni el proveedor pagan por consumir o
proveer los servicios en forma respectiva. Este es el caso que se presenta a continuación.
Claramente se muestra en este ejemplo el gran poder de los web services, y la ventaja que
tendrán las empresas que los sepan utilizar en forma adecuada con respecto a las otras.
Imagínese en este caso si usted fuera a reservar boletos de avión y pudiera elegir por una
compañía que además de reservar los boletos le permitiera hacer la reserva de hotel, y otra
que no; ¿por cual haría la reserva? Por otro lado imagine que usted es dueño de una rentadora
de autos y sabe que su competencia esta brindando sus servicios en un portal de una
compañía aérea y usted no, ¿qué haría?.
XML
Introducción
Hoy en día, se pueden encontrar muchísimos sitios web que brindan servicios on-line como
por ejemplo reservas de asientos para espectáculos, aviones, reportes meteorológicos, etc.;
para poder brindar estos servicios a los usuarios, los diseñadores y los programadores web
deben combinar los datos y la presentación en un documento HTML. Muchas veces el
proveedor de determinada información no es quien la va a “procesar” (sea esto publicarla en
un sitio, ingresarla en una aplicación, etc).
El lenguaje XML está compuesto por etiquetas que describen el contenido del documento. Un
elemento XML queda definido por una etiqueta de comienzo y otra de fin con el valor del
elemento entre ambas etiquetas. Los elementos pueden estar anidados y además pueden
contener en forma opcional, uno o más atributos. Los atributos son usados para adjuntar
información secundaria a los elementos.
<weather-report>
<time>08:00</time>
<area>
<city>Montevideo</city>
<country>Uruguay</country>
</area>
<measurements>
<wind>
<direction>SW</direction> <windspeed>6</windspeed>
</wind>
<humidity>87</humidity>
<visibility>10</visibility>
</measurements>
</weather-report>
El ejemplo anterior está compuesto únicamente por elementos XML, pero el mismo podría
redefinirse, de forma que la información correspondiente al área estuviese representada por
atributos, como se representa a continuación:
<time>08:00</time>
<measurements>
<wind>
<direction>SW</direction> <windspeed>6</windspeed>
</wind>
<humidity>87</humidity>
<visibility>10</visibility>
</measurements>
</weather-report>
Si bien el hecho de estar compuesto por etiquetas hace que sea parecido a HTML, hay una
diferencia muy importante: en un documento XML no hay información acerca de cómo deben
ser presentados los datos.
Así, como HTML provee etiquetas específicas para formatear un documento, XML provee un
marco para crear etiquetas.
Resumiendo, XML es un lenguaje estándar definido por el Consorcio World Wide Web para
permitir grabar y leer datos en forma estructurada con formato estándar independiente de
aplicaciones y vendedores.
Introducción
SOAP es un protocolo “liviano” basado en XML, para invocar procedimientos en forma remota
(Remote Procedure Call). Utiliza cualquier protocolo que permita transportar mensajes de
texto, siendo HTTP el más utilizado.
Su especificación describe el contenido que debe tener un mensaje XML para ser usado en una
invocación remota.
Cualquier aplicación que cumpla la especificación puede invocar y proveer servicios sin
importar en que lenguaje o plataforma esté implementado, lo único necesario es que la
aplicación sea capaz de interpretar el mensaje SOAP que recibe, realizar el procesamiento que
el mensaje requiera, y devolver otro mensaje SOAP con la respuesta.
En las aplicaciones generadas por GeneXus se utiliza SOAP para invocar a objetos
en forma remota, usando HTTP como protocolo de transporte.
Alcance
Objetos llamadores (Clientes)
Objetos: Todos los objetos
Interfaces: Win/Web
Los objetos llamadores son los que invocan servicios mediante SOAP
Interfaces: Web
Los objetos llamados son los brindan un servicio invocado mediante SOAP
Descripción
Algunas de las ventajas de utilizar este protocolo en aplicaciones GeneXus son la posibilidad de
desarrollar servicios web, asi como el poder hacer invocaciones entre objetos de diferentes
generadores (por ej. llamar desde Visual Basic a Java, o desde C/Sql a Visual Basic),
funcionalidad que no estaba permitida en versiones anteriores, excepto llamadas RPC desde
los generadores visuales a los generadores CSql/Cobol/RPG.
Servidor
Para indicar en GeneXus que un objeto main va a ser llamado utilizando el protocolo SOAP, se
deberá seleccionar el valor “SOAP” en la propiedad “Options/Call Protocol”. Nos referiremos
en adelante a dichos objetos como ‘Servidores’ o ‘Servicios web’. Solo pueden ser reportes o
procedimientos, sin ningún tipo de interfaz con el usuario.
Se requiere un servidor Web que haga el hosting de los servicios a ser invocados.
Los programas Servidores reciben la invocación http, procesan el mensaje SOAP que envía el
Cliente con sus parámetros, realizan la acción requerida, y generan otro mensaje SOAP de
respuesta (eventualmente con los parámetros modificados).
Cliente
Los objetos que van a invocar al servicio web, a los que llamaremos
‘Clientes’, pueden ser cualquier objeto GeneXus. La invocación se hace con
el comando call() de GeneXus.
Locations
Para indicar cual va a ser la ubicación de los servicios invocados se utiliza un esquema conocido
como Locations.
Manejo de errores
Comportamiento frente a un error
Esta propiedad se habilita solamente cuando la propiedad ‘Call Protocol’ tiene el valor ‘SOAP’.
El valor por defecto es ‘Yes’. De tener valor ‘No’, la ejecución no se cancelará y se podrá
obtener el código numérico de error con la función GetSOAPErr(), y el mensaje de error
mediante la función GetSOAPErrMsg().
Mayor que 0 y menor que 10000: Algún parámetro retornado por el servidor no
tiene el nombre esperado. El código de error indica la posición del parámetro que
ocasionó el conflicto.
-20004: El servidor retornó que hay un error en el pedido SOAP realizado por el
cliente. En este caso getSOAPErrMsg() retornará un mensaje conteniendo el código y
el mensaje de error retornados por el servidor. Si el servidor es un procedimiento o
reporte GeneXus, retornará alguno de los códigos de error descriptos más abajo.
Un procedimiento o reporte GeneXus que es llamado mediante SOAP puede retornar alguno
de los siguientes códigos de error:
-20000: No se recibió un mensaje SOAP.
Por la naturaleza del protocolo SOAP los programas generados con GeneXus
pueden ser invocados por cualquier cliente SOAP, sea o no generado por
GeneXus.
http://localhost:80/c/sqlsolis/prg/nombredeprograma?wsdl
C/SQL
(*) (*) (*) (*)
Java
Visual Basic
Visual Fox
X X X X
(*) – El generador C/Sql adoptó desde la versión 7.5 el SOAP como protocolo por defecto para
las llamadas RPC, por lo que una llamada RPC a un programa C/Sql siempre se va a hacer vía
SOAP, no importando el generador con el que se genere el objeto llamador (con el valor
‘Internal’ para la propiedad Call Protocol; en este caso no esta disponible la propiedad ‘Cancel
Caller Execution on Error’, y cancelará el programa llamador en el caso de que se produzca un
error en el programa llamado). Es posible a partir de esta característica hacer llamadas RPC
desde programas C/Sql hacia programas generados por cualquier generador que genere
servicios SOAP. Por ejemplo es posible llamar desde un objeto main C/Sql a otro objeto main
C/Sql, característica no disponible hasta la versión 7.5 de GeneXus.
NOTA: Se esta generando dentro del archivo WSDL de los servidores SOAP un
elemento <documentation> que incluye el Help del objeto. Esto permite incluir en
el WSDL información acerca del uso del Servicio, parámetros que recibe, para que
sirve, etc. El elemento tiene los siguientes subelementos:
<documentation>
<URL>Character</URL>
<line>Character</line>
<line>Character</line>
</documentation>
En el elemento URL se indica la URL al Help HTML del objeto que se genera.
En los elementos line se genera el Help del objeto. Solo la parte de texto es
generada, ignorándose el resto. Se generan líneas con un máximo de 80
caracteres, en caso de que la línea de Help sea mas larga, se generan tantos
elementos line como sean necesarios.
Consumidores a Web Services externos
Usando GeneXus 8.0 o posterior se utiliza el WSDL Inspector, que permite
importar la definición del servicio que se desea consumir.
Igualmente en la versión 7.5 es posible invocar a un servicio web externo utilizando los tipos
de datos HttpClient, XmlWriter y XmlReader.
A continuación se detallarán los mecanismos para proveer y consumir web services con
GeneXus.
Proveer
Para proveer web services con GeneXus se debe definir un objeto procedimiento o reporte,
que debe ser de tipo main, y asociado a un generador Web.
Se debe publicar el objeto en un web server, con lo que el web service queda operativo para
ser invocado.
El WSDL del servicio queda disponible agregando el parámetro wsdl a la URL del mismo. Por
ej.:
http://server/baseurl/aservice.aspx?wsdl
Consumir
Usando GeneXus 8.0 o posterior:
Se utiliza el WSDL Inspector, que permite importar la definición del servicio que se desea
consumir. Se debe indicar el WSDL del mismo, y el utilitario definirá los tipos de datos
necesarios para poder consumirlo desde GeneXus.
En el caso de que el web service utilice tipos de datos estructurados, los mismos serán
agregados a la base de conocimiento al importar la definición con el WSDL Inspector.
Además, es necesario configurar la propiedad de objeto Location. Esto servirá luego para
configurar, en los objetos GeneXus que vayan a invocar al web service, la ubicación del mismo
(host, port, etc).
En esta sección crearemos un Web Service GeneXus, y veremos como consumirlo desde una
aplicación GeneXus.
Supongamos que quisiéramos publicar un servicio de nuestro sitio web, por ejemplo un
ranking con las 10 películas más vendidas.
Nombre: Moviesdt
Structure Type
MovieId Identifier
MovieTitle Character(60)
Definiremos una variable que nos permita contar la cantidad de películas: &Qty, más
una variable que permita almacenar toda la colección de películas más vendidas
(Movie) junto con una variable que cargue cada uno de los items de esa colección de
películas (MovieItem).
Name Type
Qty N(2)
Movie S(Moviesdt)
MovieItem S(Moviesdt.MoviesdtItem)
&Qty = 1
&MovieItem.MovieId = MovieId
&MovieItem.MovieTitle = MovieTitle
&Movie.Add(&MovieItem)
&Qty +=1
if &Qty > 10
exit
endif
endfor
Rules:
parm(out:&Movie);
Observe que es necesario que el procedimiento sea main, y configurar la propiedad “Call
protocol” con el valor “SOAP”.
http://localhost/services/aranking.aspx?wsdl
Observe que el método del Web Service es “Execute” y el tipo de datos que
devuelve es “Moviesdt”.
Name Type
MovieId N(3)
MovieTitle Character(60)
Movie S(Moviesdt)
MovieItem S(Moviesdt_MoviesdtItem)
Rank O(org_tempuriaction_.Ranking)
Observe que los tipos de datos Moviesdt (colección de películas),
Moviesdt_MoviesdtItem (cada item de la colección) y
org_tempuriaction_.Ranking (Web Service) se crearon automáticamente al
inspeccionar el servicio con el WSDL Inspector.
El form del web panel “ViewRanking” contendrá un grid con las variables &MovieId y
&MovieTitle.
Programaremos los eventos “Refresh” y “Load” del web panel, como se muestra a
continuación:
Event Refresh
//variable &Movie
EndEvent // Refresh
Event Grid1.Load
&MovieId = &MovieItem.MovieId
&MovieTitle = &MovieItem.MovieTitle
load
endfor
EndEvent // Grid1.Load
Lo que queremos ver en esta sección es como incluir un web service externo no
GeneXus en nuestra aplicación (Ya hemos visto en este capítulo un ejemplo de
como crear y consumir un web service hecho con GeneXus).
Lo que haremos es importar un web service que provée Google. Google es una
compañía especializada en la búsqueda de información en la web. En su página web
(http://www.google.com) se puede ingresar una lista de palabras por las cuales buscar
y retorna todos los sitios web en las cuales encontró esas palabras. Esta misma
funcionalidad Google la provee por medio de un web service.
El WSDL Inspector permite a partir del WSDL de un web service definir los tipos de
datos necesarios en GeneXus para poder consumir el web service en forma
transparente, sin tener que preocuparse de los protocolos involucrados en el
proceso y la definición del mismo.
¿Que es wsdl?
WSDL es un lenguaje basado en XML que se utiliza para describir un web service.
Un archivo con formato WSDL provee información de los distintos métodos
(operaciones) que el web service brinda y sus parámetros, muestra cómo
accederlos y que formatos deben de tener los mensajes que se envían y se reciben.
Tipo
NOMBRE
Ws GoogleSearch.GoogleSearchService
Return GoogleSearchResult
ResultElements ResultElementArray
ResultElement ResultElement
Event search.click
&Key = "3yHXpPZQFHKdexiyPjqTPYNqVvnYj8cZ"
&MaxResult = 10
&Filter = 1
&SafeSearch = 1
&Return=
&Ws.doGoogleSearch(&Key,trim(&Query),&Start,&MaxResult,&Filter,
&Restrict,&Safesearch,&Lr,&Ie,&Oe)
&ResultElements = &Return.resultElements
&searchTime = &return.searchTime
EndEvent
Event Grid1.Load
Title.Caption = &ResultElement.title
&url = &resultElement.URL
Title.LinkTarget = "_BLANK"
Title.Link = link(&ResultElement.URL)
&Summary = &ResultElement.snippet
&cachedsize = &resultelement.cachedSize
grid1.Load()
Endfor
EndEvent
En este evento se recorre la Collection con los resultados devueltos por el web
service y se realiza la carga del grid.
Nota:
http://www.google.com/apis/reference.html
INTRODUCCIÓN AL CAPÍTULO 11
Cada vez mas, el uso masivo de Internet propicia el desarrollo de aplicaciones de mayor
versatilidad y complejidad para ambiente Web. Es por esto que está surgiendo la necesidad de
aplicar una reingeniería a las aplicaciones existentes y también, en muchos casos, la necesidad
de desarrollar nuevas aplicaciones para Internet.
Existen varias diferencias entre los ambientes GUI (aplicaciones con Interfaz de Usuario
Grafica) y WEB, las que deberán evaluarse al momento de determinar la conveniencia del tipo
de aplicación a desarrollar.
En este capítulo veremos los principales aspectos a ser tenidos en cuenta para los usuarios
GeneXus.
Objetivo.
El objetivo de este artículo es brindar una herramienta de referencia, para asistir en la decisión
de migrar o desarrollar una aplicación con interfaz de usuario grafica (GUI), o una aplicación
web.
Para analizar las diferencias entre los dos tipos de aplicaciones se compararán las ventajas y
desventajas de las aplicaciones web frente a las aplicaciones GUI.
Existe otro articulo (Conversión de Aplicaciones GUI a WEB) sobre esta misma temática
en donde se dan los detalles técnicos de cómo realizar esta tarea, por lo que aquí no se
mencionarán esos detalles.
Introducción.
Las aplicaciones con Interfaz de Usuario Grafica (GUI) están compuestas por uno o varios
programas GeneXus que utilizan objetos de tipo, transacción, work panel, procedimientos y
reportes.
Aplicaciones Web.
Se entenderá por aplicaciones Full Web a aquellas aplicaciones en las que la interfaz del
usuario es únicamente realizada utilizando el lenguaje HTML y son accedidas desde un
browser. En GeneXus estas aplicaciones se implementan con objetos web como web panels o
Transacciones Web.
Una aplicación Web tiene diversas ventajas frente a las aplicaciones GUI.
INSTALACIÓN.
Las aplicaciones Web presentan varias ventajas tanto en la instalación y actualización como en
los requerimientos necesarios para utilizarlas.
Cliente ‘fino’. Para utilizar la aplicación Web solo se necesita un browser. Los browsers son
distribuidos por Internet y no tienen costo. Generalmente vienen incluidos al instalar el
sistema operativo. Adicionalmente se pueden instalar plugs-in, que son programas que
agregan funcionalidades adicionales al browser. Un ejemplo muy común es el plug-in de
Acrobat, utilizado para visualizar archivos en formato PDF o plugs-in para video o sonido.
En el caso de una aplicación web no se requiere ninguna instalación adicional a la del browser,
para poder accederla o acceder a otras aplicaciones web.
ESCALABILIDAD.
Las aplicaciones Web utilizan una arquitectura de tres capas compuesta por la capa cliente,
donde está únicamente el browser, la capa del Servidor Web donde esta la aplicación y la capa
de datos donde se encuentra la Base de Datos.
Capa
Capa Cliente
Servidor Web
Aplicación
Web
Capa
Browser
de Datos
BD
Arquitectura en tres capas.
Una ventaja de la arquitectura en tres capas es que no es necesario pagar nuevas licencias por
cada nuevo usuario que accede a la aplicación (por ejemplo los drivers de acceso a la base de
datos se pagan por cantidad de usuarios concurrentes).
INDEPENDENCIA.
Acceso. La aplicación puede ser accedida desde cualquier lugar que cuente con acceso a
Internet. Esto puede tener un fuerte impacto en el modo de trabajo ya que se pueden acceder
a las aplicaciones desde la oficina, el hogar o incluso desde otros países.
Hosting Services Provider (HSP). La aplicación puede ser instalada en un centro de computo
propio o puede contratarse un Hosting Service Provider (son empresas que proveen un centro
de computo para aplicaciones Web) e instalarla en los servidores del HSP. Para los usuarios, el
acceso a la aplicación es independiente de donde este instalada.
INTERFAZ GRÁFICA.
Uniformidad. La forma de navegar por la aplicación web será siguiendo links o presionando
botones y si bien hay mas opciones, estas son las más comunes y se mantendrán por toda la
aplicación. Si bien este modo de interacción es limitado con respecto a las aplicaciones GUI, al
ser tan simple y uniforme en toda la aplicación, al usuario final le resultará sencillo e intuitivo
aprender a utilizar nuevas funcionalidades.
El diseño gráfico es realizado por expertos. Un aspecto sumamente importante en la interfaz
grafica de una aplicación Web es el diseño grafico. Este aspecto sumamente delicado se deja a
cargo de diseñadores gráficos especializados, que hacen que las aplicaciones tengan aspectos
atractivos y funcionales.
Para esto se cuenta a partir de la versión 8.0 de GeneXus, con el Editor de Temas, herramienta
que puede ser usada tanto desde GeneXus como en forma independiente, por lo cual
flexibiliza notablemente la interacción con el diseñador gráfico, además de todas las ventajas
adicionales que trae el uso de Temas en el diseño de la aplicación WEB. Por detalles sobre
Temas ver el documento “Themes”
Impacto del diseño de las páginas Web finales. Si se utilizan demasiadas imágenes,
con muchos botones, el tamaño final de la página, puede ser excesivamente grande,
por lo que se demorará mucho el acceso. La recomendación es cuidar de que las
imágenes sean de pocos Kbytes. Los links de texto son muy livianos, en el caso de
una aplicación muy accedida, puede ser conveniente utilizarlos. Los sitios web de
Amazon y Yahoo, son buenos ejemplos de interfaces livianas, con pocas imágenes y
muchos links de texto.
El diseño debe ser consistente. Por ejemplo la tipografía, los colores, la ubicación de
botones, etc. debe seguir una pauta bien definida, que los desarrolladores deben
respetar al máximo.
El diseño debe ser simple y sencillo. El exceso de detalles gráficos, puede complicar el
desarrollo y evolución del sitio.
El diseño debe ser robusto de modo de poder soportar evoluciones, y nuevos
requerimientos.
Componentización. Es muy importante que la estructura de las páginas pueda ser
separado en componentes, de modo de poder reutilizar los mismos objetos para
simplificarle al usuario el conocimiento del sitio. En GeneXus esto, se implementa
utilizando Web Components.
Interfaz multimedia. Es muy sencillo incluir en las aplicaciones web características multimedia
como audio, video, imágenes, etc.
Tener aplicaciones web habilita a la empresa a funcionar como ASP, brindando como servicio
el uso de las aplicaciones web desarrolladas.
También habilita a contratar a otros ASP para potenciar las aplicaciones propias.
Para controlar distintos aspectos de la interacción con páginas web se utiliza el lenguaje
JavaScript. El código escrito en este lenguaje es incorporado en el HTML e interpretado por el
browser.
Java es un lenguaje de programación muy potente, entre sus propiedades, se destaca la de ser
multiplataforma. Esto quiere decir que las aplicaciones desarrolladas en Java pueden
ejecutarse en cualquier sistema operativo y cualquier plataforma de hardware. Esta propiedad
lo hace especialmente atractivo para aplicaciones que ejecutan a través de Internet. Por lo
tanto se pueden incorporar aplicaciones GUI desarrolladas en Java, para potenciar la aplicación
web.
MÚLTIPLES FORMAS DE ACCESO.
Múltiples tecnologías como computadores de bolsillo y teléfonos celulares están teniendo un
fuerte desarrollo, principalmente como formas alternativas de acceso a Internet. Las
características de hardware de estos dispositivos hacen que las aplicaciones web sean las mas
adecuadas. La principal diferencia con las aplicaciones web para estos dispositivos es el
tamaño reducido de la pantalla. Si bien es necesario crear una versión particular para el
dispositivo, se puede reutilizar mucho conocimiento de una aplicación web ya desarrollada.
Browser
Funcionamiento de las Transacciones Web y Web Panels.
El tiempo de vida de las UTL (unidades de trabajo lógicas) en los objetos web, se mantiene
únicamente durante la ejecución del objeto. Cuando la ejecución termina se deben hacer
commit o roll back. Por lo tanto no es posible definir una UTL a través de varias Transacciones
Web. Sin embargo, es posible mantener la UTL a través de varios procedimientos que se
invoquen unos a otros, siempre que se mantengan dentro de la misma ejecución. En las
aplicaciones GUI es común encontrar que durante varias transacciones se van ingresando
datos y luego en la última transacción se hace el commit de todos los datos ingresados, por lo
que se deben contemplar estos casos en la reingeniería de la aplicación. Las alternativas
posibles a esta situación son:
Diferencias en los Work Panel “Trabajar con”. En las aplicaciones Web, los work panels de
tipo “Trabajar con” presentan algunas diferencias que en las aplicaciones GUI.
La selección de líneas es diferente. En las aplicaciones GUI, las líneas se seleccionan al hacer
clic en ellas, además se puede seleccionar un rango de líneas, continuo o con líneas salteadas,
todo esto sin necesidad de programación extra. En las aplicaciones Web, la selección múltiple
de líneas debe programarse mediante campos de chequeo.
Una posibilidad es permitir la selección de múltiples líneas y utilizar el carrito de compras (se
describe más adelante).
Se puede usar la propiedad “AllowSelection” de los grids para que sea posible seleccionar de a
una línea.
El modelo del carrito de compras. El carrito de compras, es muy utilizado en los sitios web con
e-commerce y permite ‘recordar’ los objetos que compra los usuarios. En el carrito de compras
se van seleccionando distintos items que se desean comprar. El carrito mantiene almacenado
el contenido hasta que el dueño decide comprar alguno o todos los items. Esta idea resulta
practica en casos como estos:
Si se quiere realizar alguna acción a una serie de líneas en un ‘Trabajar con’, se pueden
ingresar en el carrito y luego automáticamente se van presentando una a una las paginas
adecuadas para la acción determinada, hasta vaciar el carrito.
Ejecución en el servidor. A diferencia de las aplicaciones GUI cliente / servidor, donde pueden
ejecutarse acciones tanto en el cliente como en el servidor, en las aplicaciones web, solo se
pueden ejecutar acciones en el servidor. Podría decirse que el cliente prácticamente no tiene
capacidad de computo, además como se mencionó anteriormente tampoco tienen memoria.
Es decir que no es posible definir un valor, almacenarlo en la computadora del cliente y luego
recuperarlo. Sin embargo hay algunas alternativas:
Cookies. Son archivos de texto, que quedan salvados en las computadoras cliente. En ellos se
puede guardar variables y luego recuperar su valor. Aunque browser permite al usuario a
opción de deshabilitar el uso de cookies, son ampliamente utilizadas.
Pasaje de parámetros. En este método se utiliza el pasaje de parámetros entre los objetos web
para el pasaje de información. Todos los objetos web de la aplicación tendrán los primeros
parámetros iguales, en donde se pasarán datos comunes a toda la aplicación, como número de
cliente, etc. y luego tendrán parámetros específicos de cada uno. La ventaja de este método es
que los usuarios que no permiten cookies no tienen problemas en utilizar la aplicación, la
desventaja es que los cambios en los parámetros tienen un fuerte impacto. Como el pasaje de
parámetros se realiza a través de la url de la aplicación y los browsers permiten que se vea esa
url, el usuario puede ver el valor de los parámetros, e incluso modificarlos. Sin embargo,
GeneXus brinda la posibilidad de encriptar los parámetros en forma transparente al
desarrollador, esto es importante porque se puede pasar números de cliente, números de
factura, etc. en forma segura.
Crear sesiones. Este método mantiene la información en sesiones que son almacenadas en la
base de datos. Por cada usuario que utiliza la aplicación debe crearse su sesión particular.
Además debe ser complementada con el pasaje de parámetros o cookies para recuperar el
número de sesión. La ventaja sobre el método anterior es que si se necesita almacenar mas
información se afecta solo los objetos que necesitan esa información.
Una aplicación web debe estar disponible los 7 días de la semana, durante las 24 horas del día.
Esto implica un servicio de alta disponibilidad en el cual posiblemente se maneje redundancia
de servidores y de información.
Conclusiones.
Las aplicaciones web son una nueva alternativa a las aplicaciones de interfaz grafica. Ambos
tipos de aplicación tienen sus características propias por lo que en cada aplicación se debe
evaluar si conviene realizarla como web o GUI. Los puntos discutidos en este articulo pueden
ser considerados como una guía para tomar esta decisión. Como requisito para tomar una
decisión correcta se debe comprender:
Algunos puntos a tener en cuenta para evaluar la creación o migración a aplicaciones web son:
Como punto final hay que tener en cuenta evolución de la aplicación en cuanto a la creación
de nuevos módulos, cantidad de usuarios y mantenimiento.
Objetivo
El objetivo de este documento es describir los principales aspectos técnicos a tener en cuenta
al momento de convertir una aplicación GeneXus de tipo GUI-Windows a una aplicación Web.
Introducción
Aplicación GUI
Entendemos como aplicación GUI (Graphic User Interface) a toda aquella que tiene interfaz
gráfica Windows, compuesta básicamente por los objetos transacciones, work panels,
procedimientos y reportes, generadas con los generadores GeneXus Visual Basic, Visual Fox,
Java y .Net.
Aplicación Web
Una aplicación Full Web tiene una interfaz HTML (HyperText Markup Language) y se ejecuta
dentro de un browser. Este tipo de aplicaciones se desarrolla básicamente con los objetos Web
de GeneXus: web panels y web transactions. Se generan con cualquiera de los generadores
Web: Visual Basic, Java, .Net y C/SQL
Reingeniería de la aplicación
La premisa fundamental para convertir una aplicación WIN a WEB es que los ambientes
implicados (gráfico, html) son diferentes y por lo tanto la conversión implicará algo mas que la
mera conversión de los objetos.
Otra posibilidad es crear un nuevo objeto (Web panel) y copiar la lógica del work panel hacia el
web panel.
Observe que se debe revisar la lógica ya que existen ciertas diferencias en la interfaz que
obligan a cambios en la programación.
Se recomienda leer el documento Comparación entre Web Panels y Work Panels donde se
comparan generalidades de ambos tipos de objetos.
NOTA – Luego de convertir el objeto, se debe editar el código HTML del mismo y quitar los tags
<pre> y </pre> que quedan al principio y al final respectivamente del mismo. Hay que tener en
cuenta que la conversión no crea una tabla con los controles dentro, por lo tanto al quitar los
tags mencionados anteriormente la pantalla se “desarma” y quedan todos los controles juntos.
Se aconseja por lo tanto, crear primero una tabla donde se pueden “arrastrar” los controles y
finalmente quitar los tags <pre> y </pre>
3. Conversión de Reportes
Una posibilidad para manejar reportes es programar un webpanel, de forma que el usuario
final pueda imprimirlo con las opciones de impresión del browser.
MANEJO DE OPCIONES
FILTROS
Si un Web Panel ‘Trabajar con’ tiene variables que se aplican como filtro a los
registros desplegados en el grid, al seleccionar un registro y llamar a otro
objeto (por ej. Transacción Web) que tiene un return, se vuelve al Web Panel
‘Trabajar con’ pero se pierden los valores ingresados a los filtros. Para poder
mantener el comportamiento de los Work Panels ‘Trabajar con’ se deberían
utilizar cookies que almacenen los filtros ingresados.
REFRESH
En Work Panels ‘Trabajar con’, es común tener un comando Refresh o Refresh
keep dentro de un evento, luego de llamar a una transacción. Cuando estos se
convierten a Web Panels ‘Trabajar con’ el Refresh no es necesario, ya que al
ejecutar el comando Return hay un refresh implícito del Web Panel. Por lo
tanto, los comandos Refresh y Refresh keep deben ser eliminados de los
eventos mencionados anteriormente.
Debe considerarse que se puede utilizar únicamente para invocar a objetos sin interfaz. Si se
invoca a otro web panel, solamente se ejecuta para el último registro del grid.
Para la selección de una linea se cuenta con la propiedad “AllowSelection”.
En las aplicaciones HTML esto no puede usarse. Las llamadas a un web panel solamente
pueden realizarse desde otro web panel (mediante el call o el link).
Otra alternativa es usar código HTML externo que permite simular estos tabs
INTRODUCCIÓN CAPÍTULO 12
Una solución para la generación de reportes en WEB es trabajar con reportes PDF.
Con este tipo de reporte, se cuenta con mayor potencialidad para el desarrollo de aplicaciones
web. El reporte generado como PDF puede visualizarse directamente desde el browser.
Lo que haremos es un corte de control sobre la tabla “Gen_Movie”, de forma similar a como se
hizo en el webpanel “MovieCatalog”.
Main
Call Protocol = HTTP
Report OutPut = “Only to File”
Y la siguiente rule:
output_file('movies.pdf','PDF');
Haga clic aquí para ver la demostración..
Nota:
Para comprobar que el reporte ejecuta correctamente, basta con ejecutarlo directamente
desde el browser, digitando en nuestro caso la siguiente URL:
http://localhost/services/oViewCatalog.aspx
PrintCatalog.Link = link(RViewCatalog )
INTRODUCCION AL CAPITULO 13
Como mencionamos al comienzo del curso, los sitios están compuestos
normalmente de una combinación de paginas estáticas y dinámicas. Las páginas
dinámicas tardan mas en bajar que las estáticas, por la simple razón que tienen
que ejecutar antes de poder enviar la información al browser del usuario. Dentro de
este tiempo esta la conexión a la base de datos, la ejecución de las sentencias, etc.
Algunas veces este tiempo de ejecución no es necesario, ya que los datos no han
cambiado. Es por esta razón, que GENEXUS incluye una característica denominada
Smart Static Panels (SSP) que permite estatizar paginas de la aplicación. En este
capítulo vamos a ver que posibilidades nos brinda esta característica…
Introducción
El objetivo es posibilitar la generación inteligente de páginas estáticas desde GeneXus. Como
SSP entendemos la ejecución de un web panel dinámico para una instancia de datos que
recibe como parámetro, es decir archivos de texto conteniendo HTML con la información
obtenida a partir de la base de datos.
Estas SSP pueden convivir con los web panels dinámicos, tanto pudiendo llamarlos como
pudiendo ser llamados. Esto será muy útil en sitios de información (portales) donde gran parte
de la información, después de generada será estática.
Alcance
Lenguaje: C/SQL, Java, Visual Basic
Interfaces: Web
Descripción
La finalidad es permitir desde GeneXus la generación de páginas estáticas de una forma
inteligente, es decir consultando dinámicamente a la base de datos.
1. Si existen páginas cuyo contenido varía en la base de datos con una periodicidad
conocida.
2. Si la aplicación puede soportar mostrar alguna información no on-line sino que se
actualice hacia el web con cierta periodicidad.
Generación de SSP
La preferencia a nivel del modelo denominada ‘Generation Mode’ de la sección Web
Information permite la generación de las páginas estáticas. Las opciones son:
1. Dynamic Panels
Este es el valor por defecto . Significa que el web panel se generará con acceso
dinámico a la base de datos.
Esta ejecución puede hacerse desde la línea de comandos o desde otro objeto GeneXus no
web. Analizaremos ambos casos.
El nombre de las SSP resulta de la concatenación del nombre del objeto web panel con la lista
de parámetros que recibe separados por el carácter ‘_’ y la extensión HTML.
Por ejemplo, se tiene el web panel Clientes que recibe como parámetros la Empresa (atributo
EmpID –num(3))y la categoría (CatId –char(1)), algunos nombres de las SSP son:
hcliente_203_A.html
hcliente_999_S.html
Independientemente de la property Generation Mode por cada link a un web panel, si este
web panel esta marcado como estático, hace un call al web panel (de modo que este también
generará un .html, etc), y el link lo deja apuntando al archivo .html.
Los links a web transactions siempre seran a la transaccion web porque estas no se estatizan
Estatización de SSP
Denominamos Estatización al proceso de generación de las SSP correspondientes a un web
panel.
Existen varias formas de estatizar un sitio web:
Generación a Pedido
Generación desde objetos GeneXus.
Generación desde la línea de comandos
La primera opción aplica cuando el web panel tiene el valor Create Static panels on request. La
generación de SSP a partir de objetos GeneXus y a partir de la línea de comandos aplican
cuando el web panel tiene el valor Static Panel y son útiles para generar estas páginas en
forma masiva para las posibles instancias de datos que existan en la base de datos.
GENERACIÓN A PEDIDO
La generación a pedido de las páginas SSP se realiza cuando la preferencia del modelo o del
objeto tienen el valor Create Static panels on request.
El sitio funcionará siempre como si fuera dinámico, esto significa que los links
siempre son al objeto web panel dinámico.
SSP Directory
Este parámetro es útil en muchos casos en que una nueva generación de SSP no significa
que toda la información anterior deje de ser válida.
FUNCIÓN SETENVPROPERTY
La función SetEnvProperty permite configurar los parámetros adicionales.
La sintaxis es:
Por ejemplo:
FUNCIÓN COPYSTATICFILES.
Esta función permite realizar la copia de las SSP generadas a otro directorio, por
ejemplo:
&aux = copystaticfiles()
Consideraciones en C/SQL
Consideraciones en Java
Consideraciones en Visual Basic
Estatización de Web Components
Cuando se genera como Static Panel un Web Panel que incluye Web Components,
tambien se estatiza el Web Component dentro de la página.
Consideraciones
En la generación de los smart static panels, los parámetros juegan un papel muy importante,
ya que el nombre del archivo creado depende de los valores de los mismos, por lo que para
que funcione correctamente la llamada entre web panels dinámicos y smart static panels es
necesario que se pasen y se reciban los parámetros con el mismo tipo de datos.
Por ejemplo, tener un programa A que llame a uno B pasando un parámetro en un Numérico
de 10 (N(10)) y el B lo reciba en un N(10,2) dará problemas ya que se generará con decimales
(como el llamado)pero se invocará sin decimales (como el llamador).
R: Estatico es el HTML resultado de la ejecución de un SSP. Es decir, hay web panels dinámicos
(un EXE, un servlet) hay SSP (un EXE o servlet con la property "generation mode" en SSP) y hay
HTMLs que son el resultado de la ejecución de un SSP.
Normalmente un sitio se formará con dinámicos y/o HTMLS pero en el "background" se tienen
dinámicos y SSPs que generaron esos HTMLs.
R: si, es decir, puedo tener algunos dinámicos y otras generadas mediante SSP.
SSP-Dinámico, Dinámico-SSP.
dependiendo del mismo es lo que se hace. Normalmente serán sitios con web panels
dinámicos y tambien SSP. Pero un ejemplo totalmente SSP puede ser para armar un CD tipo
Demo de mi sitio y distribuirlo. Se indican todos los objetos como SSP, y ejecutando
CALL(HMAIN) generarán todos los HTMLS del mismo.
Como solución para bajar la carga del servidor Web, se pueden definir algunos SSPs y otros
Dinámicos.
Estos parámetros adicionales se pasan en la línea de comandos después de los parámetros que
el nombre del programa C pudiera tener.
Ejemplo:
Limitaciones
El generador C/SQL no soporta la propiedad genexus.static.copydir y la función copystaticfiles.
Estos parámetros adicionales se pasan en la línea de comandos antes del nombre del
programa Java. La sintaxis es diferente dependiendo de la máquina virtual que se utilice.
Máquina Virtual
Si se ejecuta con la maquina virtual de Sun o IBM, y la cantidad de web panels estáticos a
generar es grande, se recomienda aumentar la memoria máxima disponible para la aplicación.
Esto se hace agregando un parámetro -Xmx<memoria en MB>m al 'java.exe'.
Por ejemplo:
EJEMPLO:
java -dgenexus.staticweb.dir=c:\
-dgenexus.staticweb.dynurl=http://server:8080/servlets
-dgenexus.staticweb.overwrite=false
Por ejemplo:
set
classpath=GeneXusclassr.zip;j:\tomcat\lib\servlet.jar;j:\drivers\jt400.jar;j:\jdk11\lib\classes.zip
;
Parámetro
NOTA: Para poder utilizar las funciones que permiten configurar los parámetros adicionales
desde las aplicaciones GeneXus (función setenvproperty), se debe configurar la preference
‘Functions = Allow non-standard functions’ tanto en diseño como en prototipo.
Para poder ejecutar los SPPs y que los mismos generen los HTMLs correspondientes se deben
seguir los siguientes pasos:
- Compilar el Web Panel que tiene la propiedad ‘Generation Mode=Smart Static Panel’
(generando la página ASP y la DLL), o alternativamente ejecutarlo en forma
interpretada (si se quiere se puede cerrar el browser y dejar solamente la ejecución
del VBP).
- Ejecutar el objeto que va a establecer los parámetros y llamar al SSP.
- Al ejecutarse los SSP se despliega una ventana que indica cuales fueron los HTMLs
generados por la ejecución de los SPPs. Esta ventana se corresponde con un utilitario
llamado GXLOG.EXE.
Ejemplo
Se tiene un Web Panel (PruebaSSP) que será ejecutado como SSP y Work Panel (Llamador)
que será el encargado de ejecutarlo.
A continuación se detallan los pasos a seguir para ejecutar los SSP:
Event 'Llamada’
call(HPruebaSSP, ….)
EndEvent
genexus.staticweb.dynurl para indicar la URL correspondiente a los Web Panels dinámicos que
serán llamados desde los SSPs (http://localhost/cgi-bin/)
genexus.staticweb.overwrite para que no se sobreescriban los SSP para los que ya existe un
archivo .html con ese nombre.
Compilar el Web Panel ‘PruebaSSP’ (se genera la página ASP y la DLL) o si se quiere
ejecutarlo en forma interpretada.
Ejecutar el Work Panel ‘Llamador’, y ejecutar el evento ‘Llamada’.
Al ejecutar el evento ‘Llamador’ se generan las páginas HTML correspondientes al SSP, que
quedarán en el directorio ‘d:\ssp’.
Limitaciones temporales
El generador VB no soporta el parámetro genexus.static.copydir y la función
copystaticfiles.
No se pueden encriptar los parámetros de los Web Panels generados como estáticos.
No se pueden utilizar funciones de Cookies en Web Panels generados como
estáticos.
Si se realiza la ejecución de SSPs, se cierra el utilitario GXLOG.EXE y se vuelve a
realizar una nueva ejecución (sin haber cerrado previamente el programa que
ejecutó el SSP y el proyecto del Web Panel con la propiedad ‘Generation
Mode=Smart Static Panel’ en caso de ejecutarlo interpretado) se produce el siguiente
error:
Para que no ocurra, se debe cerrar el programa que ejecutó el SSP (y el proyecto del Web
Panel en caso de ejecutarlo interpretado), y volverlos a ejecutar.
INTRODUCCION AL CAPITULO 14
En el desarrollo de una aplicación web, la calidad de la interfaz con la que
interactúa el usuario determina el éxito de la aplicación. La calidad de la misma
está definida por una serie de pautas y técnicas. A este conocimiento se le llama
“Usabilidad”.
A lo largo de este capítulo desarrollaremos cada uno de estos puntos para lograr
aplicaciones web exitosas y fáciles de usar.
Estructura de la aplicación
Diseño de la aplicación
Diseño del contenido
ESTRUCTURA DE LA APLICACIÓN
Con estructura de la aplicación nos referimos a la ubicación de los diferentes elementos para
que sean encontrados de forma intuitiva por el usuario y utilizados de forma correcta. Hay que
tener esta estructura bien definida antes de aplicar un diseño.
Es importante que la estructura del sitio esté reflejada en todas las páginas en
forma consistente.
Es recomendable:
Mostrar las barras de navegación en todas las páginas. Con formato: Numeración y viñetas
No cambiar la ubicación de las opciones de los menús según cambien las
páginas (mantener consistencia).
Aplicar los mismos conceptos para las mismas acciones (links, botones,
bullets, etc.).
No poner links a la misma página en la que me encuentro.
Permitir que el usuario siempre controle la navegación: no deshabilitar botones
estándares de los navegadores ni botones del mouse.
Si usa un mapa del sitio (Sitemap) brinde la información de donde está el
usuario en cada momento. Puede incluir una pequeña descripción de qué
ofrece cada opción del menú.
Navegación
La navegación de una aplicación permite ir a las distintas partes, sectores,
páginas de la aplicación rápidamente y en forma intuitiva. La estructura del sitio
se debe reflejar en la navegación permitiendo contestar las siguientes preguntas:
¿Dónde estoy?
- Dentro del universo de sitios/ aplicaciones web
Esto se logra mostrando el logo del sitio/ aplicación web en todas las
páginas. La ubicación habitual del mismo, y por lo tanto el lugar donde el
usuario lo irá a buscar, es la esquina superior izquierda. Esta imagen debe
tener siempre un enlace a la página de inicio de la aplicación o la página
principal del sitio.
¿Dónde estaba?
- Para indicar las páginas que el usuario ya visitó, conviene dejar los
colores de los enlaces con los colores por defecto del navegador.
-
¿A dónde puedo ir?
- Mostrar todas las opciones a donde puede ir el usuario desde la página
actual, sin marearlo con demasiadas opciones. Si las opciones son
muchas, convieene agruparlas por áreas o sectores y dentro de los
mismos mostrar submenús.
1. Página de Inicio
Si bien hay un enlace en el logo de cada página, nunca está de más
repetirlo ya que la página inicial es a la que se retorna con más asiduidad.
Menú de áreas
Muchas veces se usa el área de cabezal para ubicar un menú de áreas o categorías dentro
de la aplicación o del sitio. Generalmente se utiliza cuando hay demasiadas opciones
para ubicar en el menú izquierdo (más de 10). Categorizar los enlaces y agruparlos en
áreas simplifica la navegación haciéndola más intuitiva.
Menú izquierdo
Este menú contiene las opciones de navegación del sitio, todos los lugares del sitio a
donde se puede acceder.
En muchos sitios el menú izquierdo cambia según el área en la que el usuario se
encuentre.
Se debe mantener el mismo diseño del menú, independientemente de las opciones, para
que al usuario sepa cómo usarlo ya que aprendió su uso en otras áreas del sitio.
Links
Hay tres tipos de links:
Cuando se definen links subrayar las palabras importantes y brindar Con formato: Numeración y viñetas
información suficiente para que el usuario se sienta atraído a seguir el link.
Relacionar la información con links del tipo "más sobre tal tema", o sobre el
autor, etc.
Usar “link title” siempre que no sea obvio a donde va el link, para que
aparezcan los tooltips:
oSi el link es externo, el nombre del sitio
oSi es interno, el nombre del subsitio.
oInformación adicional que se aplique
oEl tooltip debe tener menos de 60 caracteres.
Mantener siempre el color predeterminado para los diferentes links.
Siempre usar los mismos nombres para acceder al mismo contenido.
1. Velocidad de carga
2. Público objetivo
3. Uso de la aplicación
4. Máximo aprovechamiento de los temas
Velocidad de carga
El tiempo que demora en cargarse la totalidad de una página determina la percepción que va a
tener el usuario de ese sitio o aplicación. Si la aplicación demora en cargarse, el usuario
pensará que no es buena, que no le solucionará sus problemas de forma correcta. Si la demora
es excesiva, el usuario puede llegar a pensar que la empresa no es fiable.
Usar texto en vez de imágenes siempre que se pueda (ej: para los menús) Con formato: Numeración y viñetas
El formato de las imágenes siempre debe de ser .gif o .jpg, nunca .bmp, ya que
este formato pesa mucho más que los anteriores.
Usar herramientas para disminuir el peso de las imágenes. Ej:
http://www.netmechanic.com/GIFBot/optimize-graphic.htm
No usar imágenes animadas.
No usar flash, ya que no sólo demora más la carga de la página, sino que
muchas veces requiere que el usuario instale la tecnología.
No hacer páginas que requieran el uso excesivo de las barras de
desplazamiento horizontal. Esto no sólo ahuyenta al usuario por el tiempo
que le consume, sino también por la cantidad de contenido que se le
presenta. Es mejor hacer páginas más cortas, con la información suficiente, o
armar más páginas a partir de una.
Público objetivo
Debe tener en cuenta quién será el público objetivo –a quién se dirige, quiénes serán los
usuarios- a la hora de diseñar y elegir los colores, los tamaños de las letras y tamaños de las
pantallas.
Por ejemplo, si el público objetivo está integrado por desarrolladores, se puede hacer un sitio
o una aplicación con letras de tamaño 8 puntos, pero no se recomienda usar este tamaño para
un público masivo.
Uso de la aplicación
Cuando está diseñando también debe considerar cuál es la finalidad de la aplicación para no
entorpecer el uso del servicio que se desea brindar.
Si se trata de un sitio Web donde se ofrece bastante texto para leer no es recomendable que
las páginas tengan sectores que llamen más la atención que el contenido principal de la
página. Por ejemplo, las imágenes animadas son centros de atención. Es realmente molesto
tener imágenes moviéndose en distintas partes de la página cuando se tiene que leer.
Si el sitio web es un portal, donde se espera encontrar muchos focos de atención (textos
cortos, muchos links) es más adecuado usar imágenes animadas.
Escribir lo más corto y conciso posible. Se dice que en Internet hay que escribir
entre un 50% y un 25% menos de lo que se escribiría en papel
Poner las conclusiones al principio y una opción para ver el detalle de esa
conclusión
Tipo de letras
Se deben tener las siguientes consideraciones a la hora de elegir el tipo de letra a utilizar en
una aplicación Web:
2- El tamaño debe ser adecuado para el público objetivo y para la resolución más
usada
Legibilidad
La buena tipografía depende -entre muchas otras variables- del contraste visual
entre una fuente y otra, y entre los bloques de texto, los títulos, y el espacio en
blanco alrededor. Lo que más atrae al ojo es el contraste fuerte con patrones
distintivos.
La lectura va a ser más cómoda cuanto mayor sea el contraste de los colores. El
mayor contraste se logra con fondo blanco y letras negras.
Márgenes
Los márgenes definen el área de lectura de una página, separando el texto
principal de lo que lo rodea.
Los usuarios en Internet en general no leen los textos palabra a palabra, sino que escanean las
páginas tomando algunas palabras de cada párrafo para entender la idea general de la página.
La alineación izquierda facilita este tipo de lectura.
LINKS DE INTERÉS
Usabilidad
Sitios con artículos sobre usabilidad y temas relacionados con mejora en los sitios Web
En español
http://www.masterdisseny.com/
http://sunsite.dcc.uchile.cl/~rbaeza/inf/usabilidad.html
http://www.alzado.org/
En inglés
http://www.useit.com/
http://www.37signals.com/
http://www.usabilitynet.org/
http://usableweb.com
http://www.w3.org/TR/WCAG20/
http://www.hildesheim.co.uk/usability/index.html
Herramientas
Herramientas para reducir el peso de las imágenes
http://www.netmechanic.com/GIFBot/optimize-graphic.htm
http://www.creatingonline.com/crunchers.htm
http://www.gifworks.com/
Toolbar con varias herramientas de análisis y optimización de
sitios
http://www.nils.org.au/ais/web/resources/toolbar/install.html
http://www.anybrowser.com/linkchecker.html
Llamaremos instalación local a aquella que es independiente de una conexión a una red e
instalación remota a la restante.
Además, como el generador GENEXUS C/SQL permite acceder a los datos utilizando la
tecnología de acceso SQL Embedded u ODBC, llamaremos instalación SQL Embebida a aquella
que accede a los datos mediante sentencias SQL embebidas en el código fuente e instalación
ODBC a la que se conecta vía ODBC.
Es posible tener cualquiera de las combinaciones, instalación SQL embebida local, SQL
embebida remota, ODBC local, ODBC remota. Detallaremos a continuación los requerimientos
específicos de cada caso.
Compilador C
Rutinas de soporte del generador
Compilador
Normalmente en ambientes UNIX, el compilador C viene incluido con el sistema
operativo. Si se utiliza ODBC como tecnología de acceso a los datos, se requiere
un compilador C++, el cual no viene incluido. Puede utilizarse el compilador GCC,
que puede obtenerse en http://gcc.gnu.org
Las rutinas de soporte son un conjunto de archivos (bibliotecas, include files, etc.)
que son utilizadas (referenciados) por los programas generados por el generador
C/SQL. Estas rutinas se distribuyen en formato fuente y deben ser instaladas
(compiladas, etc.) antes de intentar compilar o ejecutar una aplicación
generada.
Por más información sobre el proceso de instalación de las rutinas de soporte, referirse a
“GeneXus C/SQL Setup Wizard”.
DBMS Precompilador
Informix ESQL C
Oracle Pro*C
Instalación ODBC
Instalar las rutinas de soporte para ODBC.
Ver “Configuración de ODBC en ambiente Uníx”.
Instalación remota
Los siguientes son requerimientos específicos para el caso de realizar una instalación remota:
Conexión TCP/IP
Esquema de transferencia: Copy/FTP
Activación del servicio REXEC
Cada estación de trabajo deberá disponer de una conexión vía TCP/IP con el servidor donde se
realizará la compilación.
Esta conexión se utiliza para transferir los fuentes generados al servidor y para la ejecución de
comandos remotos (REXEC) requeridos para efectuar la compilación de programas.
Transferencia de fuentes
La transferencia de fuentes de los programas generados permite tres esquemas
básicos: FTP, Copy y Don't transfer.
Los dos primeros asumen que el directorio del modelo (especificado en Model
Properties/Target path) no está en el servidor (o no coinciden con el directorio de
programas a donde se desea transferir/copiar los fuentes) y que, por
consiguiente, se necesita transferir los fuentes allí generados para poder
compilarlos.
Unix
Normalmente, este servicio se encuentra instalado y activo. Si no lo
estuviera, los siguientes son los pasos a seguir para activarlo. Se requiere
autorización especial (root) para realizar esta tarea.
Windows
Para usar el servicio de FTP se requiere tener instalado Internet Information
Server 4.0 o Personal Web Server 4.O en adelante.
En el caso de Personal Web Server el servicio de FTP no se instala por
defecto.
Activación del servicio de REXEC
Con el fin de realizar la compilación de los fuentes generados, se requiere el
servicio de ejecución remota (REXEC) activo en el servidor.
El servicio REXEC siempre debe estar activo para compilar los fuentes generados.
Para hacerlo la operativa varía en función del sistema operativo del servidor.
Unix
Normalmente, este servicio se encuentra instalado y activo. Para verificar
que el servicio está activo, ejecute los siguientes pasos:
Nota: Aún cuando esté activado (el test anterior fue satisfactorio), puede
que no sea posible acceder al servicio desde su PC (máquina de desarrollo
donde está instalado GENEXUS y el generador C/SQL). Normalmente, esto
se manifiesta al intentar instalar las rutinas de soporte o compilar un
programa generado, mediante un mensaje del tipo ‘Invalid login’ o 'The
login is not correct' (el mensaje puede variar dependiendo del servidor Unix
pero el sentido es el mismo). En este caso, la causa probable del problema
es que la dirección IP del PC no es una dirección válida desde la cual, el
servidor Unix, pueda recibir solicitudes de REXEC o que la dirección IP del PC
varíe pues se está utilizando DHCP. Ver comentarios del mensaje ‘Invalid
login’ en la sección Problemas Comunes.
Si el servicio no está activado, los siguientes son los pasos a seguir para
activarlo. Se requiere autorización especial (root) para realizar esta tarea.
Windows
Este sistema operativo no provee en forma nativa (al momento de la
escritura de este manual) del servicio de ejecución remota REXEC. El
servicio necesario puede ser provisto por programas de diferentes casas de
software y debe ser comprado aparte.
Para compilar en este ambiente, el generador C/SQL, utiliza archivos del Pro*C
que el usuario debe copiar al directorio de las rutinas de soporte, modificando
dicha copia según el siguiente detalle.
Hacer una copia del archivo 'proc.mk' que, normalmente, está en el directorio
$ORACLE_HOME/precomp/demo/proc en el directorio donde se instalaron las
rutinas de soporte.
INCLUDE=$(I_SYM). $(PRECOMPPUBLIC)
CFLAGS=-I. -O
CFLAGS=-I. -O $(GX_INC)
build: $(OBJS)
build64:
build_static: $(OBJS)
build_static64:
$(SAMPLES) $(OBJECT_SAMPLES):
Requerimientos .Net
Los requerimientos de software de Web objects en .Net se van a dividir en dos partes, los
requerimientos para el ambiente de desarrollo y los requerimientos en producción.
Requerimientos para desarrollo
Además de los requerimientos básicos de GeneXus 8.0 (espacio en disco, cantidad de
memoria, etc.), cada equipo deberá disponer de:
PLATAFORMA .NET
Para utilizar esta versión es necesario tener instalada la versión release del
Framework Redistributable 1.1 y el runtime de Jsharp (en caso de generar
reportes PDF).
GENEXUS
o Development environment GeneXus 8.0
o Generador .Net 8.0
OTROS
- Cliente y servidor de Base de datos de prototipo.
Requerimientos en producción
REQUERIMIENTOS ESTACIÓN DE TRABAJO
En la estación de trabajo de los usuarios de una aplicación desarrollada con Web objects lo
único que se necesita es disponer de un browser y una conexión al servidor donde están los
Web Panels.
REQUERIMIENTOS SERVIDOR
Los requerimientos en producción son similares al ambiente de desarrollo.
Instalación en el Cliente
Alcanza solamente con un browser.
Instalación en el servidor
Alcanza solamente con una copia de los objetos y el archivo de configuración web.config.
Windows 98, Windows 2000, Windows XP con un Personal Web Server instalado o con
Internet Information Server 4.0 o superior.
En principio puede ser también Windows 95 o cualquier sistema operativo
que soporte un Personal Web Server de Microsoft.
En el caso de Windows NT 4.0 (o superior) se necesita el Internet Service
Manager.
Instalar Visual Basic 6.0 SP3 o superior
Instalar Visual Interdev
Permisos de creación de objetos COM
Hay que ejecutar la aplicación Dcomcnfg, que se encuentra en el directorio
system32 del servidor, para dar permisos de creación de objetos al usuario
que ejecuta los objetos Web.
Puesta en producción
Una vez que los objetos Web fueron probados en forma interpretada se deben compilar y
llevar al servidor de producción.
La información sobre como poner en producción los objetos Web VB generados como
WebClasses se encuentra en:
Introducción
Existe una API especificada por Sun Microsystems que se llama 'Java Servlet API'. Esta API
define la forma de ejecutar lo equivalente a los objetos web de GENEXUS (web panels, web
transactions, web components), por lo tanto, el generador Java, por cada objeto web de
GENEXUS, genera lo que se llama un Servlet.
Los Servlets proveen una gran cantidad de ventajas que el generador Java aprovecha, como
por ejemplo, la utilización de un pool de conexiones a la base de datos y la multiplataforma.
A su vez, el generador Java provee una funcionalidad adicional que consiste en que los Objetos
objetos Web web pueden enviar la página HTML comprimida, para que sea descomprimida en
tiempo real por el navegador. La compresión se realiza solo si el navegador indica que es capaz
de descomprimirlo. Esta opción puede deshabilitarse con la preferencia 'Auto compress web
pages', para contemplar el hecho de que algunos navegadores no reporten correctamente su
capacidad para descomprimir las páginas, y no las puedan desplegar correctamente. En las
pruebas que hemos realizado, esta funcionalidad se ha comportado de forma correcta con
todos los navegadores.
Requerimientos
Para poder ejecutar Servlets, es necesario contar con:
1) Un Servidor Web
2) Un Motor de Servlets
3) JavaServer Web Development Kit
El Servidor Web y Motor de Servlets, son dos servicios que se requieren (en un mismo servidor
físico, o no) para poder ejecutar Servlets.
En teoría, las aplicaciones GENEXUS pueden ejecutarse con cualquier Motor de Servlets que
sea compatible con la especificación de Servlets 2.1 o posterior.
A continuación explicaremos los pasos en orden, que se deben seguir para configurar y utilizar
estos requerimientos. Explicaremos en forma conceptual y genérica cada punto, y tomaremos
a modo de ejemplo, la opción de utilizar el Motor de Servlets RESIN para Windows, en forma
local, con el fin de mostrar un ejemplo práctico concreto.
Al final de este capítulo, se incluyen URL’s a papers técnicos que describen la configuración de
otros motores de servlets.
Configuración de un Motor de Servlets
Para ejecutar una aplicación web Java, se debe configurar un motor de servlets; para ello se
deben realizar algunos pasos, que si bien varían un poco según el motor de servlets que se
vaya a utilizar, básicamente los pasos a seguir, son similares.
Los tipos de archivos involucrados en la ejecución de una aplicación web, pueden ser los
servlets (archivos .class), contenido estático y librerías adicionales (archivos .JAR).
Una vez visto este concepto, pasemos a detallar entonces los pasos a seguir para configurar un
motor de servlets:
A modo de ejemplo, si se utiliza RESIN en Windows, en forma local, se deben seguir los
siguientes pasos:
b. Para verificar que se estén tomando las standard de GENEXUS y cuál versión,
se debe ejecutar:
http://localhost:8080/servlet/com.genexus.webpanels.gxver
Script Name: Indica el nombre del script utilizado para compilar los objetos C/SQL. Se asume
que este archivo se encuentra en el directorio especificado en Support Files.
Program Directory: Esta opción es sólo informativa e indica el valor especificado en la opción
"Programs directory".
Transfer
FTP Service: se selecciona para transferir vía FTP.
Copy Files: se selecciona para copiar los fuentes.
Force transfer: bajo el directorio de la aplicación se crea un directorio "Update" que contiene
un archivo vacío con el mismo nombre del archivo que se transfiere, de forma que al transferir
se comparan las fechas y si está actualizado la transferencia no se realiza. Si se marca, siempre
se transfieren todos los archivos.
Submit Mode
REXEC: se selecciona si se desea ejecutar la compilación en forma remota (otro servidor).
Local Exec: se selecciona si se compila sobre la misma máquina donde está el modelo.
Port: Es el número de puerto activo del servicio REXEC. Normalmente es el 512. Este servicio
es utilizado para ejecutar comandos remotos, es requerido para compilar los programas.
Timeout (sec.): Esta opción le indica a GeneXus cuánto tiempo debe dar al servidor para
responder. 0 le indica que espere en forma indefinida.
PROGRAMS DIRECTORY AS SEEN FROM CLIENT: Este campo es válido sólo si se seleccionó
Copy files como método de transferencia de archivos. Es el nombre del directorio donde van
los programas visto desde el cliente.
PROGRAMS DIRECTORY AS SEEN FROM FTP: Es análogo al anterior, pero cuando se elige FTP
service como método de transferencia. Si el directorio no existe el mismo es creado al realizar
la transferencia.
START URL: Es el directorio base para los objetos web. Al seleccionar un objeto web del
diálogo del F5 (Run) y presionar el botón Execute, se va a abrir el browser por defecto definido
en la estación de trabajo.
COMPILER PATH: Determina el path del compilador (csc.exe), este se encuentra bajo el
directorio de instalación del framework en
C:\WINNT\Microsoft.NET\Framework\v1.1.4322
VIRTUAL DIRECTORY: Determina la URL base de ejecución, esta contiene el directorio virtual a
ser creado (si no existe) por GeneXus en el Internet Information Service (IIS) local. El momento
de la creación es luego de la compilación y reorganización.
Execution Mode
1) Referenciar en el classpath las clases necesarias para compilar los servlets (clases
correspondientes al JavaServer Web Development Kit). El archivo puede llamarse servlet.jar o
jsdk.jar o jsdk22.jar (dependiendo del Motor de Servlets que se utilice) y por lo general se
encuentra en el subdirectorio LIB del Motor de Servlets. Estas clases se deben referenciar en el
classpath, además, del resto de los archivos de clase que se requieran referenciar en dicha
variable de entorno.
2) Indicar en el Web Server Root la URL que el navegador utilizará como base para la
ejecución de los servlets.
Siguiendo el ejemplo que venimos viendo en el cual se utiliza el Motor de Servlets RESIN para
Windows, instalado en forma local, a continuación indicamos lo que corresponde
completar en las opciones de ejecución para dicho caso:
1) classpath=gxclassr.zip;.;<driverjdbc>;c:\resin\lib\jsdk23.jar
PROPERTIES A CONSIDERAR EN EL
DESARROLLO DE OBJETOS WEB
En los modelos GeneXus, existen properties que aplican exclusivamente a los objetos web.
Algunas a nivel del modelo de diseño por lo que aplican a toda la base de conocimiento y otras
se encuentran a nivel de los generadores (por lo que aplican al modelo de prototipo o
producción que lo utilice).
Properties generales
Estas properties se definen a nivel del modelo de Diseño. Se setean mediante la opción
File/Edit Model/Properties teniendo abierto el modelo de diseño.
GENERATION MODE
Esta property permite especificar si los objetos web del modelo se generarán
como objetos dinámicos (acceden a la base de datos) o como páginas html
inteligentes (smart static panels).
Existe también la propiedad a nivel de objeto con los mismos valores que la
propiedad del modelo y también el valor Use model's property value.
FOCUS CONTROL
Esta property permite determinar si los objetos web, al mostrar su página,
intentan posicionar el foco en el primer control de entrada (no read-only) o
dejan librado al Browser la posición del foco.
Existe también la propiedad a nivel de objeto con los mismos valores que la
propiedad del modelo y también el valor Use model's property value.
PROTOCOL SPECIFICATION
Esta property permite especificar el protocolo a utilizar en la url generada para
invocar a los objetos web.
Tiene tres valores posibles: Unsecure (HTTP), Secure (HTTPS) y Do not specify.
El valor por defecto es Unsecure (HTTP), que fuerza a generar HTTP como
protocolo en la llamada al web panel e indica que el protocolo a utilizar es el
Hypertext Transfer Protocol.
El valor Secure HTTPS: fuerza generar HTTPS como protocolo e indica que el
protocolo a utilizar es el Secure Hypertext Transfer Protocol. Para utilizar este
protocolo es necesario disponer de un servidor seguro.
Properties de .Net
Estas properties se definen a nivel del modelo .Net y se setean mediante la opción File/Edit
Model/Properties teniendo abierto dicho modelo.
Namespace
Determina la forma de hacer el rendering de los controles HTML ( para EditBox, CheckBox,
RadioButtons, ListBox y Buttons), en web panels y web transactions. Por default esta en "No".
Cuando el valor es Yes, indica que el rendering se hace utilizando controles .Net para generar
el HTML necesario. Estando en "No" indica que use el rendering standard generado por
GeneXus en todas sus plataformas, este último garantiza compatibilidad en el look and feel
entre las distintas plataformas Web generadas por GeneXus.
El valor en NO es útil para evitar el armado del makefile del developer menú, este es muy
costoso ya que debe generar todos los response file (*.rsp) cada vez que se compila un objeto.
Compiler options
La información de esta property se incluirá en el .rsp que se usa para compilar el main.
Es útil por ejemplo para generar información de debug (incluyendo el string “/debug”) o para
incluir una dll dentro del namespace (/r:xxx.dll ).
Para el manejo del contenido estático, se centralizan todos estos archivos en un directorio
determinado, en el servidor donde correrá la aplicación web. Para indicar este directorio se
utiliza la preference Static content base URL.
Nota: Esto es válido para las imágenes que no estén involucradas con los objetos HTML. Por
ejemplo las imágenes que se ponen en los background de las tablas o celdas no están
comprendidas en el caso anterior. Este tipo de imágenes no van a concatenar ni la URL de la
webapp, ni la preference Static content base URL.
El resto del contenido estático como ser los javascripts (*.js) y el archivo styles.css que también
debe estar físicamente en el mismo directorio que las imágenes, no es necesario copiarlos
manualmente como el caso de las imágenes, sino que en tiempo de compilación, el generador
los copia al mismo. Para ello hay que especificarle en la preference Static content directory
seen from client el path al mismo, con formato X:\imagenes, donde X:\ es el mapping a la URL
de la webapp.
Propósito
Permite especificar el directorio donde se transferirán los servlets
generados. En tiempo de compilación de cada objeto web, el generador los
copiará al directorio especificado.
Notas:
Es necesario especificar este valor antes de generar, ya que se utiliza
para la generación del archivo de make.
El path debe ser relativo al cliente, es decir un path visto desde el PC
en el que se está trabajando con GENEXUS.
Se copiarán además de los archivos .class, los archivos .cfg, los
cuales contienen la información de las preferencias ingresadas; por lo
tanto, si se modifica algún valor de las preferencias del modelo, es
necesario volver a generar y compilar algún objeto web. Además,
para que se tome en cuenta este cambio al ejecutar, es necesario
reiniciar el servidor de servlets.
Ejemplos de valores
H:\servlets - Si el motor de servlets está instalado en una máquina
mapeada con el “drive” H y servlets es el nombre del directorio
donde deben residir los servlets.
C:\resin\doc\web_inf\classes – Si el motor de servlets es el RESIN y
esta instalado localmente en el directorio C:\resin.
Propósito
Indica el directorio donde los servlets buscarán el contenido estático
(imágenes, javascritps y styles.css) utilizado en los objetos web
correspondientes. Los servlets siempre ejecutan en el servidor, por lo que
este directorio debe especificarse relativo al directorio correspondiente a la
“base URL” de la webapp.
Notas:
Ejemplo de valores
Si se crea un directorio llamado “images” bajo el directorio raíz del webapp
donde se instalaron los servlets, y a él se copian todas las imágenes
necesarias, y en diseño solo se especifica el nombre de la imagen, entonces
en esta preference habría que poner /images.
Preference Static Content directory seen from client
Propósito
Permite especificar el directorio donde se transferirán los javascripts (archivos
*.js) que se generan para los menubars de objetos web y web panels
generados como estáticos. En tiempo de compilación, el generador los copiará
al directorio especificado.
Notas:
En este mismo directorio también habrán archivos de imágenes que se
utilicen en los objetos web. Los mismos se deben copiar manualmente
a este directorio, y en los programas generados se referenciarán
utilizando el valor de la preference “Static Content Base URL”
concatenada con el nombre de cada imágen.
Ejemplos de valores
X:\images - Si el servidor web está instalado en una máquina, mapeada
con el “drive” X y es el directorio “images” el utilizado para dejar el
contenido estático.
C:\resin\doc\images – Si el motor de servlets es el RESIN, está instalado
localmente en el directorio C:\resin y se le creó el directorio images
donde se copiaron las imágenes.
Con formato: Ancho: 21 cm, Alto:
29,7 cm, Distancia del encabezado
desde el borde: 1,25 cm, Distancia del
Preference Auto compress web pages pie de página desde el borde: 1,25
cm, Sin Encabezado de primera página
Propósito diferente
Valores
Yes: envían la página comprimida.
No: no envían la página comprimida. Es posible que algunos navegadores
no reporten correctamente su capacidad para descomprimir las páginas, y
no puedan desplegarlas correctamente.