You are on page 1of 367

RELEASE NOTES GENEXUS 7.

5
Ultima actualización: 14/02/02

Indice
Instalación ___________________________________________________________ 4
Requerimientos ___________________________________________________________________4
Instalación y activación _____________________________________________________________4
GXProtection 2000: Esquema de Administracion de Licencias Centralizadas. ___________________5
Funcionalidades del Development Environment _____________________________ 9
Sección específica Development Environment ___________________________________________9
Integración GeneXus Query con GeneXus _____________________________________________16
Editores __________________________________________________________________20
Editor de estructura - Transacciones __________________________________________________20
Administración de preferencias ______________________________________________________26
Editor de Propiedades _____________________________________________________________38
Editor de Pictures _________________________________________________________________41
Nuevo Editor de forms – Activex ____________________________________________________46
Select object _____________________________________________________________________49
Nuevo “View” de Objetos __________________________________________________________51
Colores del Form Grafico___________________________________________________________55
Diálogos __________________________________________________________________58
Diálogos de creación e impacto ______________________________________________________58
Distribución y Consolidación________________________________________________________59
Listados en XML _________________________________________________________________66
Atributos _________________________________________________________________74
Límite de atributos ________________________________________________________________74
Truncado de objetos y atributos ______________________________________________________74
Variables basadas en atributos _______________________________________________________77
Nuevas Propiedades de atributos _____________________________________________________78
Dominio como array ______________________________________________________________81
Primary Key _____________________________________________________________________84
Comandos ________________________________________________________________88
Comando For To Step _____________________________________________________________88
Comando Submit _________________________________________________________________88
Reglas ___________________________________________________________________91
Regla Prompt On _________________________________________________________________91
Msg y error con expresiones ________________________________________________________92
Definición de parámetros de IN y OUT ________________________________________________92
Objetos __________________________________________________________________95
Fechas y Versión del Objeto ________________________________________________________95
Ambientes ________________________________________________________________99
Definición de ambientes en un modelo ________________________________________________99
Help ____________________________________________________________________103
HTML Help ____________________________________________________________________103
Ayuda y Documentación HTML para atributos/dominios/variables _________________________111
Tipos de Datos ___________________________________________________________115
Nuevos Tipos de Datos ___________________________________________________________115
Tipo de Datos DBConnection ______________________________________________________115
Tipo de Datos WebWrapper________________________________________________________119
Tipo de Datos WebSession ________________________________________________________122
Tipo de Datos XMLWriter_________________________________________________________125
Tipo de Datos XMLReader ________________________________________________________135
Tipo de Datos para el manejo de planillas Excel ________________________________________143
Tipo de Datos para el manejo de documentos Word _____________________________________152
Tipos de Datos para el manejo de correos _____________________________________________159
Tipo de Datos HttpClient, HttpResponse y HttpRequest __________________________________185
Funciones _______________________________________________________________193
Funciones estándar _______________________________________________________________193
Funcion FileExist()_______________________________________________________________194
Función DeleteFile _______________________________________________________________195
Funciones de lectura y escritura del registro de Windows _________________________________195
Funciones de Encriptación _________________________________________________________197
Función Sleep___________________________________________________________________200
Función StrSearch _______________________________________________________________201
Función StrReplace ______________________________________________________________203
Función Isnull __________________________________________________________________204
Nombres Largos en función UserId() y Workstation() ___________________________________205
Funcionalidades Generales ____________________________________________ 207
Call dinámico ___________________________________________________________________207
Protocolo SOAP _________________________________________________________________208
Reportes PDF ___________________________________________________________________214
Consideraciones para manejo de reportes PDF en C/SQL _________________________________215
Consideraciones para manejo de reportes PDF en Visual Basic ____________________________217
Consideraciones para manejo de reportes PDF en Java ___________________________________218
Reportes/Procedimientos con salida XML_____________________________________________223
Funcionalidades para Aplicaciones Web _________________________________ 226
Transacciones Web ______________________________________________________________226
Web Components ________________________________________________________________235
Embedded pages ________________________________________________________________242
Create SSP on request ____________________________________________________________246
WAP__________________________________________________________________________248
Encriptación de Parámetros ________________________________________________________253
Paginado de subfiles en Web Panels _________________________________________________256
Uso de Web Panels en reglas prompt_________________________________________________259
Propiedades______________________________________________________________262
Propiedad OnClickEvent para imágenes ______________________________________________262
Propiedades BackColorEven, BackColorOdd de Subfiles _________________________________264
Propiedad Columns subfiles freestyle ________________________________________________267
Propiedad PageCount _____________________________________________________________269
Propiedad RecordCount ___________________________________________________________269
Propiedad Rows subfiles __________________________________________________________270
Propiedad Cache Expiration Lapse __________________________________________________271

2
Propiedad Enable para botones en objetos web _________________________________________271
Eventos _________________________________________________________________273
Evento refresh con múltiples subfiles ________________________________________________273
Evento click en Text block y Combo _________________________________________________274
Métodos _________________________________________________________________276
Método JSEvent _________________________________________________________________276
Funcionalidades para aplicaciones Win __________________________________ 278
Múltiples Subfiles _______________________________________________________________278
Acceso a las Propiedades de la Menu Bar _____________________________________________283
Opciones Confirm y Close en Menu bar ______________________________________________285
Propiedad When To Refresh _______________________________________________________285
Propiedad Caption en items de controles Radio Button ___________________________________286
Propiedades Caption y Visible en Tab Dialogs _________________________________________287
Funcionalidades para aplicaciones Cliente/Servidor ________________________ 288
Múltiples conexiones por modelo ___________________________________________________288
Comando SQL __________________________________________________________________292
Metodos de Conexion con Tecnologia ODBC__________________________________________293
Primary key index clustering _______________________________________________________295
Preferencia Lock Time-out(seconds) _________________________________________________296
Configuración de Trace (GeneXus DB Activity Trace)___________________________________298
Funcionalidades Específicas de los Generadores___________________________ 301
C#______________________________________________________________________301
Sección específica del generador C# _________________________________________________301
C/SQL __________________________________________________________________302
Sección Específica C/SQL _________________________________________________________302
C/SQL - Acceso vía ODBC ________________________________________________________305
Generación de Web Objects como ISAPI _____________________________________________306
Preferencia "Extension for WEB programs" ___________________________________________310
C/SQL- impresión gráfica en windows _______________________________________________311
Java ____________________________________________________________________315
Sección específica del generador Java ________________________________________________315
Transacciones con back-end HTTP __________________________________________________333
Servidores de aplicaciones JAVA 7.0 y 7.5 en el mismo host ______________________________335
Setup para aplicaciones generadas con GXWS Deployment _______________________________337
Propiedad Provider de subfile ______________________________________________________339
Instalación de aplicaciones Java como servicio NT con JSrvAny ___________________________340
Aplicaciones Multi-tier con http como protocolo de comunicación _________________________342
War Deployment ________________________________________________________________348
Visual Basic______________________________________________________________355
Sección Específica del generador Visual Basic _________________________________________355
Generacion de SSP con el Generador Visual Basic ______________________________________360
Integridad referencial en Visual Basic ________________________________________________362
Propiedad "Prompt for Confirmation" ________________________________________________364
Visual Fox Pro ___________________________________________________________366
Sección Específica Generador Visual FoxPro __________________________________________366

3
Instalación
Requerimientos
Para que esta versión funcione correctamente, es necesario tener instalado Internet
Explorer 6.0 o posterior. En el caso de ser necesaria su instalación, se incluye una
versión de dicho software en el directorio Utilities\Internet Explorer 6.0 del CD. Se
deberá ejecutar el archivo IE6SETUP.EXE.

NOTA:
Algunas “features” tienen requerimientos propios, por lo cual es recomendable leer
la sección de “Requerimientos” de cada una de ellas.

Instalación y activación

Instalación
La instalación de esta versión es similar a la de cualquier otra versión de GENEXUS.
Una diferencia menor con respecto a las instalaciones anteriores es la creación del
grupo de programas “GeneXus Utilities”, que posee shortcuts a diferentes utilitarios
proporcionados con la versión. Dichos utilitarios son los siquientes:

• GeneXus Copy Model


• GeneXus Data View Generator
• GeneXus DB Activity Trace
• GX Register – Este utilitario se usa para registrar la versión de
GeneXus desde el lugar donde se encuentra. Esto es para el caso en
que se trabaje con mas de una versión de GeneXus en la misma
máquina.

Para el generador C/Sql ademas se integra:

• GeneXus CSQL Setup Wizard

En caso del generador Visual Basic tenemos además:

• GeneXus Visual Basic 6.0 Reload Utility

Activación
Para autorizar el GeneXus Development Environment y los generadores que
requieran autorización deberá realizar los siguientes pasos:

1. Ejecute el "GeneXus License Manager" que se encuentra en el menú de


programas de "GeneXus 75" o el Gxlmgr.exe del directorio donde se instaló
GeneXus.
2. Presione Select Computer e indique dónde residirá la licencia. Las opciones
son: Local para licencias locales o Remote para licencias centralizadas (1).

4
3. Seleccione todos los productos a autorizar.
4. Presione Authorize, seleccione la opción Request License y continúe con los
pasos del asistente para enviar los Site Code a su distribuidor. La solicitud
se puede realizar vía web (automática) o puede generar un archivo con
cada uno de los site code de los productos y enviar ese archivo a su
distribuidor vía e-mail.
5. Una vez obtenido los Site Key o el archivo con los mismos, presione el
botón Authorize nuevamente y selecione la opción Enter Licenses para
ingresar las claves de activación.
(1)
Licencias Centralizadas: si se desea mantener las licencias en forma
centralizada, será necesario instalar el GeneXus Protection Server (versión 2.0 o
superior) en un servidor NT o Windows 2000. La funcionalidad del mismo es
servir licencias a cualquier cliente de la red independientemente de donde se
encuentre instalado el producto (en un PC local, en el mismo servidor y/o en un
servidor diferente).

Por información más detallada sobre la protección consulte GXProtection 2000.

GXProtection 2000: Esquema de Administracion de


Licencias Centralizadas.

Introducción
El License Manager, que es el administrado de licencias que se instalada con el
producto que utiliza GXProtection 2000 (GeneXus, GXplorer, etc.), puede ser
manipulado por cualquier usuario que tenga acceso al producto. En ciertos casos es
deseable tener un usuario o grupo de usuarios que actúen como administradores de
las licencias y restringir de esta forma el acceso a otros usuarios.

A partir de la versión 1.4 de GeneXus Protection Server se dispone de un esquema


para la administración de licencias centralizadas evitando así que usuarios no
autorizados puedan autorizar, desinstalar y transferir las licencias.

Alcance
GeneXus 7.0 upgrade 1 o superior
GXplorer 4.0 o superior

Descripción
La administración de licencias centralizadas permite definir un grupo de usuarios
los cuales podrán utilizar el producto1, y un grupo de usuarios como
administradores del License Manager, evitando así que usuarios no autorizados
puedan autorizar, desinstalar y transferir las licencias.
1
Con producto en este documento nos referimos a cualquier aplicación que utilice

5
GXProtection 2000, por ejemplo, GeneXus y GXplorer.

Por ser el GENEXUS Protection Server una aplicación DCOM que corre bajo
Windows NT/2000, la solución se basa en el esquema de seguridad propio del NT y
DCOM.

Hasta ahora cualquier usuario que estaba bajo el dominio del servidor que contiene
el GENEXUS Protection Server podía, tomando las licencias de ese servidor,
utilizar el producto como realizar cualquiera de las acciones del License Manager
(Autorización, Desinstalación, Transferencia, Log Setting). No se requería realizar
ninguna configuración adicional.

Con esta nueva funcionalidad, primero se desea mantener lo anterior para aquellos
usuarios que no les interese una administración segura de las licencias, de forma
de evitar configuraciones innecesarias. Para esto, basta con dejar marcada la
propiedad ‘Use Default Access Permissions’ en la sección ‘Security’ del
ProtSrvService en el DCOMCnfg (es el valor por defecto).

Aquellos que adopten este esquema de administración de las licencias deberán


realizar algunos cambios en el User Manager del NT (servidor donde se tiene
instalado el GENEXUS Protection Server) y en la configuración del DCOM en el
mismo servidor.

A continuación se explican el funcionamiento de este esquema de administración y


más adelante se especifican los pasos a realizar para la configuración del servidor.

Grupos de Usuario
Básicamente se tienen que definir dos grupos de usuarios: grupo Administrador y
un grupo que contendrá los usuarios de la aplicación o producto..

Los usuarios del grupo Administrador son los únicos que pueden manipular las
licencias del servidor correspondiente, mediante el License Manager. O sea, son los
que tendrán permisos para Autorizar, Desinstalar y Transferir las licencias.

Los usuarios de la aplicación, si están autorizados, pueden:


 ver la información de las licencias del servidor
 configurar dónde residen la licencias (opción Select Computer)
 usar cualquier producto que tome las licencias de ese servidor.

Si el usuario no tiene permisos:


 no ve la información de las licencias ni puede realizar ninguna acción con ellas.
 no puede usar ningún producto que tome las licencias de ese servidor.

¿QUIÉN ES EL ADMINISTRADOR?
Si existe un grupo de usuarios en el NT (creado mediante el User Manager) con
nombre ‘GXProtAdmin’, entonces sólo los usuarios pertenecientes a ese grupo
podrán manipular el License Manager.
Si no existe un grupo con ese nombre, cualquier usuario es el administrador.

Nota: El grupo tiene que tener exactamente ese nombre (no es case sensitive).

6
¿QUIÉNES SON LOS USUARIOS?
Aquellos que se den de alta en el DCOMCnfg con derecho a acceso a la aplicación
‘GXPrtService’.
En este caso se pueden dar de alta usuarios individuales o grupos de usuarios.
Puede ser cualquier grupo de ese dominio, incluso el GXProtAdmin si se desea que
estos usuarios también puedan ejecutar la aplicación.
COMBINACIONES POSIBLES
Existen diferentes niveles de acceso al Licence Manager y al producto, dependiendo
si existen los grupos o no, y en caso de que existan, si se dan de alta en el
DCOMCnfg o no.

Las diferentes combinaciones son:

1) Si el grupo GXProtAdmin no esta creado y esta marcado el ‘Use Default Access


Permissions’ en el DCOMCnfg  entra cualquier usuario a la aplicación y cualquiera
es el administrador (puede usar el License Manager)

2) Si el grupo GXProtAdmin no esta creado y se da permiso a un grupo X en el


DCOMCnfg  sólo ese grupo puede entrar a la aplicación y además es
Administrador (puede usar el License Manager).

3) Si esta creado el grupo GXProtAdmin y marcado el ‘Use Default Access


Permissions’ en el DCOMCnfg  entra cualquier usuario a la aplicación pero sólo el
administrador puede usar el License Manager.

4) Si esta creado el grupo GXProtAdmin y se da permiso al grupo X en el


DCOMCnfg  Sólo los usuarios del grupo X pueden usar la aplicación y nadie
administra las licencias.

5) Si esta creado el grupo GXProtAdmin y se da permiso al grupo X y al grupo


GXProtAdmin en el DCOMCnfg  Los usuarios del grupo X más los usuarios del
grupo GXProtAdmin pueden usar la aplicación, pero sólo los de este último
administran las licencias.

Nota: Si esta creado VACIO el grupo GXProtAdmin nadie puede administrar las
licencias.

Configuración del servidor


Estos pasos implican cambios en la seguridad de Windows NT/2000 y DCOM por lo
tanto deben ser realizados por algún usuario que tenga esos derechos, como ser el
Administrador de la red.

1. Instalar el GENEXUS Protection Server versión 1.4 o superior en el servidor


(http://www.gxtechnical.com/cgi-bin/hdcenter.exe?2,5,36,57 ). Este setup
instala el servicio ‘ProtSrvService’ en el NT.
2. Crear los grupos 'GXProtAdmin' y el de usuarios de la aplicación en el servidor,
mediante el User Manager y agregar los usuarios correspondientes en cada uno
de ellos. En el primero van los administradores de las licencias y en el segundo
los usuarios que ejecutarán la aplicación.

7
3. Ejecutar el DCOMCnfg en el servidor, seleccionar la aplicación ‘ProtSrvService’ y
en la sección de seguridad marcar 'Use custom access permissions' y con el
botón Edit agregar los dos grupos creados en 1.
4. Reiniciar el servicio ‘ProtSrvService’.

Consideraciones
• Sobre el paso 2 de la sección ‘Configuración del Servidor’:
- Si se esta con Windows 2000 se tiene que hacer un ‘Log Off’ para que los
cambios sean tomados en cuenta.
- El nombre del grupo de usuarios puede ser cualquiera pero el del grupo
Administrador se debe llamar ‘GXProtAdmin’ (no importa las mayúsculas y
minúsculas, sólo el nombre).

• Si se tiene más de un producto instalado (por ejemplo GeneXus y Gxplorer)


cuyas licencias se encuentran centralizadas en el mismo servidor, no es posible
utilizar el esquema de administración para un producto y para el otro no.

• Si se está conectado como ‘Local’ en el propio servidor de licencias, se tiene


creado el grupo ‘GXProtAdmin’ y el usuario no pertenece a ese grupo, el mismo
puede manipular el License Manager como si perteneciera al grupo.

8
Funcionalidades del Development
Environment

Sección específica Development Environment

Compatibilidad
• En la versión GeneXus 7.5 se realizaron varios cambios
en las preferencias del modelo y DBMS Options con respecto a la versión
7.0, algunos de estos cambios son:

• Cambio de valores por defecto


• Nuevas preferencias
• Nuevos valores de preferencias
• Eliminación de preferencias

Cabe destacar que el cambio en los valores por defecto de las preferencias
provocarán un cambio en el comportamiento de las aplicaciones que
los utilizaran. Por este motivo se recomienda revisar detenidamente la
sección del generador XXX en el documento “Administración de
Propiedades”.

• Se modificaron los valores predeterminados para Tablas, Objetos y Atributos


ahora son de 30 caracteres. Este cambio es notado al crear una nueva base
de conocimiento. Por más información referirse a la sección Truncado de
Atributos y Objetos.

• Se modificó el nombre de los botones Refresh de Work panels y Previous en


transacciones. Antes cuando se los utilizaba en los eventos eran btn_Previo
y btn_Refres ahora son btn_Previous y btn_Refresh. Esto trae el problema al
convertir modelos que tienen métodos o propiedades aplicados sobre los
botones que no especifican porque no encuentran los controles dando el
error:
Control/object 'Btn_previo' (o 'Btn_refres') referenced at line 2 not
found/defined. Is it on the form?
Puede modificar el nombre del control o bajar un utilitario para cambiar
automáticamente en todos los objetos. Consulte el SAC 11143

• En la versión 7.5 se incluye el lenguaje C#. Si se crea un modelo con este


lenguaje ellos y luego se intenta abrir esa KB con versiones anteriores, al
abrir el modelo aparecerá el mensaje "Error: Invalid model property. Choose
Edit Model from File menu ". Esto es porque el generador de ese modelo no
es válido en versiones anteriores.

• A partir de esta versión no es más necesario definir un web panel como


main para poder ser ejecutado.

9
 Se discontinúa el Generador FoxPro for Windows en esta versión. Por más
información consulte SAC 10671.

 Los modelos que posean más de 9999 atributos no podrán ser abiertos con
las versiones anteriores, dando un error como el siguiente:
Internal error 3 in mdl-c_ie1b
ISAM Error 0- ?-?-?

Nuevas funcionalidades

Se modificó mensaje en la especificación


Se modificó el siguiente mensaje en el diagrama de navegación:
"A temporary index will be created for CliNom, CliAddr on table Clientes"
por:
'There is no index for order CliNom, CliAddr on table Clientes, poor performance
may be noticed.'

Nueva opción al especificar un único objeto


Se agregó un diálogo que permite seleccionar las opciones de especificación para
poder cambiarlas o dar OK y usar los valores por defecto cuando se tiene
seleccionado un solo objeto. Esta opción es válida cuando se especifica desde: Ctrl-
F8, desde la toolbar o con la entrada del menú Build/Specify current object. Este
diálogo es configurable en las User/Global Preferences en el check Show Options
when specifying Current Object.

10
Figura 1 – Seteo de las opciones de especificación en las User Preferences

El diálogo que aparece una vez que es indicada la especificación de un objeto es el


siguiente:

11
Figura 2 – Opciones a configurar en la especificación

Este diálogo aparece sólo en caso que NO se esté en Diseño, ya que en Diseño las
opciones son fijas (View navigation).

Cambio del orden de especificación del árbol de calls


Se cambió el orden de especificación. Ahora cuando se manda especificar más de
un objeto, estos se especifican en orden inverso al árbol de calls (primero las hojas
del árbol).

Dado un conjunto de Web Panels a especificar, se especifican primero los Web


Components. Esto, agregado al tema de que se especifica en orden inverso al árbol
de calls permite expandir correctamente un Create con variable de Web
Component.

Esto ayuda a reducir la cantidad de errores/warnings relacionados con especificar al


llamador antes que al llamado (por ejemplo, errores de parámetros).

Se modificó el largo de la variable PGMNAME


Dado que la cantidad de caracteres significativos en el nombre de los objetos ahora
puede cambiar, también se hizo que la variable &PgmName cambie en largo en
forma acorde. Siempre tendrá un ancho de un carácter más que el especificado
como caracteres significativos de los nombres de objetos en la preferencia
Significant Object name length.

Nota: Al cambiar la preferencia (Significant Object name length) pueden ocurrir


cambios en los layouts (pantallas, listados, etc.) que el usuario deberá arreglar.

Listado de tablas y atributos


Se agregó una pantalla que permite la selección de atributos o tablas al realizar los
listados de atributos o tablas respectivamente. La idea de ellos es poder aplicar
algún filtro sobre la información a listar, así como mejorar el desempeño al
momento de crear el listado.

Se actualizaron los listados de tablas y atributos, para que al dar botón derecho
sobre una tabla o un atributo y seleccionar 'List' se muestran los listados en
formato XML. Lo mismo sucede al realizar el cross reference sobre un atributo.

Listado de tablas detallado muestra la información de prompt


En el listado de tablas detallado se muestra la información de los prompts
asociados a la misma.

Listado de objetos con formato HTML


Se implementó el listado de objetos en formato HTML. Esta opción esta disponible
desde la opción de menú Tools/List Objects. En el caso de listar un objeto privado

12
se muestra un mensaje de que el mismo no puede ser listado.

Optimización Open/Create KB
Se optimizó la opción File Open/Create KBase, para aquellas bases de conocimiento
con varios modelos.

Intellitips
Se implementaron los intellitips en layout reportes y procedimientos.
Se modificó el comportamiento de los intellitips, solo quedaron para variables,
propiedades y métodos. Se agregó el Ctrl-espacio para que habrá los intellitips
sobre los controles de pantalla.

Infotips: Informacion de parámetros en el abre parentesis


Se implementaron los infotips: información de parámetros y tipos de datos para los
métodos y funciones standar al seleccionar el '(' (abre paréntesis).

Por ejemplo al escribir el ‘(‘ luego de la regla default aparece el tooltip indicando los
parametros necesario y el tipo de dato de los mismos.

Eliminación múltiple de atributos, dominios, variables


Es posible eliminar más de un Atributo, Dominio o Variable al mismo tiempo, en sus
respectivos diálogos (se habilita el botón Remove en la selección múltiple).
Para el caso de los atributos y dominios, cuando se presiona el botón Remove solo
serán eliminados aquellos que no estén siendo usados.

Edición de Help en HTML


La edición del help dentro de GeneXus es en HTML.
Posee la limitación de que no se puede editar el fuente html, no se accede a las
propiedades de las tablas. Por más información ver Help HTML

Limite de los atributos/variables character


Se modificó el límite de los atributos/variables de tipo carácter el máximo ahora es
de 9999.

Browser de objetos
El botón Display Results que está en la opción Tools/Browser, queda habilitado
después de mostrar los resultados. Esto permite refrescar la pantalla cuando el
diálogo no se cierra y se realizan modificaciones.

13
Nuevas opciones en el menu de objetos
En el menú de objetos llamado desde el Menu/Object con el objeto abierto o con
clic-derecho sobre el objeto se agregaron las siguientes opciones:

• Browse (Call Tree y Callers Tree) - A partir de la versión 7.5 es posible


saber, posicionado sobre un objeto en particular, saber a quién llama y
quienes los llaman. (se cambiaron también las opciones Calles y Callers por
estas opciones en el combo del Tools/Browsers)

• Last Navigation - Permite ver la última navegación de ese objeto.

• List - Permite ver el listado del objeto en formato HTML.

Lista de las últimas Base de Conocimiento abiertas


Se incrementó la lista de las últimas bases de conocimientos abiertas en el Menú de
File, pasó de las 4 últimas a las 8 últimas. A su vez ahora se salva la última base de
conocimiento con que se trabajó apenas se abre ésta. Esto permite que si por algún
motivo cancela GeneXus o se sale en forma anormal, se puede volver a seleccionar
la misma de la lista.

Nuevas Opciones del Botón Derecho – Lista de Objetos


Se agregan las opciones “New Folder” y “New Object...” al presionar el botón
derecho sobre el detalle de objetos de un Folders.

14
Clic sobre un objeto – Lista de Objetos
Se compatibiliza el diálogo de lista de objetos al estándar de Windows al cliquear
sobre cualquier objeto en el diálogo de objetos o presionando el botón F2 se
permite modificar el nombre del Objeto.

Modificación de la Status Bar


Se agregan dos opciones sobre la Status Bar.

Se agrega:

• cantidad de objetos que existen en el folder


• cantidad de objetos seleccionados.

Nuevas Opciones del Botón Derecho –Folder/Distribute


Se agrega la opción Distribute seleccionando sobre un Folder. Se llama al diálogo
Distribute Objets agregando todos los objetos que contiene el Folder seleccionado.

Edición de un Fuente
Al modificar cualquier fuente se le agrega un asterisco “*” indicando que esta
pendiente el salvado del mismo.

Nueva opción para ver el último Analisis de Impacto


En el menú Tool, se agregó la opción List Last Impact Analysis, la cual permite ver
el último análisis de impacto realizado.

15
List Last Navigation por Modelo
El listado de navegación se guarda por Usuario/Modelo. Por lo tanto la opción Lista
Last Navigation del Menu Tools muestra la última navegación del modelo
posicionado.

Nuevo idioma - Chino


Ahora es posible generar bases de conocimiento en idioma Chino. Para
seleccionarlo hay que ir en el modelo de Diseño a File/Edit Model/General. Esta
opción está solo disponible para los generadores Java y Visual Basic MDB.

Propiedad Call Protocol.

Se agregó a la propiedad el valor “SOAP”. Por más información consultar Protocolo


SOAP.

La propiedad Call Protocol de procedimientos sólo aparece disponible en el diálogo


de propiedades del objeto cuando el mismo es main.

Por más información acerca de la propiedad, consultar Call Protocol.

Integración GeneXus Query con GeneXus

Introducción
A partir de la versión de GENEXUS 7.5 se integra GENEXUS QUERY a GENEXUS.

Alcance
• GENEXUS QUERY Manager.
• GENEXUS QUERY.
• GENEXUS 7.5.

Objetivo
El objetivo de esta feature es trabajar con GENEXUS QUERY desde GENEXUS de
forma integrada. De esta forma incorporamos a las consultas dinámicas como parte
integrante del desarrollo de nuestras aplicaciones.

Para ello cada vez que se realiza un impacto en la base de datos en un modelo
GENEXUS, se permite generar/impactar la metadata de GX QUERY, asociada al
modelo, en forma transparente para el usuario.
De esta forma se podrá invocar en cualquier momento al GENEXUS QUERY que
permitirá realizar consultas dinámicas sobre todos los atributos del modelo
GENEXUS.

16
Descripción
Desde GENEXUS se invoca automáticamente o a pedido el GX QUERY Manager
(para generar la metadata) y el GX QUERY (para realizar consultas dinámicas).

Para ello al instalar el producto GENEXUS QUERY, se agrega automáticamente


nuevas opciones a GENEXUS en la barra de herramientas Tools.

Figura 3 - Nuevas opciones

• QUERY Manager: Ejecuta GENEXUS QUERY Manager.


• GX QUERY: Ejecuta Excel para utilizar GENEXUS Query.

¿ Como funciona GeneXus Query desde GeneXus?

PROTOTIPO
Para los modelos de tipo “Prototipo” el funcionamiento de la herramienta es a
pedido. Una vez realizada la instalación la primera vez que se genere un
impacto/creación de cada modelo al finalizar la misma se desplegará un mensaje
indicando si se desea ejecutar el producto QUERY Manager para crear una
metadata asociada al modelo, como detalla la siguiente figura:

Figura 4 - Reorganización de una Metadata

17
Las posibilidades son las siguientes

• Yes: Procede a ejecutar el QUERY Manager desplegando en la Status Bar


de GENEXUS el siguiente mensaje .
• No: Se saltea la ejecución del QUERY Manager.
• Don’t ask me again: Esta opción decide si se desplegará nuevamente esta
opción ante un nuevo impacto o creación de la base de datos asociada al
modelo. Esta opción implica que no se ejecute nunca o ejecutarlo siempre.

Es importante resaltar que esta opción se configura por Base de conocimiento /


modelo.

Si desea cambiar esta configuración podrá acceder a GENEXUS QUERY Manager y


seleccionar la opción Tools, Options.

Figura 5 – Opciones de Ejecución de GeneXus Query

Es importante resaltar que esta opción solo es válida en caso de acceder al


producto desde GENEXUS. Por defecto en la instalación se configura el valor Ask me
.

• Ask me: Despliega la Figura 4 al finalizar una reorganización.


• Always: Siempre ejecuta QUERY Manager; es equivalente a responder Yes
y marcar Don’t ask me again.
• Never: Nunca se ejecuta; equivalente a responder No y marcar Don’t ask
me again.

PRODUCCIÓN
Para los modelos de tipo “Producción” el valor por defecto es ejecutar GENEXUS
QUERY Manager siempre; por lo que al finalizar la actualización del modelo
directamente se crea/actualiza la metadata. Si desea modificar esta configuración
deberá modificar el parámetro de la Figura 5.

Catálogos y Metadatas
Cada Base de Conocimiento GENEXUS mantenida con la versión 7.5 tiene un
identificador de Kb único. GENEXUS QUERY Manager accede a esta información al
realizar un impacto por lo que le permite saber sobre que metadata hacer el
impacto. Por defecto se genera una metadata por cada para KB/Modelo, sobre el

18
catálogo que se encuetre activo.

El nombre de la metadata es la descripción de diseño con la descripción del modelo


que se está impactando.

Consideraciones
• La integración sólo es válida para cualquier Base de Conocimiento
mantenida con GENEXUS 7.5 o superior.
• La llamada a GENEXUS QUERY Manager se realiza en las siguientes
condiciones en caso que esté configurada:
o Después de realizar el impacto
o Llamando explícitamente desde Tools / QUERY Manager.
• La llamada a GX QUERY es a pedido y permitira consultar todos los
atributos de la base de conocimiento.
• Al ejecutar el QUERY Manager a pedido desaparece GENEXUS, y hasta que
no se cierre esta aplicación no se activa nuevamente.
• No es posible definir qué atributos se van a exportar desde GENEXUS. El
valor predeterminado es Todos los Atributos, sin embargo se puede
configurar desde el GxQuery Manager, mediante el Wizard de Carga de
metadatas, una vez seteado esto en el GxQuery Manager, se mantendrá
siempre que se impacte esa metadata.
• Si GENEXUS QUERY no se encuentra correctamente instalado aparecerá el
siguiente error al intentar seleccionar las herramientas desde el diálogo
asociado “Error: Tool interface not supported”, debiendo realizar una
reparación de la instalación desde el Panel de Control.
• No es posible modificar el catálogo si se trabaja integrado a GENEXUS.
• Como el GENEXUS QUERY Manager analiza todas las transacciones en cada
impacto, para modelos grandes, el tiempo de carga de la metadata puede
ser importante. En este caso se recomienda realizar la carga de la metadata
a pedido y no en cada impacto.
• Cuando se crea la metadata se infiere automáticamente de las preferences
del modelo GENEXUS las propiedades de conexión. En caso de utilizar
Microsoft Access se configura automáticamente un Data Source con nombre
“KBName-ModelName" referenciando la base de datos.

19
Editores

Editor de estructura - Transacciones

Introducción
A partir de esta versión se modifica el “look and feel” relacionado al editor de
estructuras.

Alcance
Objetos: Transacciones.
Lenguajes: Todos.
Interfaces: Win, Web.

Descripción
Se realiza un cambio en la interfaz para el manejo de estructura de transacciones
manteniéndose las siguientes consideraciones:

• Compatibilidad: Como primer punto y enfocado a usuarios GeneXus,


permite una fácil utilización tal como es el editor de las versiones anteriores
manteniendo la misma funcionalidad.
• Look and feel: mejorar el look and feel de la estructura cambiando la forma
de desplegar los datos, de manera que sea más intuitiva.
• Información: dar la posibilidad de aumentar la cantidad de información
relacionada a la estructura de una transacción.

Como primer punto y para mantener el mismo formato de inserción de atributos


utilizado en el editor anterior; el usuario puede ingresar una estructura digitando la
misma cantidad de caracteres que en el anterior.

Por ejemplo: Supongamos que se tiene una transacción donde se administran los
distintos artículos existentes en la empresa, detallando para cada uno de ellos, el
stock mínimo, máximo y una lista de precios. Una estructura tentativa que modele
esta situación podría ser la siguiente:

ArtId*
ArtDsc
TipArtId
ArtStkMin
ArtStkAct
(ArtFchLta*
ArtPrecLta)
Figura 6 - Estructura ejemplo

20
Al grabar la transacción, se pide que el usuario ingrese los distintos tipos de datos
asociado a los nuevos atributos y posteriormente la estructura es desplegada de la
siguiente manera para la versión anterior:

Figura 7 - Antigua estructura

Los pasos que se deben seguir son los siguientes:

ArtId <ENTER>(1)
ArtDsc <ENTER>
TipArtId <ENTER>
ArtStkMin <ENTER>
ArtStkAct <ENTER>
(ArtFchLta <ENTER><ENTER> <TAB> (1)
ArtPrecLta) <SAVE>
Figura 8 - Ingreso de una transacción

(1) – GeneXus automáticamente asigna al primer atributo de cada nivel de la


transacción la llave asociada al nivel. En caso que se quiera agregar más
atributos a la misma deberá ingresarlo manualmente antes de presionar
<Enter> utilizando el botón derecho Set Key o directamente utilizando el
asterisco.

La estructura es desplegada como muestra la siguiente figura:

Figura 9 - Nueva estructura

De esta manera, se verifica que el manejo de estructuras de transacciones con


respecto a las versiones anteriores no cambió. Simplemente se mejoró la forma de
mostrar los datos de manera que sea más intuitiva su representación agregando
información extra como por ejemplo el tipo de dato de cada atributo, descripción, y
en caso que el mismo sea una fórmula como está formada.

21
Además se agrega funcionalidad para manipular simultáneamente varios atributos,
facilitándole al usuario la manipulación de los mismos:

• Mover un conjunto de items.


• Drag and Drop de items.
• Copiar un conjunto de items.
• Borrar un conjunto de atributos.
• Setear como llave un conjunto de atributos.
• Mostrar llaves y fórmulas con íconos diferentes.

Para realizar cualquiera de las operaciones detallada en el paso anterior, basta con
seleccionar una lista de atributos y utilizar las opciones Special Copy o Move
disponibles en el menú de opciones:

Figura 10 – Menú Pop Up de Opciones

En las siguientes secciones se especificarán las operaciones y movimientos


disponibles.

Movimientos
La siguiente figura detalla los posibles movimientos a realizar:

Figura 11 - Movimientos disponibles

22
UP Y DOWN
Se pueden seleccionar un conjunto de atributos y moverlos dentro de su nivel hacia
arriba y hacia abajo utilizando las siguientes opciones:

Move Up = CTRL + UP
Move Down = CTRL + DOWN

También es possible realizar dicha operación con el mouse directamente utilizando


la funcionalidad Drag & Drop de Windows.

INDENTACIÓN (LEFT/RIGHT)
Utilizando la tecla de función Tab y SHIFT Tab o las opciones del menú pop up
Left/Right es posible indentar o no un atributo dentro de la estructura. Al presionar
la opción Left el atributo seleccionado se elimina del nivel donde se encuentra y se
ingresa sobre el nivel superordinado a continuación del subnivel donde se
encontraba anteriormente, mientras que presionando la opción Right el atributo
seleccionado es insertado en la última posición del primer subnivel existente. Si
desea ingresar un atributo sobre un subnivel ya existente deberá presionar Right
(para que inserte un nuevo nivel) y posteriormente Left (para que cambie el
atributo de nivel).
Al igual que en el punto anterior es possible realizar dicha operación con el mouse
directamente utilizando la funcionalidad Drag & Drop.

OPERACIONES CON EL MOUSE


Todas las operaciones que se pueden realizar con teclas son también posibles de
realizar con el mouse. Estas se encuentran disponibles mediante “Drag & Drop” o
botón derecho, desplegándose un menú pop up (Figura 10) con las diferentes
opciones válidas.

MOVIMIENTOS
Se debe utilizar la opción Drag and Drop, o botón derecho y la opción Move (Figura
11)

Move -> Up | Down | Right | Left

COPIA
La opción Copia permite copiar la definición de uno o varios atributos al
portapapeles. En este caso se almacena internamente una estructura en formato
XML con la lista de atributos seleccionado. Esto posibilita la inserción de atributos
en cualquier parte de la estructura de la transacción.

Por ejemplo, siguiendo el ejemplo del la Figura 9 si se seleccionan los atributos


ArtId y ArtDsc, y se presiona Ctrl + C o desde la opción del menu “Copiar” se
almacena la siguiente estructura:

23
Figura 12 - Copia de atributos

Si realiza la operación “Paste” sobre cualquier objeto que no sea la estructura podrá
verificar que se inserta líneas similares a la Figura 12.
Si el usuario lo desea podrá crear un archivo XML indicando la estructura que desea
para la transacción. Al copiarla y pegarla sobre la estructura de transacciones se
actualiza la vista con los nuevos atributos a partir del atributo seleccionado.

SPECIAL COPY
La opción “Special Copy” se utiliza para copiar el nombre del atributo en formato
plano. Las opciones se despliegan en la siguiente figura:

Figura 13 - Special Copy

• Att: Copia el nombre de la lista de atributos seleccionados al portapapeles.


• Att = &Att: para la lista de atributos seleccionado copia al portapapeles la
asignación de la variable al atributo. Por Ejemplo sin tengo seleccionado el
atributo CliCod al utilizar esta opción se copia al portapapeles
CliCod = &CliCod
• &Att = Att: para la lista de atributos seleccionado se copia al portapapeles la
asignación del valor de cada atributo a la variable con el mismo nombre.
Siguiendo el ejemplo anterior:
&CliCod = CliCod

Operaciones
A continuación se detallan las operaciones válidas:

EDIT
Permite editar el nombre de un atributo existente Se debe seleccionar un atributo y
presionar SPACE o haciendo doble click sobre el mismo.

Tecla rápida (shortcut): Space

24
FORMULA
Permite ingresar la fórmula asociada al atributo seleccionado. Esta opción es sólo
válida si se encuentra seleccionado un atributo.

LIST
Despliega la opción “Attribute Listing” sobre el atributo seleccionado. En caso de
realizar una selección múltiple la operación se realiza para el primer atributo
seleccionado.

CROSS REFERENCE
Obtiene la referencia cruzada detallando los objetos en donde se encuentra. Al igual
que el punto anterior si la operación se realiza sobre una selección múltiple solo
aplica al primer atributo seleccionado.

SET KEY
Al seleccionar una lista de atributos y presionar la tecla ‘*’ (asterisco) se marca
como clave la lista de atributos seleccionado. En caso que los mismos ya sean clave
la selección es eliminada. En caso que se realice una múltiple selección se considera
la cantidad de objetos que tiene asociado una clave y dependiendo de esto es la
operación que se realiza. En caso que la cantidad de atributos secundarios sea
mayor se infiere que el usuario quiere marcar la múltiple selección como clave, por
lo tanto se marcan como clave. En caso que la cantidad de atributos sin clave sea
mayor se considera que el usuario quiere eliminar todos los atributos seleccionados
de la llave por lo que se elimina la llave para todos. Como regla general se marca
como clave en caso que la cantidad de atributos sin clave sea mayor que la
cantidad de clave existentes en la selección. Para los primeros atributos de cada
nivel no se realiza esta operación debido a que es obligatoria la inclusión de por lo
menos un atributo clave por nivel.

Tecla rápida (shortcut): * (asterico)

INSERT NEW ATRIBUTE


Se encarga de insertar un atributo en la estructura. Si se encuentra posicionado
sobre una atributo, se considera que se debe insertar un atributo perteneciente al
mismo nivel por lo que a continuación se inserta un nuevo ítem para igresar el
atributo. En caso que se encuentre sobre la raíz de un nivel, se considera que se
tiene que insertar un atributo hijo, por lo tanto se inserta un ítem al principio del
nivel.
En el siguiente ejemplo se presiona ENTER sobre el atributo ArtDsc, por lo tanto se
inserta un nuevo ítem donde se debe de agregar el nuevo atributo, como muestra
la Figura 14.

25
Figura 14 - Insertar un atributo

Tecla rápida (shortcut): ENTER

INSERT LEVEL
Inserta un nivel sobre la estructura. Si el ítem seleccionado es un atributo entonces
se considera como un nivel paralelo, de lo contrario es un nivel subordinado (hijo).

Tecla rápida (shortcut): ( (paréntesis izquierdo)

DELETE
Permite eliminar un atributo o nivel de la estructura dependiendo de donde se
encuentre. Si se está seleccionando un atributo éste es eliminado de la transacción.
En caso que se esta seleccionando la raíz de un subnivel se eliminan todos los
atributos subordinados.

Tecla rápida (shortcut): DEL

COPY
Permite copiar la definición de un atrbuto.

Tecla rápida (shortcut): CTRL. + C

PASTE
Permite pegar/insertar la definición de un atrbuto.

Tecla rápida (shortcut): CTRL. + V

Administración de preferencias

Introducción
En esta versión se realiza una reorganización de las preferencias en dos niveles. Por
un lado se introduce un nuevo editor de propiedades para la manipulación de las
mismas y se unifican también la administración de las mismas.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes.
Lenguajes: Todos.
Interfaces: Win, Web.

26
Descripción
Como consecuencia de la unificación de propiedades se registran los siguientes
cambios.

• Cambios en las opciones de las preferencias (valores nuevos o que


cambian).
• Cambios en las descripciones de las preferencias.
• Preferencias nuevas o preferencias que se eliminan o sustituyen.
• Reagrupación de las preferencias por categoría (nuevo agrupamiento).

A continuación se detallan los cambios que afectan a los generadores. Para cada
propiedad modificada se detallan los cambios realizados.

Diseño

Nuevas Preferencias
Significant Attribute name length
Significant Table name length
Significant Object name length

Generador Java
Se registran los siguientes cambios para el generador Java.

Cambio de descripciones de preferencias


Descripción Actual Nueva Descripción
Confirm Confirmation
Set Decimal Point Decimal Separator
Calculator on RBUTTON Calculator on numeric fields
Report Viewer Maximized Maximized
Report Viewer Always on Top Always on Top
Distributed Execution Protocol
Images Directory Static content base URL
Auto compress Web pages Auto compress http traffic(1)
Show Connection Dialog Show Connection Dialog in WinForms
Name Server Host Application Server Host

(1) - se agrega a nivel de objeto en procedimientos y reportes y sólo se muestra


cuando
la preference call protocol es HTTP.

Cambio de valores por defecto de preferencias


Preferencia Valor default Actual Nuevo valor default
Decimal Separator Point Language Dependent
Date Format Default Language Dependent
Year limit 0 40
Date Format in CTOD ENG Language Dependent
Function

27
Initialize not referenced No Yes
attributes
Show Form After Start Event Before Start Event
Show Menu Bar Yes No
Skip read only columns Yes No
Add Button Bitmap gxconfirm_add.gif
Delete Add Button gxconfirm_dlt.gif
Bitmap
Update Button Bitmap gxconfirm_upd.gif

Cambio en descripciones de las preferencias


Preferencia Descripción Descripción Actual
Anterior
Confirmation Confirm each action Always prompt
Do not confirm each Never prompt
action
Date Format mm/dd/yy English
dd/mm/yy Spanish
Transactional Yes All Files
Integrity No No Files
Show Connection Yes Alyaws
Dialog in No Never
WinForms

Nuevos valores en preferencias


Preferencia Descripción
Decimal Separator Language Dependent
Date Format ANSI (Y/M/D)
Italian
Portuguese
Prompt Key F10
F12
Date Format in CTOD Function Language Dependent
ANSI (Y/M/D)
Field Exit Passing Last Char
‘+’ key, Tab, Shift-Tab
Enter, Tab, Shift-Tab
Last Record None
F2
F9
Modal (Report Viewer) Yes
No
Esc Key Action Exit Form
None
Calculator on Numeric Fields Yes
No
Protocol Installed ORB (1)
Using stateful HTTP
Using stateless HTTP

28
(1) – La opción es eliminada.

Nuevas preferencias
First Record
Next Record
Previous Record
Auto Center Objects in 0,0
Fast First Row
Encrypt URL parameters
Http back-end base URL
Help Mode
Enable read-only pool
Read-only pool size unlimited
Maximum number of clients per connection
Read-write pool size unlimited
On Request SSP Server Directory
On Request SSP Client URL
Help Files Base URL
Expand Dynamic calls

Preferencias eliminadas
Remote GXDB++ Location
Generate makefile
Read-only pool
Read-write pool
Multi tier location
Authenticate users using LDAP
Calculator on numeric fields
Calendar on date fields
Generate rebuild redundancy programs
Show in TaskBar (SDI)
Skip Read-Only Columns
Automatic Remote Procedure Host

Nuevas propiedades del DBMS


Multi tier location
Lock timeout
Enable National Language Support
Connect to server (1)
Oracle Version

(1) – A nivel de Data Store.

Generador C/SQL
Se implementan los siguientes cambios para el generador C/SQL.

Cambio de descripción de preferencias


Descripción Actual Nueva Descripción
Set Decimal Point Decimal Separator

29
Show Connection Dialog Show Connection Dialog in WinForms

Cambio de valores por defecto de preferencias


Preferencia Descripción Actual Nueva Descripción
Decimal Separator Point Language Dependent
Date Format Default Language Dependent
Date Format in CTOD ENG Language Dependent
Function
Initialize not referenced No Yes
attributes
Show Connection Dialog Yes Automatic
in WinForms
Pro*C version 2.1 8.1
Target Operating System Not Specified Windows

Cambio en descripciones de las preferencias


Preferencia Descripción Anterior Descripción Actual
Date Format mm/dd/yy English
dd/mm/yy Spanish
Target AIX Unix-alike
Operating Windows NT Windows
System
Show Yes Always
Connection No Never
Dialog in
WinForms

Nuevos valores en preferencias


Preferencia Descripción
Decimal Separator Language Dependent
Date Format ANSI (Y/M/D)
Italian
Portuguese
Date Format in CTOD Language Dependent
Function ANSI (Y/M/D)
Web Server Module Protocol CGI
ISAPI
Show Connection Dialog in Automatic
WinForms

Valores eliminados en preferencias


Preferencia Descripción
Target Operating System Not Specified

Nuevas preferencias
Reorganize Server Tables
Encrypt URL Parameters
Web Server Module Protocol

30
Extensions for Web Programs
On Request SSP Server Directory
On Request SSP Client URL
Generate Developer menu MakeFile
Help Files Base URL
Check memory allocation
Expand Dynamic calls

Nuevas propiedades del DBMS


Lock timeout
Enable National Language Support
User id
User password
Connect to server (1)
Oracle Version

(1) – A nivel de Data Store.

Generador Visual Basic


Se implementan los siguientes cambios para el generador Visual Basic.

Cambio de descripcionesde preferencias


Descripción Actual Nueva Descripción
Confirm Confirm Transaction
Report Viewer Always on Top Always on Top
Report Viewer Always Maximized Maximized
List of remote programs (ODBC) List of remote programs (ODBC/JDBC)
Main Web Project Name Web Developer Menu Project Name
Show Connection Dialog Show Connection Dialog in WinForms

Cambio de valores por defecto de preferencias


Preferencia Descripción Actual Nueva Descripción
Date Format Default Language Dependent
Date Format in CTOD ENG Language Dependent
Function
Report Viewer Always On No Yes
Top
Maximum WorkFile Lines - 10000
Show status bar Yes Depending on object
type
Combo Style in Grid Combo Style in Grid Combo Style
Show Connection Dialog Yes Automatic
in WinForms

Cambio en descripciones de las preferencias


Preferencia Descripción Descripción Actual
Anterior
Date Format mm/dd/yy English
dd/mm/yy Spanish

31
Show Status Yes Always
Bar No Never
Field Exit Enter, Tab, Shift-Tab Tab Enter
Print Method VB Native Printing Native Printing
Show Yes Always
Connection No Never
Dialog in
WinForms

Nuevos valores en preferencias


Preferencia Descripción
Date Format ANSI (Y/M/D)
Italian
Portuguese
Prompt Key F10
F12
Date Format ANSI (Y/M/D)
Date Format in CTOD Language Dependent
Function
Show Status Bar Depending on object type
Refresh Key None
Field Exit Passing Last Char
Show Connection Dialog in Automatic
WinForms

Preferencias eliminadas
Visual Basic Version
Generate Web Panels as Web Classes

Nuevas preferencias
Declare Local Referential Integrity (Access)
Procedure and Report Generation
Force Generation of Developer Menu
Main Web Project Name
Generation Mode
Encription Key
On Request SSP Server Directory
On Request SSP Client URL
Help Files Base URL
Expand Dynamic calls

Cambios específicos al generador Visual Basic Cliente/Servidor

Cambio de valores por defecto de preferencias


Preferencia Descripción Actual Nueva Descripción
Tables in Server No tables are in the All tables are in the
server server
Initialize not referenced No Yes
attributes

32
Cambio en descripciones de las preferencias
Preferencia Descripción Descripción Actual
Anterior
Confirm Confirm each action Yes
Transaction Do not confirm each No
action

Nuevas propiedades del DBMS


Multi tier location
Lock timeout
Enable National Language Support
User id
User password
Connect to server (1)
Oracle Version

(1) – A nivel de Data Store.

NOTAS:
• La preferencia “Auto Skip” se elimina ya que a partir de ahora la propiedad
“Field Exit” posee una opción que realiza lo mismo. El valor es “Passing Last
Char” que permite cambiar el foco al próximo control válido al finalizar de
llenar el campo actual.
• La propiedad “Combo Style” aplica solamente a combos definidos dentro de
subfiles.

Generador Visual Fox Pro


Se realizan los siguientes cambios en el generador Visual Fox Pro.

Cambio de descripciones de preferencias


Descripción Actual Nueva Descripción
Confirm Confirmation
Set Decimal Point Decimal Separator
Calculator on RBUTTON Calculator on numeric fields
Report Viewer Maximized Maximized
Report Viewer Always on Top Always on Top
GeneXus Grid Text Grid Size
Object Menu Bar Show Menu Bar
Combo/List Box Style Combo Box Style
Show Connection Dialog Show Connection Dialog in WinForms

Cambio de valores por defecto en preferencias


Preference Valor default Actual Nuevo valor default
Confirmation Do not Confirm each Never Prompt
Action
Decimal Separator Point Language Dependent
Date Format Default Language Dependent
Set Exact Off On
Esc Key Action Exit level Exit Form

33
Color in read only fields Original Grayed (Windows
Default)
Show Connection Dialog Yes Automatic
in WinForms

Cambio en descripciones de las preferencias


Preferencia Descripción Descripción Actual
Anterior
Confirmation Confirm each action Always Prompt
Do not confirm each Never Prompt
action
Date Format mm/dd/yy English
dd/mm/yy Spanish
Esc Key Action Exit Level Change Level
Show Connection Yes Always
Dialog in No Never
WinForms

Nuevos valores en preferencias


Preferencia Descripción
Confirmation Do not Prompt on First Level
Decimal Separator Language Dependent
Date Format ANSI (Y/M/D)
Italian
Portuguese
ANSI (Y/M/D)
Field Exit Passing Last Char
‘+’ key, Tab, Shift-Tab
Enter, Tab, Shift-Tab
Show Status Bar Never
Show Connection Dialog in Automatic
WinForms

Cambios específicos al generador Visual Fox Pro Cliente/Servidor

Cambio de descripciones de preferencias


Preferencia Descripción Actual Nueva Descripción
Date Format in CTOD English Language Dependent
Function

Cambio en descripciones de las preferencias


Preferencia Descripción Descripción Actual
Anterior
Confirmation Confirm each action Always Prompt
Do not confirm each Never Prompt
action

Nuevas preferencias
Expand Dynamic calls

34
Nuevas propiedades del DBMS
Lock timeout
User id
User password
Connect to server (1)
Oracle Version

(1) – A nivel de Data Store.

Generador C#
Las preferencias que aplican al generador C# consta de:

• todas las preferencias que aplican a Cliente/Servidor.


• específicas al lenguaje.

Específicas C#
Use .Net Controls
Application Namespace
Compiler flags

Controles del Form HTMLJava


A continuación se detallan las nuevas propiedades disponibles en el formulario
HTML.

DISEÑO

Nuevas Preferencias
Objeto Grupo Propiedad
Columnas de Subfiles Appearance Format
Subfiles Appearance Rows

Preferencias Eliminadas
Objeto Grupo Propiedad
Atributos Appearance Width
Height
Columnas de Subfiles Appearance Height

RUNTIME

Nuevas Preferencias
Objeto Grupo Propiedad
Subfiles Appearance BackStyle
columnas de subfiles Appearance Format

Preferencias Eliminadas

35
Objeto Grupo Propiedad
Atributos Appearance Width
Height
columnas de subfiles Appearance Height
TitleBackStyle

La columna Grupo hace referencia a la agrupación disponible en el editor de


transacciones.

Preferencias disponibles a nivel de objeto


A continuación se detallan las preferencias que fueron implementadas a nivel de
objeto a partir de esta versión:

• Autocenter objects in 0,0


• Beep on errors
• Beep on Message
• Generate FOR UPDATE Clause
• Functions
• Call Protocol (1)
• When to Refresh (2)
• Use HTTP back-end
• Encrypt URL parameters

Los valores posibles que pueden tomar las primeras cinco propiedades son:

Descripción
(3)
Use Model’s preference value
Yes
No

(1)– Solo se encuentra disponible si el objeto es main. De lo contrario no se


despliega y se utiliza el valor Internal.
(2) – Válida solo para Work Panels. Se utiliza en conjunto con la propiedad
Automatic Refresh.
(3) – No aplican a las cuatro últimas propiedades.

Propiedades de Data Views

Cambio de descripción
Propiedad Descripción Actual Nueva Descripción Aplica a
Table Name Table name Name Access, DB2
6000, DB2 400,
Informix, Oracle,
SQLServer
File Name File Name Name AS400 Native,
DBCFDIX,

36
DBFIDX
Library Database Location Location Access, AS400
Native, DB2/400,
DBFCDX,
DBFIDX,
Informix,
SQLServer,
ORALCE
Index Name Index Name Name Access, AS400
Native, DB2
6000, DB2/400,
Informix,
SQLServer,
ORALCE
TAG Name TAG Name Name DBFIDX
Schema Schema Schema Name Informix, Oracle,
SQLServer

37
Compatibilidad
A continuación se detallan las consideraciones a tener en cuenta al abrir bases de
conocimiento creadas con versiones anteriores a GENEXUS 7.5.

• Valor por Defecto: Si se tiene seteado el valor por defecto, puede ocurrir que en
ciertas propiedades los valores cambien al abrir la base de conocimiento con la
nueva versión. Si desea consultar a cerca de qué propiedades cambian podrá
consultar la sección “Cambio de Valor Por Defecto” de cada generador.
• Preferencias Nuevas o Eliminadas:Algunas de las propiedades eliminadas
deberan setear su valor en un nuevo valor de alguna otra propiedad existente o
nueva. Por ejemplo deja de existir la Propiedad AutoSkip y la Propiedad Field
Exit agrega un nuevo valor para poder setear la opción Autoskip.
• Nuevas Descripciones: Al abrir un modelo con la nueva versión de GENEXUS, las
descripciones de las mismas son actualizadas automáticamente y esto no
determina ningún cambio de comportamiento en el modelo.

Editor de Propiedades

Introducción
En la versión GeneXus 7.0, fue introducido un nuevo editor de propiedades para
administrar las propiedades relacionadas a la configuración de la Base de Datos, así
como también las propiedades relacionadas a los controles de los objetos
desarrollados con el editor HTML. A partir de esta versión se unifican todos los
diálogos de administración de propiedades a este nuevo editor.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Reportes, Procedimientos.
Lenguajes: Cobol, RPG, Visual FoxPro, Visual Basic, Java, C/SQL, C#
Interfaces: Web, Win.

Descripción
Se unifica la edición de propiedades mediante la utilización del editor incluído en la
versión 7.0. Esto implica un cambio en la forma de guardar, acceder, editar y
agrupar las definiciones de propiedades de:

• Modelos.
• Objetos.
• Controles (en caso de utilizar el nuevo editor de forms).

Agrupamiento de Preferencias
El criterio de agrupación utilizado consiste en dividir las Preferencias en generales o
específicas de una plataforma. El objetivo es dar al usuario mayor claridad y

38
facilidad de uso.

A continuación se muestra un ejemplo de configuración de propiedades para el


generador Visual Basic Cliente/Servidor.

Figura 15 – Configurando un modelo Cliente/Servidor

Funcionalidad
A partir de esta versión el editor de propiedades tiene la capacidad de guardar su
estado anterior. Esto permite que al abrir el objeto nuevamente se “recuerde”
(expandiendo/contrayendo) el estado del árbol de propiedades.

Mediante la utilización de la tecla de función F2 (o botón derecho y “Alphabetic


View”), el usuario tiene la posibilidad de ordenar alfabéticamente las propiedades
no tomando en cuenta los grupos a los cuáles pertenece la misma. En caso de
necesitar ubicar determinada propiedad en el árbol de preferencias, podrá presionar
nuevamente la misma tecla (F2). De esta manera se vuelve a la vista categorizada
(“Categorized View”) al actualizarse el árbol de propiedades, posicionándose en la
propiedad seleccionada en el paso anterior. Esto es válido en caso que previamente

39
se encuentre expandido el árbol en el cuál se encuentra dicha propiedad.

Con la tecla de función F3 (o botón derecho y “Hide Default Column”), el usuario


tiene la posibilidad de visualizar/ocultar el asterisco que permite actualizar al valor
por defecto de las propiedades.

Los valores que puede tomar la columna “Default” son los siguientes:

Valor Descripción
Se toma el valor por defecto
Indica que el usuario cambió explícitamente
el valor de la propiedad

La actualización de las propiedades no se realiza hasta que el usuario presione el


botón “OK”.

Para moverse entre las propiedades es posible utilizar la tecla Tab y Shift Tab.

40
Nuevo Editor de Forms
Se unifica también el manejo de propiedades para el nuevo editor de forms.
A partir de esta versión se utiliza el nuevo editor para configurar las propiedades de
cualquier objeto creado con el nuevo editor de Forms.

Al realizar doble click o presionar la tecla Enter sobre cualquier control, se abre un
diálogo con las propiedades del mismo. El orden de aparición de propiedades es el
siguiente:

• propiedades relacionadas con la posición del control en el formulario.


• propiedades generales.
• propiedades específicas del control (en caso que aplique).

A continuación se detalla un ejemplo de configuración de propiedades para un


ComboBox.

Figura 16 - Configuración de propiedades de un ComboBox

Editor de Pictures

Introducción
El objetivo de es facilitar la creación de pictures (máscaras o formatos de edición)

41
sobre los atributos o variables de Transacciones, Work Panels, Web Panels y
Reportes.

Descripción
Las pictures son máscaras o formatos de entrada sobre los datos. En versiones
anteriores, se permitía la edición de las mismas de forma manual. Se integra en
esta versión a la definición de atributo/variable el poder seleccionar “pictures
preestablecidas”, siendo éstas las de uso más común y que no dependen del
generador utilizado.

Definición de pictures
Para poder definir una pictures, se debe utilizar el TAB Advanced del dialogo de
creación/edición de atributo/variable. Dentro del mismo se encuentra el Tag
“Picture”, donde se muestran las opciones disponibles dependiendo del tipo de
datos que se haya seleccionado al definir el atributo/variable.

Propiedades

Numéricos

Las siguientes propiedades se aplican al tipo de dato Numeric.

42
Left Fill

Indica como han de mostrarse los ceros no significativos (ceros a la izquierda)


del número.

Valores:
• Blank: los ceros no significativos no se muestran, pero el número 0 si.
• Blank when Zero: los ceros no significativos no se muestran, y el
número 0 tampoco.
• Zero: se muestran los ceros no significativos.

Ejemplo: considérese la definición de un numérico de largo 7 y 2 decimales,


N(7,2). Para esta definición, se muestra como se define la picture y cual es la
salida para una serie de valores.

INPUT OUTPUT
N(7,2) 0 123.5
Blank ZZZ9.99 0.00 123.50
Blank when zero ZZZZ.ZZ 123.5
Zero 9999.99 0000.00 0123.50

Thousand Separator

Determina si se desea incorporar separador para los miles o no.

Valores:
• True: con separador de miles.
• False: sin separador de miles.

El separador de miles se representa siempre por una coma, cuando se


escribe la picture, pero su verdadero valor lo toma de la Property del
modelo: ‘Decimal Separator’ que por defecto es dependiente del lenguaje
del sistema.

Ejemplo: tomando el ejemplo anterior (visto en la propiedad Left Fill), con


Left Fill = Blank, y con el lenguaje del sistema en inglés:

INPUT OUTPUT
N(7,2) 456 1123.5
True Z,ZZ9.99 456.00 1,123.5
False ZZZ9.99 456.00 1123.5

Prefix

Texto que desea colocarse anteriormente al número. Cabe aclarar que no se


realiza ningún control sobre el texto escrito (si la plataforma utilizada lo
soporta o no), pero algunos símbolos pueden provocar un comportamiento no

43
esperado. (por ejemplo en Visual Basic no se admite el símbolo ! como
prefijo).

Alfanuméricos

La siguiente propiedad se aplica a los tipos de datos Character y VarChar.

Case

Indica la forma en que ha de mostrarse el texto, y en la que se almacena

Valores:
• None: mostrar y almacenar el texto como se ha escrito y permitir la
combinación de mayúsculas
• Upper: mostrar y almacenar el texto todo en mayúsculas.
Ejemplo:

INPUT OUTPUT
C(10) “Hola Mundo”
None Hola Mundo
False @! HOLA MUNDO

Fecha y Hora

El siguiente diálogo es aplicable al tipo de dato Date.

El siguiente diálogo es aplicable al tipo de dato DateTime.

44
Date Format

Determinar el formato de la fecha (básicamente si se desea mostrar con 2 o 4


dígitos para el año.).

Valores:
• None: se muestra la fecha con el formato por defecto del generador (que
es el año con dos digitos) • Year with two digits (99/99/99): mostrar
la fecha con dos dígitos en el año
• Year with four digits (99/99/9999): mostrar la fecha con cuatro
dígitos en el año.

NOTA: cabe aclarar que, independientemente de cómo se edite, la fecha


siempre se almacenará con 4 dígitos en el año. Si se edita con 2 dígitos en el
año entonces el siglo se completa dependiendo de la preference “First Year of
the 20th century”

Hasta la versión 7.0 inclusive para el tipo de dato DateTime, se modificaban


los campos de largo y decimales para formar la picture. Estos campos ahora
aparecen deshabilitados, y los valores son inicializados a través de los valores
tomados de la picture. Es decir, si se selecciona Date Format = Year with four
digits (99/99/9999), el campo de largo se inicializa en 10, si Date Format =
None, el campo se encuentra en 0.

Ejemplo:

INPUT OUTPUT
Date 122501
None
Year with two digits (99/99/99) 99/99/99 12/25/01
Year with four digits (99/99/9999) 99/99/9999 12/25/2001

Hour Format

Determinar el formato de la hora.

Valores:

• Only hour (hh): mostrar solamente la hora.


• Hour and minutes (hh:mm): mostrar horas y minutos.
• Hour, minutes and seconds (hh:mm:ss): mostrar horas, minutos y
segundos.

INPUT OUTPUT
DateTime 123699
Only Hour (hh) 99 12
Hour and minutes (hh:mm) 99:99 12:36
Hour, minuts and seconds
99:99:99 12:36:59
(hh:mm:ss)

45
Observaciones
 En el caso de Objetos Web las pictures numéricas aplican únicamente en
campos de solo lectura no así en campos de entrada.

Nuevo Editor de forms – Activex

Introducción
La característica fundamental del nuevo editor de forms (o formularios) es que está
construido sobre un contenedor de controles ActiveX. Esto permite que además de
los controles estándar (atributos, botones, etc.) puedan ser utilizados controles
ActiveX en la definición de formularios.

Alcance
Objetos: Work Panels
Lenguajes: Java(*) – Visual Basic – Visual FoxPro
Interfaces: Web

(*) El soporte de ActiveX no aplica a Java.

Descripción
Por defecto, todos los forms son creados con el editor anterior que no soporta
ActiveX. Sin embargo, en los Work Panels es posible utilizar este nuevo editor. Para
ello se debe configurar la propiedad de los mismos ‘Use New Form Editor’ en su
valor ‘True’.

46
Luego de esto se debe salvar y cerrar el objeto; al abrirlo nuevamente se abrirá
presentando el nuevo editor.

Nota:
Se sugiere utilizar este editor únicamente en el caso en que se desee incluir
controles ActiveX en el formulario.

Controles en general

Para insertar controles en el form, se utilizan los correspondientes botones de la


paleta de controles. A diferencia del editor anterior, al presionar uno de estos
botones, el control es creado en forma inmediata en el form.
Una vez que los controles han sido agregados al form, la selección y el movimiento,
funcionan exactamente igual que en el editor anterior.

El movimiento de los controles dentro del form, también puede realizarse utilizando
las flechas del teclado. Si además se presiona la tecla de Mayúscula (Shift) se
ignora el grid mientras se realiza el movimiento.

Controles ActiveX

El botón correspondiente a los controles ActiveX es el último de la paleta:


Antes de insertar el control, GeneXus presenta al usuario la lista de todos los
controles instalados y registrados en la máquina, para que éste elija cuál es el que

47
desea insertar.

Una vez elegido, el control es agregado al form.

En este ejemplo se eligió un control para manejar un calendario (Calendar Control


8.0).

Edición de Propiedades
Junto con este editor existe un nuevo editor de propiedades para los controles.

48
Al dar doble click o Enter sobre algún control, se abre un diálogo con las
propiedades del mismo.

Consideraciones generales
 No se encuentra implementada la conversión de forms desde/hacia este
editor.
 No se soporta por el momento parámetros en la definición de los eventos
de los controles ActiveX.
 Los siguientes ActiveX no pueden ser utilizados por el momento:
ActiveMovieControl object
Microsoft NetShow player
RealVideo ActiveX Control (32 bits) object.

Actualmente solo se puede especificar y generar los ActiveX que tienen la


capacidad de salvarse "as text". Hay controles que no lo soportan, pues
esta capacidad es opcional (En Visual Basic estos son los ActiveX que,
cuando se salvan, además del *.frm, se guardan en un *.frx).

Ejemplos
Los ejemplos demuestran cómo insertar controles de tipo Treeview y Progressbar
en un Work Panel así como su funcionamiento.

Puede obtener documentación y una base de conocimiento que ilustra su


funcionamiento bajo esta URL:
http://www.artech.com.uy/cgi-bin/webartech/hdcver03.exe?S,31,0,481

Select object

Introducción
A partir de esta versión se modificó el selector de objetos, permitiendo ver las
descripciones de los objetos en forma completa.

Descripción
Al seleccionar el selector de objetos se ofrece una pantalla como la que se muestra
a continuación.

49
Figura 17 – Selector de Objetos

A su vez se permite modificar el tamaño de la ventana permitiendo ver en forma


completa las descripciones de los objetos, una vez modificado conserva esa
dimensiones hasta una próxima modificación.
Dentro de los objetos que muestra se han agregado los folders, permitiendo abrir
uno desde este diálogo.

50
Patrones de búsqueda
Se permite buscar por el inicio de la descripción de los objetos, la forma de hacerlo
es: <coma><dos puntos><pattern> como por ejemplo: ,:i

Figura 18 – Búsqueda

Nuevo “View” de Objetos

Introducción
A partir de esta versión se modifica la vista asociada a todos los objetos GeneXus,
principalmente para mejorar la interfaz haciendola mas clara y amigable al usuario.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes, Data
Views, Menues, Menu Bars.
Lenguajes: Todos.
Interface: Win, Web.

51
Descripción
En esta versión se cambia el “view” de todos los objetos GeneXus. Para permitir
tener una representación más intuitiva así como también una manera de separar
los distintos aspectos que componen un objeto, permitiendo que los componentes
de un objeto sean mas fácilmente accesibles lo que mejora el trabajo de definición
de los mismos.

A continuación se detallan los cambios realizados.

Transacciones
Las transacciones permiten definir los objetos de la realidad. A partir de esta
versión, también es posible generar transacciones disponibles para aplicaciones
Internet (transacciones en el Web), obteniendo toda la potencia de este tipo de
objetos para el ingreso de datos.
En este caso se separan las distintas partes que conforman la transacción en
distintas vistas.

A continuación se detallan los distintos “Tabs” que componen el objeto:

Figura 19 - Transacciones

• Structure: En esta sección se ingresa la estructura de la transacción. Se


debe detallar los atributos pertenecientes a la transcción, niveles que la
componen y clave para cada uno de los niveles especificados (Editor de
Transacciones).
• Form: se detalla el formulario con interface GUI asociado a la estructura
detallada en el punto anterior.
• Web Form: se detalla el formulario con interface WEB (HTML) asociado a la
estructura definida. Si se selecciona botón derecho y Edit HTML Source se
despliega el fuente HTML asociado.
• Rules: En este tab se agrupan reglas relacionados a la transacción.
• Events: Agrupa los eventos asociados.
• Subroutines: Subrutinas asociadas al objeto.
• Help: sección específica para ingresar la ayuda.
• Documentation: sección especifica donde se ingresa la documentación
relacionada al objeto.

Al abrir un objeto Transaccion, el Tab por defecto que se selecciona es la estructura


en diseño. De lo contrario (prototipo/producción) se abre en el Tab Form (GUI) si el
generador principal es Win y Web Form si el generador principal es Web. En caso
que el objeto sea main se abre el Form correspondiente asociado a ese ambiente.
Los Styles tienen el mismo comportamiento de las transacciones no main, donde se
toma en cuenta el ambiente Default.

52
Reportes y Procedimientos
Los reportes y procedimientos definen procesos no interactivos de extracción y/o
actualización de datos. Por un lado los procedimientos tienen la posibilidad de
extraer información y/o actualizar la base de datos (procesos batch).Como
contrapartida los reportes están encargados de recuperar la información a partir de
los datos almacenados sin tener la posibilidad actualizarlos.

Figura 20 - Reportes y Procedimientos

A continuación se detallan los distintos Tabs que componen dichos objetos:

• Layout: especifica el formato relacionado a la salida y también la lógica


involucrada para la obtención/actualización de la información.
• Rules: se detallan las reglas involucradas en la obtención de la información.
• Subroutines: agrupan las rutinas asociadas al objeto.
• Conditions: detalla las condiciones aplicadas.
• Help: ayuda asociada al objeto.
• Documentation: sección específica donde se ingresa la documentación
relacionada al objeto.

Web Panels
Los Web Panels son objetos que permiten construir páginas WEB dinámicas que
interactúan con la base de datos.

Figura 21 - Web Panels

A continuación se detallan los distintos Tabs que lo componen:

• Web Form: Detalla el formulario en formato HTML asociado. Si se selecciona


botón derecho y Edit HTML Source se despliega el fuente HTML asociado. En
esta sección el usuario podrá ingresar código HTML extra.
• Rules: en esta sección se detalla las reglas asociado al objeto.
• Events: especifican los eventos relacionados al Web Panel.
• Subroutines: agrupan las rutinas asociadas al objeto.
• Conditions: detalla las condiciones aplicadas.
• Help: ayuda asociada al objeto.
• Documantation: documentación asociada al objeto.

Work Panels
Los objetos Work Panles permiten definir consultas interactivas a la base de datos.

Figura 22 - Work Panels

53
A continuación se detallan los distintos Tabs que lo componen:

• Form: Se detalla el formulario GUI asociado.


• Rules: En este tab se agrupan reglas que aplican al Work Panel.
• Events: especifican los eventos relacionados al Work Panel.
• Subroutines: agrupan las rutinas asociadas al objeto.
• Conditions: detalla las condiciones aplicadas.
• Help: ayuda asociada al objeto.
• Documentation: documentación asociada al objeto.

Menues
Los menues están encargados de organizar al resto de los objetos y por lo general
marcan los puntos de entrada a la aplicación.

Figura 23 – Menues

Consta de los siguientes Tabs:

• Structure: Detalla la estructura del menú.


• Help: ayuda asociada al objeto.
• Documentation: documentación asociada al objeto.

NOTA: Sólo son válidos para los generadores gráficos.

Data Views
Los Data Views son objetos que permiten manejar archivos externos como si
pertenecieran a la Base de Conocimiento.

Figura 24 - Data Views

A continuación se detallan los Tabs relacionados:

• Structure: especifica la estructura relacionada al data view, detallando


atributos e índices relacionados así como también plataformas.
• Documentation: documentación asociada al objeto.

Menu Bar
Los objetos MenuBar permiten que los formularios hagan uso de su propia Menu
Bar o Tool Bar.

54
Figura 25 - Menu Bar

A continuación se detallan los Tabs relacionados:

• Structure: especifica la estructura relacionada del Menu Bar.


• Events: Permite ingresar eventos utilizados en el objeto.
• Help: ayuda asociada al objeto.
• Documentation: documentación asociada al objeto.

NOTA: Sólo son válidos para los generadores gráficos.

Consideraciones
En caso que la base de conocimiento tenga objetos privados se eliminan ciertos
tabs dependiendo del objeto, debido a que no es posible acceder a esas secciones
en caso que el mismo sea privado.

A continuación se detallan los distintos Tabs que son eliminados para cada objeto.

• Transacciones: Se eliminan los Tabs Rules, Events y Subroutines.


• Reportes y Procedimientos: Se eliminan todos los tabs.
• Work Panels y Web Panels: Se eliminan los Tabs Rules, Events, Subroutines,
y Conditions.

Es importante resaltar que en el modelo donde se consoliden no estarán disponibles


las reglas, por lo cual no se tiene el conocimiento de los parámetros que recibe el
objeto, por lo que resulta importante entonces definir en la documentación del
objeto que parámetros y de que tipo son los que recibe para su correcta utilización.
Para los objetos Menu, Data Views y Menu Bar las consideraciones
anteriormente mencionadas no aplican. Si desea obtenér más información
a cerca de Objetos Privados podrá consultar las Relase Notes de GeneXus 7.0
en:
http://www.artech.com.uy/cgi-bin/webartech/hdcver03.exe?S,31,0,275

Colores del Form Grafico

Introducción
A partir de la versión 7.5 de GeneXus, en las propiedades de los controles del form
(sólo modo gráfico) se pueden especificar colores dependientes del esquema de
colores de Windows. El color definitivo a utilizar se recalculará en función del
esquema de colores en tiempo de ejecución. También se pueden especificar este
tipo de colores en el "Control Info" de los atributos.

Alcance
Objetos: Transacciones, Work Panels y Reportes.
Lenguajes: Visual FoxPro, Visual Basic, Java, C/SQL, C#.

55
Interfaces: Win Form

Descripción
En las propiedades de los controles dentro del form gráfico (incluyendo el propio
Form) y Control Info de atributos se cambió la paleta para la selección de colores.
Ahora es posible especificar colores dependiente del esquema de Windows. El color
definitivo a utilizar se recalculará en función del esquema de colores en tiempo de
ejecución.

Figura 1 - Colores del sistema

Con esta opción todas las pantallas generadas de la aplicación respetan el esquema
de colores de Windows y cambian dinámicamente (vale decir, si el usuario final
cambia el esquema de Windows de colores, al ejecutar nuevamente la aplicación, la
misma vuelve a tomar los colores predeterminados desde Windows).

También se incluye una paleta para la selección de colores que no dependan del
esquema de Windows de la máquina.

Figura 2 - Colores personalizados

Compatibilidad con versiones anteriores de GeneXus


Al leer objetos salvados con versiones anteriores o al consolidar objetos distribuidos
con versiones anteriores se hacen las siguientes conversiones:

Controles del Form

56
Si el color (RGB) que tenía el control (edit, text, columnas subfile, etc.) es el mismo
utilizado por el esquema de colores estándar de Windows (ya sea para Windows
95/98/NT o para Windows 2000), entonces se asume que era un color estándar y
se sustituye el RGB por el color estándar correspondiente a ese control/propiedad.
Si no es el color predeterminado se mantiene el mismo color.

Ejemplo:
Se tenían los siguientes controles:

1) Form: foreground = Negro (RGB(0,0,0)), background = Gris default en Win


95/98/NT (RGB(192,192,192))
2) Form: foreground = Verde (RGB(0,255,0)), background = Gris default en Win
2000 (RGB(212,208,200))
3) Atributo (control con colores por defecto): foreground = Negro (RGB(0,0,0)),
background = Blanco (RGB(255,255,255))
4) Atributo (se modifica el ForeColor del control del form, se mantiene el
BackColor): foreground = Marrón, background = Blanco (RGB(255,255,255))

Quedan convertidos a:

1) Form: foreground = "Window Frame" (COLOR_WINDOWFRAME), background =


"Button Face" (COLOR_BTNFACE)
2) Form: foreground = RGB(0,255,0) (verde), background = "Button Face"
(COLOR_BTNFACE)
3) Atributo (control en form): foreground = "Window Text"
(COLOR_WINDOWTEXT), background = "Window Background" (COLOR_WINDOW).
4) Atributo (control en form): foreground = Marrón, background = "Window
Background" (COLOR_WINDOW).

Control Info de Atributos


La conversión de los colores definidos en el Control Info del propio atributo (no del
control) se comporta de la siguiente manera:
1. Si el atributo es distribuido con versiones anteriores y consolidado utilizando la
versión 7.5, se realizan las siguientes conversiones:
1.1. Si el color de "foreground" coincidía con el color predeterminado para el
esquema de colores estándar (Black), se convierte a "Window Text".
1.2. Si el color de "background" coincidía con el color predeterminado para
el esquema de colores estándar (White), se convierte a "Window
Background".
2. Si el atributo es salvado con versiones anteriores y abierto (o especificado)
utilizando la versión 7.5, sólo se realizan las conversiones arriba mencionadas en
caso de que ambos colores coincidieran con los predeterminados. En caso contrario,
no se convierte ninguno de ellos.

Consideraciones
• Al consolidar en 7.0 un XPW exportado con la versión 7.5 o superior se
pierde la información de colores. Esto se debe a que ya no se exportan los
colores “viejos”.

57
Diálogos
Diálogos de creación e impacto

Introducción
A partir de esta versión se modificaron los diálogos de creación de un modelo,
creación de la base de datos e impacto de la base de datos.

Descripción

Al momento de crear un modelo de prototipo o producción se muestra la siguiente


pantalla:

Cuando no existe una base de datos para el modelo se genera la siguiente pantalla:

Cuando existe un impacto pendiente, se genera la siguiente pantalla:

58
Distribución y Consolidación

Introducción
A partir de la versión 7.5 de GeneXus se modifica el formato de los archivos de
exportación del Knowledge Manager (KMW). El formato usado hasta el momento
(XPW) era un formato propietario de ARTech, ahora el mismo pasa a ser XML.
Los usuarios contarán con un formato conocido que puede ser procesado por una
gran cantidad de herramientas hoy en día.

También ha sido modificado el log de consolidación creándose ahora a partir de un


XML. De esta forma se muestra la información de consolidación en un documento
HTML que se crea dinámicamente con la información de los objetos consolidados.

Se han agregado además algunos controles en tiempo de consolidación como el de


fechas de modificación y preferences del modelo.

Descripción
El archivo de exportación XPW usando hasta ahora contenía toda la información de
los objetos distribuidos en forma estructurada. A partir de esta versión ese
contenido se almacena en XML, formato estándar para el intercambio de
documentos estructurados.

También se almacena en este formato toda la información de consolidación de los


objetos, permitiendo de esta forma poder visualizar el log de consolidación y las
estadísticas en formato HTML.

Distribución
Una vez seleccionado los objetos a distribuir e ingresado el nombre del archivo de
distribución, se crea automáticamente un archivo comprimido de extensión XPZ
(XPW Zipped) con un archivo XML dentro conteniendo la información de los objetos
y/o atributos distribuidos. El archivo comprimido se crea con el nombre:
<Distribution Name>.XPZ y los xml internos con nombre: <Distribution
Name>_<nro de archivo>.XML

Por ejemplo, supongamos que se exporta un conjunto de objetos y en el


Distribution Name se le pone como nombre MyExport (no se requiere poner
extensión y además se le puede especificar el path donde guardar el archivo, por
ejemplo, D:\Distr\MyExport o seleccionarlo desde el botón de búsqueda).

59
Figura 3 – Distribution Name

GeneXus genera un archivo llamado MyExport.xpz en el directorio especificado (si


no se especifica un directorio se genera en el directorio de la KB). Si se abre ese
archivo con una herramienta tipo WinZip muestra que contiene un archivo con
nombre MyExport_1.xml

Figura 4 – Archivo de exportación XML

TIP: Si al archivo de distribución XPZ se le ingresó un comentario en la sección


“Descripción” (ver Figura Figura 3 – Distribution Name), al abrir el archivo con
WinZip aparecerá una pantalla con el comentario ingresado.

60
DISTRIBUTE OPTIONS
Append to file
Si en el Distribution Name del diálogo de distribución se ingresa el nombre de un
archivo que ya existe, al salir del campo se habilita la sección Distribute Options
para poder agregar la nueva distribución al archivo existente.
Si se marca la opción Append, se crea un nuevo archivo XML dentro del mismo ZIP.
Siguiendo con el ejemplo anterior, se crearía un archivo MyExport_2.xml en el
archivo MyExport.zip. Si ya existe un archivo con ese nombre dentro del zip, se
incrementa el sufijo en uno y se vuelve a intentar.

Si no se marca la opción Append, el archivo se reemplaza con la nueva distribución.

XPW Format
Mediante esta opción es posible distribuir objetos con el formato anterior de
exportación (XPW). De esta forma se podrá consolidar este archivo en versiones
7.0 o anteriores de GeneXus. Cabe recordar que aquellos objetos que usen
funcionalidades de la nueva versión no podrán ser consolidados, generando ciertos
errores en el Consolidation Log de las versiones anteriores.

Encriptación
Cuando se exporta un conjunto de objetos en el cual alguno es Privado, todo el
archivo de distribución es encriptado, por tanto los archivos generados dentro del
XPZ no podrán ser procesados como XML.

Es conveniente distribuir los privados en forma separada de los no privados, por un


tema de performance a la hora de consolidar.

Consolidación
Una vez seleccionado el “Distribution File” en el diálogo de consolidación, se puede
ver en el campo “Type” el tipo de archivo que se va a consolidar (ver Figura 5 -
Diálogo de Consolidación).

TIP: El botón de búsqueda (...) para seleccionar un archivo de distribución se


posiciona en el directorio especificado en el “Distribution File”, si no existe se
inicia en el directorio de la KB.

Es posible consolidar los siguientes tres formatos de documentos:


1. XPZ
2. XML
3. XPW

XPZ
Cuando se selecciona un archivo con este formato, el KMW recorre el contenido del
archivo XPZ y consolida cada uno de los archivos internos, siempre y cuando
tengan el formato XML adecuado.

XML

61
En algunos casos puede ser necesario consolidar algún XML en particular de todos
los que contiene el XPZ. Para este caso se puede descomprimir y consolidar
directamente el XML.

XPW
Para poder tener compatibilidad con el pasado se creo un componente que es el
encargado de realizar la conversión de un archivo XPW a un archivo XML.
El KMW de GeneXus cuando se le especifica que se quiere consolidar un XPW lo que
hace es llamar al conversor el cuál le devuelve un archivo XML temporal que luego
GeneXus consolida. Por tanto la consolidación de XPW es más lenta que la de XML o
XPZ.

NOTA: También es posible consolidar archivos con extensión ZIP, y se comporta


igual que el XPZ, es decir, sólo puede contener dentro un XML correspondiente a
una distribución. En caso de que no se corresponda, al intentar consolidarlo
aparece el siguiente mensaje:
Error: Parsing XML file <archivo dentro del zip> -> syntax error.

TIP: Es posible arrastrar (Drag) un archivo, con cualquiera de los formatos


anteriores, desde el Explorador de Windows y soltarlo (Drop) en GeneXus para
ser consolidado.

Figura 5 - Diálogo de Consolidación


Presionando el botón “Advanced” ser puede ver la lista de objetos a consolidar
mostrando, para cada uno de ellos, el nombre, tipo de objeto y descripción.
Además, habilita el “Adapt From”.

62
Figura 6 - Lista de objetos a consolidar

CONTROLES AL CONSOLIDAR
Control de Fecha de Modificación
Se agrega una nueva opción: “Do not overwrite newer objects” (ver Figura 5 -
Diálogo de Consolidación) para no sobrescribir objetos con fecha de modificación
más nueva. Por información más detallada acerca de esta nueva facilidad consulte:
Versión y Fechas de Objetos.

Control de Preferences
A partir de la versión 7.5 en el archivo de exportación se incluyen las preferencias
de Diseño “Function” y “Significant Attribute/Objact/Table Name length”.

Al consolidar se controla si la KB destino difiere de alguno de estos valores que


vienen en el archivo de exportación. Si hay alguna diferencia, antes de consolidar

63
se le presenta al usuario una pantalla mostrando las mismas preguntando si de
todas formas desea consolidar o no.
Si el usuario cancela, en el log aparece el error de que el modelo no fue
consolidado mostrando las diferencias. Si el usuario confirma, en el log se muestra
al principio que el modelo no cambio los valores pero con un Warning mostrando
las diferencias (ver Figura 7 - Log de Consolidación).

CONSOLIDATION LOG
El formato del archivo “GXIMPORT”, que se crea en la consolidación en el directorio
del usuario, es XML. Esto permite que el log de consolidación sea mostrado en
formato HTML como se puede ver en la siguiente figura.

Figura 7 - Log de Consolidación


ESTADÍSTICAS
Presionando el botón “Statistics” del diálogo de consolidación es posible ver en
formato HTML las estadísticas del resultado de la consolidación: objetos nuevos,
modificados, no consolidados (con sus errores correspondientes), no cambiados,
etc., por cada tipo de objeto.

64
Figura 8 - Estadísticas

Ejemplos
Si bien el contenido y estructura del XML es análoga al XPW usado hasta ahora, el
hecho de tener la información con este formato tiene varias ventajas. Por ejemplo,
el usuario podrá definir un XLS para ver el contenido de la exportación en un
formato personalizado, o abrir el archivo con Internet Explorer 5.5 o superior, el
cual tiene su propio XLS para ver el contenido del XML en forma de árbol. Con esto
es más fácil localizar un área en particular de la exportación. En el ejemplo de
abajo se muestra la información de la Transacción Clientes y se ignora lo demás:
<?xml version="1.0" encoding="UTF-7" ?>
- <ExportFile>
+ <Model>
+ <KMW>
- <GXObject>
- <Transaction>
- <Info>
<Name>Clientes</Name>
<Description>Clientes</Description>
</Info>
<ObjInfo />
+ <PrivateObjInfo>
+ <Documentation>
+ <Help>
<LastUpdate>2001-03-19 09:52:00</LastUpdate>
+ <Structure>
- <![CDATA[
CliCod*
CliNom
CliDir
CliSexo
]]>
+ <Variable>
+ <Variable>
+ <Variable>
+ <Variable>
+ <Variable>
+ <Variable>
+ <Form>
+ <HTMLForm>

65
- <Rules>
- <![CDATA[
Parm( &Clicod , &Mode );
CliCod = &Clicod if Update or Delete;
Noaccept( CliCod ) if Update or Delete;
]]>
</Rules>
</Transaction>
</GXObject>
+ <Attributes>
+ <GXObject>
+ <GXObject>
</ExportFile>

Si además de visualizar la estructura se desea capturar la información de la


exportación en una base de datos se podrá usar el XMLReader para acceder al
contenido del xml.

Consideraciones
• No es posible consolidar Objetos Privados distribuidos con versiones anteriores
que estén encriptados en el XPW.

Listados en XML

Introducción
Los diagramas de impacto, navegación y los listados de tablas, atributos, subtipos y
objetos se muestran como HTML.

Descripción
Los diagramas en se muestran como HTML lo cual tiene las siguientes ventajas:

- Permite la navegación a los objetos de la base de conocimiento mediante


links.
- Se puede personalizar los listados.
- Se puede analizar la navegación de un objeto analizando el XML, por ej. que
tablas accede, etc.

Al poseer links se permiten acceder a los objetos GeneXus, a las definiciones de los
atributos, a las tablas desde los diferentes diagramas y listados. Todos los links que
se pueden realizar en los listados y en las navegaciones también aceptan botón
derecho con las opciones pertinente a cada caso. A su vez los diagramas tienen la
facilidad de permitir ocultar o mostrar información.

Diagrama de Impacto
Al realizar una impacto de la base de datos se muestra un diagrama como el
siguiente:

66
Table CLIENTES conversion procedure

CLIENTES is new

Table Structure
Attribute Type Value Taken From
CliId N(4)
CliNom C(30)
CliDir C(30)
CliTel N(6)
PaisCod C(4)
IvaCod N(4)

El símbolo de una llave indica que el atributo es clave y el símbolo de sol ,


indica que el atributo es nuevo cuando se esta realizando una reorganización como
lo muestra el siguiente diagrama.

Table CLIENTES conversion procedure

CLIENTES needs conversion

Table Structure
Attribute Type Value Taken From
CliId N(4) CLIENTES
CliNom C(30) CLIENTES
CliDir C(30) CLIENTES
CliTel N(6) CLIENTES
PaisCod C(4) CLIENTES
IvaCod N(4) CLIENTES
CliSexo C(1) Null

Diagrama de Navegación

El listado de navegación muestra la información del objeto, si esta requerida su


generación, luego muestra información del generador. También muestra
información de las tablas que accede y los prompts llamados.

Transaction Clientes Status


Name Clientes
Description Clientes
Status Generation is required

Environment

Environment Visual Basic

Spec. Version 7_5_RC3.017

Form Class Graphic


Program Name TClientes
Parameters

67
Levels

Level CLIENTES

• CLIENTES ( CliId )
o PAISES ( PaisCod )
o TRATAIVA ( IvaCod )

Insert into CLIENTES


Attributes to update : CliId,CliNom,CliDir,CliTel,CliSexo,PaisCod,IvaCod
Update on CLIENTES
Attributes to update : CliNom,CliDir,CliTel,CliSexo,PaisCod,IvaCod
Delete from CLIENTES

Referential integrity controls on delete:


• LLAMADOS ( LlaCliId )
• INSTALAC ( InsCliId )
• CONTRATO ( ContCliId )
• FACTURA ( CliId )

Prompts
Table Program In Parameters Out Parameters

TRATAIVA Gx00E0 IvaCod

PAISES Gx00B0 PaisCod

CLIENTES Gx0010 CliId

Listado de Tablas
El listado de tablas muestra la información de los atributos, indicando la
descripción, el tipo, si ellos son fórmula, y si son subtipos. Seleccionando la tabla se
puede acceder a la definición de la misma mostrando los índices que posee.
A su vez clickeando en cada uno de los atributos se puede acceder a su definición.

Con el símbolo de llave se indica que el atributo es clave de la tabla. Con el


símbolo de flecha se indica que el atributo es inferido por el grupo de subtipo.
El símbolo de indica que el atributo es fórmula y muestra su composición.

Table Instalac
Name Instalac
Description Instalaciones
ID 9

Table Structure
Name Description Type Formula Subtype of
InstNro Nro. Instalacion N (4.0)
InstFch Fecha Instalacion D
InsCliId InsCliId N (4.0) CliInst.CliId

68
EqId Equipo Codigo N (4.0)

InsCliNom InsCliNom C (30) CliInst.CliNom

InstGarFch Vigencia Garantia D addmth(InstFch,EpPlazoGar)

En caso de seleccionar ver detalles (Show Detailed List) para la tabla se muestra el
siguiente listado, el cual muestra la información anterior agregando la información
de los índices, las subordinaciones y superordinaciones de la tabla y los prompts
asociados a la misma.

Table Instalac
Name Instalac
Description Instalaciones
ID 9

Table Structure
Name Description Type Formula Subtype of
InstNro Nro. Instalacion N (4.0)
InstFch Fecha Instalacion D
InsCliId InsCliId N (4.0) CliInst.CliId
EqId Equipo Codigo N (4.0)

InsCliNom InsCliNom C (30) CliInst.CliNom

InstGarFch Vigencia Garantia D addmth(InstFch,EpPlazoGar)

Indices
Name Type Attributes
IInstalaciones Primary Key InstNro
IInstal3 Foreign Key InsCliId
IInstal2 Foreign Key EqId
CliInst User InsCliId , InstNro

Subordinated To
Id Table By:
1 Clientes InsCliId
6 Equipos EqId

Superordinated To
Id Table By:
3 Contrat1 InstNro
5 Llamado1 InstNro

Associated Prompts

GX0090

Listado de Atributos
El listado de atributos muestra el tipo del mismo, a que tablas pertenece, en que
objetos se encuentra, y cual es el control de ese atributo.

Attribute CliSexo
Description Sexo
ID 61
Type C (1)

69
Name Description
Clientes Clientes

Transactions

Name Description In
Clientes Clientes Structure , Form

Prompts

Name Description In
GX0010 Selection List CLIENTES Conditions

Control Info
Name Value

ForeColor Window Text

BackColor Window Background

CtrlType Radio Button


Options Values

'Femenino' F

'Masculino' M

Listado de Subtipos
El listado de subtipos mostrado es el siguiente, permitiendo acceder a la definición
de los atributos clickeando en el mismo o mediante botón derecho y la opción List.

Group CliCont
Attribute Type Supertype
ContCliId Pri. CliId
ContCliNom Inf. CliNom

Listado de Objetos
El listado de objetos desde la opción de menú Tools/List Objects muestra la
información del objeto, la fecha de creación, el generador asociado, los programas
llamados, los llamadores, reglas, eventos, subrutinas, condiciones. En el caso de
listar un objeto privado se muestra un mensaje de que el mismo no puede ser
listado.

Name
Description Factura
Folder
Id 9
Created 1998-08-21 13:06:44
Updated 1998-08-21 13:06:44

70
Updated 1998-08-21 13:06:44
Generators (*) - Visual Basic (Default)

Layout
header

end
for each FacFch
where FacFch =&facfch

eject
endfor
Rules
parm(&facfch ) ;
Variables
Name Description Type Length Decimals Picture
Today Today Date 8
Time Time Character 8
Page Page Number 6 ZZZZZ9
Line Line Number 6 ZZZZZ9
Output Output Character 3
Pgmname Pgmname Character 11
Pgmdesc Pgmdesc Character 30
facfch facfch Date 8

Cross References
Call by
Called
EmiFac

71
¿ Dónde es guardada la información de los diagramas de
especificación y reorganización?
EN LA ESPECIFICACIÓN
El especificador graba un archivo llamado gxnavig con formato XML en:
<directorio KB>\<gxuser>
Este archivo tiene todos los objetos que fueron especificados, el status de cada
objeto y una referencia al archivo XML de cada objeto.
A su vez graba un archivo XML por cada objeto especificado en:
<directorio KB>\gxspc<numero modelo>\gen<numero
generador>\nvg

EN LA REORGANIZACIÓN
Al realizarse una reorganización se guarda el gxiar bajo el directorio del usuario en
la base de conocimiento.
Los archivos XML generados son guardados en :
<directorio KB>\<gxuser>\mdl<numero modelo>\gen<numero
generador>

¿ Cómo enviar una navegación ?


Al ser la navegación en HTML, se puede realizar un copy and paste de la misma a
un archivo HTML. Por ej: se puede pegar en un HTML de Word.

Selección de Tablas, Atributos y Objetos


Al seleccionar el listado de tablas o atributos aparece una ventana que permite
seleccionar las tablas o atributos a listar. Esta ventana permite aplicar filtros sobre
la información a listar, así como mejorar el desempeño al momento de crear el
listado.

72
Figura 26 – Selector de Tablas

Una vez listada la información seleccionada se muestra el siguiente listado, teniendo


la posibilidad de agregar mas tablas mediante el botón LOAD. Esto permite agregar
nuevas tablas, atributos y objetos a las ya previamente seleccionadas en el listado.

73
Atributos

Límite de atributos

Introducción
Se aumentó el límite de atributos a nivel del modelo. Esto resulta de mucha utilidad
para bases de conocimiento corporativas donde se requería la definición de más
atributos.

Descripción
A partir de esta versión el límite de atributos por modelo pasó de 9.999 a 32.767.

Compatibilidad
Si el número de atributos en la base de conocimiento no supera el límite de 9.999,
la base de conocimiento es almacenada igual que en las versiones anteriores de
GeneXus.
En cambio si se superan los 10.000 atributos se almacena en forma diferente el
identificador (ID) de los atributos, quedando incompatible la base de conocimiento
para las versiones anteriores.

Al querer abrir un modelo de la versión GeneXus 7.5 con más de 9.999 atributos
con versiones anteriores da el siguiente error:

Internal error 3 in mdl-c_ie1b


ISAM Error 0- ?-?-?

Truncado de objetos y atributos

Introducción
A partir de esta versión se permite indicar cuantos son los caracteres significativos
para determinan la unicidad de los nombres de los objetos, atributos y tablas.

Descripción
Se agregaron tres nuevas propiedades en el modelo de diseño, las cuales permiten
modificar la cantidad de caracteres que se consideran significativos para identificar
un nombre, ya sea de atributo, objeto o tabla.

74
Figura 27 – Propiedades diseño
Las propiedades son:

Significant Attribute name length determina el largo significativo para los


atributos y los dominios, el valor predeterminado y máximo es 30, y el valor
mínimo es 4 caracteres.

Significant Table name length determina el valor significativo para tablas,


indices y data views, el valor predeterminado y máximo es 30, y el valor mínimo es
4 caracteres.

Significant Object name length determina el valor significativo para


transacciones, work panels, web panels, prompts, menu, menu bar, reportes,
procedimientos, y styles, el valor predeterminado y máximo es 30, y el valor
mínimo es 6 caracteres.

En caso de colocar un valor menor que el mínimo permitido para cada caso muestra
el siguiente mensaje de error:

75
Figura 28 – Error al colocar un valor menor al permitido

Se puede disminuir el valor a cuanto truncar los atributos, objetos y tablas siempre
que no exista ningún atributo, objeto, tabla que tenga los mismos caracteres
significativos. Al realizarlo se presenta el siguiente mensaje de error.

Figura 29 – Error al modificar valores de las propiedades.

Los nombres que no se pueden modificar son los de: Folder, Grupos, Modelos y
Programas externos que tienen TODOS los 30 caracteres significativos.

Nota: La modificación del largo de atributos, tablas e índices no es válida cuando


se utiliza como DBMS el AS/400, y cuando se utiliza DBF para esos casos se deben
seguir utilizando los siguientes valores: tablas e índices 10 y atributos 10.

En el momento de realizar una creación o reorganización donde los largos son


mayores a 10 caracteres aparecen los siguientes mensajes y la tabla no se
crea/reorganiza.

• Problems found on table 'Nombre_tabla' structure. It will not be


created/reorganized.

• Table name 'Nombre_tabla' exceeds maximum name length allowed


by language (10 characters).

• Attribute name 'Nombre_atributo' exceeds maximum name length


allowed by language (10 characters).

Al modificar el largo de los objetos también se está modificando el largo de la


variable PGMNAME. Por más información referirse a Sección específica del
Development Environment.

Consideraciones
• Para SQL Server no pueden utilizarse nombres largos (de mas de 8
caracteres) para objetos si la tecnología de acceso es SQL Embebido
(generador C/SQL).

76
Variables basadas en atributos

Introducción
En el diálogo de definición de variables se agregó un nuevo botón para definir
variables basadas en un atributo.

Descripción
En el diálogo de definición de variables se permite definir una variable basada en
un atributo mediante el botón “Add Based On”.

Figura 30 – Diálogo de definición de variables

Al presionar el botón "Add Based On" aparece la lista de atributos. Seleccionando


uno o más atributos y presionando OK, se define una variable Based-On para cada
atributo seleccionado.

77
Figura 31 – Diálogo de selección de atributos

Nuevas Propiedades de atributos

Introducción
Se agregan nuevas propiedades relacionadas a los atributos GeneXus. En la
ventana de edición de un atributo se agrega un nuevo “Tab” denominado
“Advanced” que permite configurar la descripción que será utilizada en las distintas
interfaces gráficas de los objetos GeneXus.

Alcance
Objetos: Transacciones.
Lenguajes: Todos.
Interfaces: Web, Win.

Descripción
Se agrega un nuevo “Tab” denominado “Advanced” que permite configurar las
siguientes opciones sobre cualquier atributo:

78
• Title: Permite definir la descripción utilizada en las estructuras planas, como
por ejemplo primer nivel de una transacción, descripción de las variables en
los prompts, títulos de reportes generados con el report wizard (primer
nivel).
• Column Title: Permite definir el título asociado al atributo en las columnas
de un subfile.

De esta manera se busca ahorrar trabajo ya que, generalmente, la descripción del


atributo se modifica en la mayoría de los lugares donde aparece, centralizando
dichos cambios en éstas nuevas propiedades.

Por defecto al crear un nuevo atributo, en caso que no se ingrese información en


estas nuevas propiedades se hereda la descripción detallada en la propiedad
“Description” del atributo, mostrando en el Tab “Advanced” la siguiente información
para las dos propiedades “Default: Attribute Description”. En caso que el usuario
modifique las descripciones, dicho cambio será reflejado la próxima vez que el
objeto sea generado. Utilizando la opción podrá volver al valor por defecto.

Este cambio afecta el aspecto visual de la mayoría de los objetos: Transacciones,


Prompts, Web Panels, Work Panels en sus estructuras planas y subfiles así como
también Reportes y Procedimientos.

También se agrega esta información en el listado de atributos:

Figura 32 - Listado de atributos

A continuación se detalla un ejemplo definiendo para una transacción de Artículos


las propiedades del atributo ArtId. En este caso se define el título de la columna
como “Artículo” y el título como “Identificador del Artículo”.

79
Figura 33 - Tab "Advanced" definiendo un atributo

A continuación se detalla el layout obtenido para la transacción “Artículos” y un


work panel asociado “Trabajar con Artículos” donde se da un ejemplo de la
utilización de estas propiedades.

Figura 34 - Título

80
Figura 35 – Título de la Columna

Dominio como array

Introducción
A partir de la versión Solís es posible definir un dominio como “array” (vector) para
cualquier tipo de dato. Hasta ahora, si bien una variable podía ser un array, los
Dominios sólo podían ser escalares.
Esto puede resultar útil para definir vectores de meses, años, etc y tenerlos en un
dominio para “padronizarlos”.

Descripción
Definición de Dominios
En el diálogo de definición de dominios se agregó la sección Dimensions dando la
posibilidad de definir un dominio como array.

81
Figure 1 - Definición de Dominio Array

Variables y otros dominios pueden estar basados en un dominio array, pero no los
atributos debido a que no tienen dimensiones.

A continuación se detallan las diferencias de comportamiento de atributos, variables


y dominios, respecto a si están basados en un dominio array o escalar.

Dominio basado en Dominio.


Cuando se define un dominio (DOM_1) en base a un dominio array (DOM_VEC),
el primero hereda del segundo toda la definición, tanto el tipo de dato (lo que se
hacía hasta el momento), como las dimensiones (filas y columnas). Además DOM_1
no tiene la capacidad para modificar esa información, las mismas quedarán
deshabilitadas. De esta forma, cualquier modificación que se realice en DOM_VEC,
repercutirá automáticamente en DOM_1.

Por otro lado, si el dominio base no es array, llamémosle DOM_ESC, los


dominios basados en él heredan el tipo de dato y además tienen habilitada la
sección Dimensions, de forma tal de poder definir sus propias dimensiones.

Esto permite que se pueda tener un dominio genérico escalar, como por ejemplo,
“Teléfonos” y luego definir el dominio “Teléfonos por cliente” basado en anterior
(infiere el tipo) pero de una dimensión (Filas = 10).

82
En este caso, como DOM_ESC tiene otro dominio basado en él (DOM_2), DOM_ESC
no tendrá habilitada la sección Dimensiones. Esto se debe a que posiblemente
DOM_2 pueda tener a su vez atributos basados en él.

Variable basada en Dominio


Las variables pueden estar basadas en cualquier tipo de dominio (array o escalar).
Las reglas sobre las dimensiones de las mismas son similares al esquema de
dominios:

• Una variable basada en un dominio definido como array, hereda la definición de


dimensiones de dicho dominio sin poder sobrescribirla.

• Una variable basada en un dominio simple puede definirse como array, ya que
pueden definirse filas y columnas para la misma.

Una gran diferencia que tienen con los dominios es que las variables no
deshabilitan la definición del dominio base.

NOTA: Debido a que las variables no son globales, sino que pertenecen a cada
objeto, cuando en el dominio se realiza un cambio, éste se propaga a las variables
en el momento de apertura del objeto (cuando se lee la definición de variables).

Atributo basado en Dominio


Los atributos no tienen dimensiones, por lo tanto, un dominio que es definido como
array, no aparecerá en el combo de dominios del diálogo de definición de atributos.

La definición de un atributo basado en un dominio, impedirá que las dimensiones


del dominio puedan ser modificadas para que éste pase de ser un dominio simple a
array.

Cambio de Dominio Array a Dominio Escalar


Es posible modificar un dominio array a escalar. Los dominios y variables basados
en él no modificarán su condición de array. Esto significa que el cambio de Filas =
10 a Filas = 0 en el dominio base, no se propagará a los dominios y variables
basados, manteniendo la definición de Filas = 10. Esto implica además que se
habilite la sección Dimensions de estos últimos.

Importante: Un dominio array que se modifica a escalar y tiene otros dominios


basados en él, no podrá volver a ser array. Esto es por lo comentado al final de la
sección “Dominio basado en Dominio”)

Cambio de Dominio Escalar a Dominio Array


Como se mencionó anteriormente, si existe un atributo o dominio basados en el
dominio base, éste no tiene habilitada la sección Dimension, por lo tanto el cambio
no es posible (quedarían atributos basados en dominio array lo cual no tiene
sentido). Podría decirse que esta modificación es posible sólo si es un domino

83
“orientado a variables”.

Es importante tener en cuenta que la modificación de la definición del dominio base


afecta a todas aquellas variables basadas en él, sean arrays o no. En el primer
caso, sólo verán sobrescrita su definición de filas y columnas por los valores del
dominio, mientras que en el segundo pasarán además de ser variables escalares a
arrays. Por esto, cuando se modifica un dominio de simple a array se despliega la
siguiente advertencia: “Changes in domain rows and colums will update variable
definition based on it”

La modificación en la definición de una variable a través de este mecanismo puede


producir errores en el salvado de objetos y en la especificación.

Resumen
Dominio Base de tipo Escalar
 Variables, atributos y dominios pueden estar basados en él.
 Atributos y dominios basados en él deshabilitan la sección Dimensión del
dominio base.
 Variables y dominios basados en él pueden modificar su propia definición de
dimensiones.
 Variables heredan los cambios de dimensiones y tipo de datos del dominio
base; los atributos y dominios sólo los cambios de tipo de dato.
 No puede pasar a array si hay atributos y dominios basados en él. Si hay
sólo variables da warning.

Dominio Base de tipo Array


 Variables y dominios pueden estar basados en él.
 No se deshabilitan las dimensiones del dominio base.
 Variables y dominios basados en él no pueden modificar su definición de
dimensiones.
 Se heredan los cambios de tipos y dimensiones.
 Se puede pasa a dominio escalar. Las variables y dominios basadas en él
mantienen los seteos de las dimensiones.

Primary Key

Introducción
Se permite utilizar los atributos integrantes de una clave primaria sin la necesidad
de que se encuentre en el formulario, haciendo la asignación correspondiente en las
reglas.

Alcance
Objetos: Transacciones.
Lenguajes: Todos.
Interface: Win, Web.

84
Descripción
Se levanta la restricción existente donde cada atributo que integra una llave
primaria debe estar en el formulario.

A partir de esta versión no se despliega un error si la lista de atributos esta siendo


asignado en las reglas. En caso que la asignación no se realice en las mismas
aparecerá el siguiente mensaje en el reporte de especificación:

Attribute ( Att ) must be present on the screen or assigned by a rule.

De esta manera se facilita el manejo de objetos que interactúen con las


transacciones, dado que en muchos casos no es necesario o no se desea mostrar la
clave primaria de una determinada tabla.

Ejemplo
Se realiza un work Panel denominado “Trabajar con Artículos” donde se listan la
lista de artículos existentes. Para cada uno de los valores se permite realizar las
siguientes operaciones:

• Alta: Permite ingresar un nuevo registro.


• Modificación: Permite la modificación del registro donde se encuentra
posicionado el cursor del subfile.
• Baja: Permite eliminar el registro actual.
• Ver: Se muestran todos los datos relacionados al artículo seleccionado.
• Cerrar: Cierra el diálogo.

Para cada una de estas opciones se llama a la transacción asociada “Artículos”


determinando para cada uno de ellos el modo (Insert, Update, Delete, Display). En
caso de utilizarse el modo de inserción, cuando el usuario confirma la operación se
llama al procedimiento de numeración automática de artículos.

Para ambos objetos se definieron las siguientes reglas:

85
Figura 36- Reglas relacionadas al Work Panel

Relacionado a las reglas de la transacción:

Figura 37 - Reglas relacionadas a la transacción

Se ejecuta el Work Panel obteniéndose la siguiente salida:

Figura 38 - Work Panel "Trabajar con Artículos

Se presiona el botón modificar sobre el Artículo 1 obteniéndose el siguiente


resultado:

86
Figura 39 - Detalle del "Artículo 1"

87
Comandos
Comando For To Step

Introducción
A partir de esta versión se ha implementado el comando “For To Step” el cual es
útil cuando es necesario iterar cierta cantidad de veces a partir de un cierto valor.

Alcance
Objetos: Transactions, Work panels, Procedures, Reports, Web Panels
Lenguajes: RPG, Cobol, Java, VB, VFP, C/SQL, C#
Interfaz: Win y Web

Descripción
Se ha implementado el comando “For To Step” donde se permite indicar el
comienzo y el fin del bucle, indicando cual es el salto.

La sintaxis es la siguiente:

FOR &Var = <inicio> TO <fin> [STEP <salto>]


....
ENDFOR

<inicio>, <fin> son expresiones numéricas.


<salto> es una constante.

Es un bucle desde el valor <inicio> de &Var mientras que &Var sea <= que
<fin>, el mismo se incrementa de a <salto>. El valor por defecto de <salto> es
1. El valor de <salto> puede ser negativo.

Comando Submit

Introducción
Hasta la versión 7.0 de GeneXus, el comando submit se utilizaba en ambiente
Windows para lanzar un proceso en forma asíncronica en el AS/400.
A partir de la versión 7.5 se agrega la posibilidad de utilizar este comando para
someter procesos, tanto en ambientes Win como en ambites Web.

88
Alcance
Objetos: Reportes, Procedimientos
Lenguajes: C/SQL – C# - Visual Basic - Java (en próximas versiones)
Interfaces: Win - Web

Descripción
El comando Submit, permite ejecutar programas en forma asíncronica, la sintaxis
es la siguiente:

Submit(‘Proceso’,’SubmitParms’[,<Parm1>, … ,<ParmN>])

Proceso
Es el nombre del programa a llamar. Puede ser un objeto GeneXus o un programa
externo. Los objetos válidos dentro de GeneXus son reportes y procedimientos que
no tengan salida. Este parámetro debe ir entre comillas simples.

SubmitParms
Se utiliza para indicar ciertos parámetros referentes a la ubicación, usuario,
contraseña que utilizará el proceso invocado.
Este parámetro es utilizado unicamente en ambiente Win, por el momento es
ignorado por todos los generadores.

Parm1 … ParmN
Son los parámetros que recibe el programa a llamar, los mismos pueden ser
atributos o variables. No se soporta el pasaje de expresiones o constantes. Es
recomendable verificar que la definición de cada uno de los parámetros coincida
con los tipos de datos del programa.

Consideraciones Generales
El procedimiento o reporte llamado con el comando Submit, debe se main y tener
configurada la propiedad ‘Call protocol’ con el valor ‘Command Line’.
Esto se debe a que el llamado con el comando Submit se traduce como el llamado a
un exe.

Consideraciones específicas para el generador Visual


Basic
Si se trabaja con el generador Visual Basic, y el procedimiento llamado mediante el
comando submit, se encuentra en un directorio diferente al directorio de la
aplicación (exe o dll), al poner en producción la aplicación se debe generar un
archivo con extensión INI para indicar la ubicación del procedimiento.

El archivo se debe llamar igual que el nombre del main (exe para aplicaciones Win
y dll para aplicaciones Web) que realiza la llamada mediante submit, y se debe
crear una sección llamada [GxFiles] con la entrada:

89
SubmitPath=<Camino donde está el exe>

Si se tiene más de un objeto main que realiza submit, se debe generar un INI por
cada uno.
El camino debe terminar con \.

Si el llamado se realiza desde un Web Panel y no se encuentra el procedimiento se


produce el siguiente error:

Error Type:
HLLAMO_WebObj (0x800A0035)
File not found
/cgi-bin/hllamo.asp, line 13

Page:
POST 25 bytes to /cgi-bin/hllamo.asp

POST Data:
BUTTON1=Enter&sCallerURL=

Ejemplo:
Se tiene un objeto main llamado Prueba que realiza un submit a un
procedimiento llamado Proceso.
Cuando se pone en producción la aplicación, suponiendo que el exe procedimiento
(proceso.exe) se encuentra en el directorio c:\archivos se debe crear el archivo
prueba.ini con la siguiente información:

[GxFiles]
SubmitPath=’c:\archivos\’

Ejemplos
En el siguiente ejemplo se utiliza el comando submit para llamar a un programa
denominado ‘Prog’ pasándole como parámetros &A y &B.

Event ‘UsrEv’
Submit(‘Pprog’,’’,&A, &B)
Endevent

90
Reglas

Regla Prompt On

Introducción
A partir de esta versión se permite 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
Lenguajes: Java, C/Sql, Visual Basic
Interfaz: Web

Descripción
La regla PROMPT permite especificar (opcionalmente) el nombre del control que
activa la llamada a un determinado prompt.

La sintaxis pasa a ser la siguiente:

Prompt( <program>, [p1, ] ... pn) [on <control>];

En caso de omitirse on <control> se agregará (en los ambientes que


corresponda) una imagen, botón, etc. a la derecha del o los campo(s) que tienen
prompt, como hasta ahora.

Cuando se especifica on <control> se utilizará el control referenciado. Los


controles posibles son aquellos que tengan la propiedad link (TextBlock, Imagen,
etc).

Al utilizarse esta regla se mostraran en el diagrama de navegación los prompts


utilizados.

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.

91
Msg y error con expresiones

Introducción
Las reglas MSG y ERROR y el comando MSG permiten como parámetro una
expresión, y no solamente un string o variables como en versiones anteriores.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Reportes, Procedimientos.
Lenguajes: Java – Visual Basic – Visual Fox – C/SQL.
Interfaces: Web Form, Win Form.

Descripción
Tanto las reglas MSG y ERROR (utilizadas para enviar mensajes de advertencia y
error al usuario respectivamente) como el comando MSG permiten tener
expresiones como parámetros de las mismas. La expresión debe ser de tipo
Character.

De esta forma es posible escribir, por ejemplo, reglas del tipo:

Error(Str(A));
Error(Concat(Concat('El valor' , Str(A*2/100)), ' no es correcto') ) IF A >= 10;
Msg(Concat('Valor de B: ' , B));
Msg(Concat('Fecha Ingresada: ', DtoC(C)) );
Msg(Concat('Fecha Hora Ingresada ', TtoC(D)) );

Donde A es de tipo Numeric, B de tipo Character, C de tipo Date y D de tipo


Datetime.

Esto simplifica la programación y puede resultar muy útil para depurar secciones de
código, debido a que no se requiere el uso de variables auxiliares para asignar
funciones y/o expresiones de tipo Character.

Definición de parámetros de IN y OUT

Introducción
Históricamente, en GeneXus los parámetros siempre fueron de Entrada/Salida. Esto
simplificaba la programación y además se correspondía con los lenguajes en los que
se estaba generando.
El objetivo de esta funcionalidad es poder indicar el tipo de pasaje de los
parámetros.

92
Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: Java, Visual Basic, Visual FoxPro
Interfaz: Web, Win

Descripción
Esta funcionalidad permite definir el tipo de pasaje de parámetros, pudiendo elegir
entre uno de los siguientes valores: entrada (in), salida (out) o entrada/salida
(inout). El valor por defecto será inout.

La definición del tipo de pasaje de parámetros permite, por un lado, una mejor
especificación de la semántica de las interfaces, y por otro lado, permite optimizar
el pasaje de parámetros de las aplicaciones de acuerdo a la arquitectura en la que
éstas se implementan. En la mayoría de los lenguajes es más eficiente pasar por
referencia que por valor. Pero en Java, por ejemplo, los parámetros solo se pueden
pasar por valor, por lo que para lograr la funcionalidad de pasarlos por referencia
es necesario hacer conversiones de parámetros, lo cual puede redundar en un
overhead importante. Por otro lado, cuando se está ejecutando en forma distribuida
(Java, C/SQL, DCOM, etc), la utilización de parámetros del tipo out tiene la ventaja
de que no es necesario enviar dicho parámetro en la invocación. En cambio si los
parámetros se definen de inout implica que hay que pasar todos los parámetros.
Esto tiene como consecuencia que se envíen más bytes de los necesarios, lo cual es
bastante inconveniente, especialmente en entornos tales como Internet.

Sintaxis
REGLA PARM

En la regla parm se dispone de un nuevo indicador para especificar como será el


pasaje de los parámetros. Ejemplo:

parm( out:&par1, in:&par2, &par3)

En este ejemplo estamos indicando que el parámetro &par1 será de salida, el


parámetro &par2 será de entrada, y el tercero (&par3) será de entrada/salida
puesto que éste, es el valor por defecto.

Consideraciones Generales
Programas llamados como UDP/UDF
En los programas que son llamados con UDP o con UDF, el valor por defecto varía
de generador en generador. En los generadores: Java, Visual Basic, Visual FoxPro,
Fox Pro for Windows y Xbase, el valor por defecto es inout para todos los
parámetros, comportamiento que puede ser modificado por el usuario mediante la
definición del tipo de pasaje. Mientras tanto, en el resto de los generadores (Cobol,
RPG, C/SQL) el valor por defecto es in para todos los parámetros, salvo el último

93
que es de tipo out, y cualquier definición del tipo de pasaje, por parte del usuario,
es ignorada por el generador.

Asignaciones a parámetros definidos como in


El especificador no dejará especificar un programa que asigne valores (en
reglas/source/eventos) a parametros definidos como In.

Consideraciones
 No funciona el indicador in con parámetros del tipo Array.
 Un parámetro definido como In puede ser pasado como parámetro a otro
programa donde esté definido como Out o InOut. La especificación no esta
controlando este caso pero es considerado un error y será validado en
futuras versiones.

94
Objetos

Fechas y Versión del Objeto

Introducción
Hasta la versión 7.0 no se distinguía en un objeto entre la fecha de modificación y
fecha de consolidación. Esto hacía que cuando un objeto era consolidado, la fecha
de modificación o edición del mismo se sobrescribiera con la fecha de consolidación,
perdiendo de esta forma información acerca de su fecha de actualización real.

A partir de esta versión se mantiene, en la KB destino, la fecha de modificación del


objeto de la KB origen, y se agrega además la fecha de consolidación al mismo.
Esto permite, entre otras cosas, saber si un objeto fue modificado luego de la
consolidación, evitar consolidar objetos más viejos y poder realizar comparaciones
reales entre objetos de diferentes Bases de Conocimientos.

Otra información que se agregó al objeto a partir de esta versión de GeneXus es la


versión con que fue salvado el mismo. Esto permite determinar al abrir una una KB
o modelo si tiene objetos de versiones más nuevas de GeneXus.

Descripción
Versión del objeto
A partir de la versión 7.5. al salvar un objeto se graba junto con la información del
mismo la versión de GeneXus con que fue salvado. Esto permite dar un mensaje
más amigable al abrir el objeto con una versión más vieja que la que fue salvado.

En el “Open KB” se avisa si hay algún objeto salvado con una versión más nueva
con la siguiente advertencia:

Warning: Some objects in this Knowledge Base were saved with a GeneXus NEWER
version (<version>), that cannot be open with this version.
Do you want to open the Knowledge Base anyway?

El mismo control se realiza cuando se abre un modelo ya que puede haber modelos
congelados que no tienen ningún objeto salvado con una versión más nueva.

Fechas del objeto


Cada objeto de la base de conocimiento posee las siguientes fechas:
 Fecha de Creación
 Fecha de Modificación
 Fecha de Consolidación
 Fecha de Especificación

95
La Fecha de Creación se almacena al crear un nuevo objeto. Entiéndase por crear
un nuevo objeto cuando se hace New Object o cuando se consolida un objeto en
una KB que no existe.

La Fecha de Especificación es la que se graba al momento de especificar un objeto.

Cuando el usuario actualiza un objeto se actualiza la Fecha de Modificación con la


fecha del momento. Si se consolida un objeto, se mantiene en la KB origen la
Fecha de Modificación del objeto (*) y se graba además la Fecha de la
Consolidación.

Estas fechas se pueden consultar en el Browser y List Object.

(*) No se consolida la fecha de la última modificación de los Folders, ya que éstos


tienen como fecha de modificación la del objeto más recientemente modificado
dentro del mismo.

FECHA DE MODIFICACIÓN
Una de las cosas que permite el mantener la fecha de modificación en la
consolidación es evitar sobrescribir objetos más nuevos. Para esto se agregó en el
diálogo de consolidación del Knowledge Manager la opción:
Do Not Overwrite Newer Objects

Si la opción está marcada y un objeto que se consolida tiene en el archivo de


exportación, una fecha de modificación anterior a la fecha de modificación en la KB
destino, el objeto no será consolidando mostrando el siguiente error en el Log de
consolidación:

Figura 9 - Control de Fecha de modificación

Si la opción no se encuentra marcada, para esos objetos simplemente se mostrará


una advertencia y el objeto será consolidado; quedando los mismos con fecha de

96
actualización igual a la de la KB origen.

IMPACT OBJECT
En el diálogo de Impact Object es posible ver los objetos que tengan igual fecha de
modificación pero difieran en la fecha de consolidación. Para esto se agregó la
opción “Equal but different consolidation date” en los filtros de dicho diálogo (ver
siguiente figura).

TIME ZONE
IMPORTANTE: Para que el control de fechas antes mencionado pueda realizarse
adecuadamente, es necesario tener correctamente configurado el ‘TIME ZONE’ de
Windows en los PC origen y destino.

Todas las fechas de los objetos se almacenan en la KB con la fecha/hora


"coordinated universal time" UTC (antiguamente llamada GMT o Greenwich
Mean Time).

Esta característica permite enviar una KB o una exportación de un País a otro (o


simplemente máquinas con diferente Time Zone) y mantener correctamente las
fechas. A modo de ejemplo, esto significa que un objeto salvado a las 10:00 de
Uruguay en realidad se salva con hora 13:00, y si se envía el objeto o la KB a
España mostrará que el objeto fue modificado a las 14:00.

Si no se tiene correctamente configurado el Time Zone puede suceder que el objeto


no pueda ser consolidado, dando el error de que la fecha de actualización es menor
a la actual, o sea consolidado dejándole una fecha de modificación incorrecta.

Compatibilidad
• Lo siguiente aplica a la primer consolidación en GeneXus 7.5 de objetos que

97
hayan sido consolidados con versiones anteriores de GeneXus:

Es importante recordar que las consolidaciones con versiones anteriores


modificaban la fecha del objeto con la fecha de la consolidación. Si se vuelve a
exportar un objeto que no ha sido modificado desde la ultima exportación, al
consolidar (ahora con la versión 7.5 o superior) sobre la misma KB destino con
la opción “Do not overwrite newer objects” marcada, dará el mensaje de error
de que el objeto no puede ser sobrescrito con una versión más vieja. Esto se
debe a que la nueva fecha de modificación del objeto no coincide con la de al
KB original (porque es la de la ultima consolidación).

Se puede ignorar el error si el objeto no fue modificado desde la última


distribución. Ahora, si el objeto fue actualizado entre la distribución y
consolidación anterior, entonces se deberá desmarcar la opción “Do not
overwrite newer object” para actualizar los cambios en la KB destino.

• Los archivos de exportación de versiones anteriores (XPW) exportaban la fecha


de modificación con la fecha local, por lo que si se consolidan en otra Time Zone
quedarán con fecha errónea.

98
Ambientes

Definición de ambientes en un modelo

Introducción
Se ha modificado el diálogo de definición de Modelos (Model Properties) en la
versión 7.5 para facilitar la definición de modelos en base a ciertas características
que tendrá el mismo, como ser, lenguaje a utilizar, tipo de interface y DMBS.

Descripción
Al crear un nuevo modelo o editar uno existente aparecerá el siguiente diálogo para
definir las propiedades del mismo:

Figura 10 - Definición de Modelo

Cada Modelo tiene un ambiente principal, que se usa para la creación y


reorganización de la base de datos y como ambiente por defecto para la generación
de la aplicación. Además puede tener varios ambientes secundarios que se definen
en el tab de Environments

El ambiente principal es el que se define en esta pantalla de Model Properties (tab


General, sección Environment) e incluye los siguientes campos para la definición
del mismo:

99
Language
User interface
DBMS

En Language aparece un combo con todos los lenguajes soportados por GeneXus,
estos son: C#, C/SQL, Cobol, Java, RPG, Visual Basic y Visual FoxPro, Xbase for
DOS.
Luego de elegir el lenguaje, el usuario podrá seleccionar el tipo de interface que
desea utilizar para el ambiente principal (Win o Web Form) y el DBMS. Los valores
disponibles para User Interface y DBMS dependen del Lenguaje seleccionado. A
continuación se muestra una tabla con los valores posibles para cada lenguaje.

Language User Interface DBMS


C# Web Form DB2 Common Servers
C/SQL DB2/400
Informix
Oracle
SQL Server
Java Web Form Claudscape
Win Form DB2 Common Servers
DB2/400
Informix
Oracle
SQL Server
Visual Basic Web Form Access
Win Form DB2 Common Servers
DB2/400
Informix
Oracle
SQL Server
Visual FoxPro Win Form DBFCDX
DBFIDX
DB2 Common Servers
DB2/400
Informix
Oracle
SQL Server
Cobol/400 Win Form AS/400 Native
RPG/400
XBase for DOS Win Form DBFCDX
DBFIDX

En el tab Environments existen tres columnas con: ambiente, lenguaje e interface.


Los tipos de ambiente Default y Reorg heredan por defecto la información del tab
General, pero es posible cambiar el lenguaje y form del ambiente Default, así como
agregar nuevos tipos de ambientes. Por ejemplo, la siguiente figura muestra un
modelo Visual Basic “Win” al que se le agrega un nuevo tipo de ambiente “Web”
para la generación de objetos Web.

100
Figura 11 - Ambientes de un modelo

¿En qué ambiente se generan los objetos?


Si el objeto es main se genera en el ambiente asociado a dicho objeto al definirlo
como main.
Si el objeto no es main, se genera en los ambientes de los mains que lo llamen. Por
ejemplo, una Transacción con form Win y Web, será generada en ambiente Web si
es llamada por un Web Panel y/o en ambiente Win si es llamada por un Work Panel.
En cualquier otro caso el objeto se trata de generar usando el Default Environment.

Si el objeto no se corresponde con ese ambiente, por ejemplo si se tienen Web


Panels en un ambiente Full Win, el objeto no se especifica y en la navegación se
muestra la siguiente advertencia: “This object cannot be generated on this
environment.”Por otro lado, si un programa hace un call a otro que no puede ser
generado se emite el siguiente error de especificación: “Call to program %1 that
cannot be generated found at line %2”. Por ejemplo, si una transacción generada
con el generador Java Win llama a un Web Panel, como el Web Panel tiene que
generarse con un generador Web y no existe dicho generador, se produce el error.

PROMPT
Un Win Prompt (Web Pompt) se genera, en Prototipo o Producción, sólo si se
especifica una transacción que lo utilice. Esto quiere decir que exista una
transacción que sea generada en ambiente Win (Web).
Cuando algún modelo tiene Win y otro Web forms se tienen ambos prompts en
diseño.

101
¿Cómo se generan los objetos Web?
Debajo del directorio del modelo (DataXXX) se crea un directorio Web que es
donde se guardan todos los objetos generados en ambiente Web.

En el caso de las aplicaciones Visual Basic que usan base de datos Access, en el
directorio Web sólo se guardan los objetos Web, no la base de datos. La
GX_DATA.MDB se continúa generando en el directorio del modelo DataXXX, los
objetos Web acceden a este directorio para tomar los datos.
Es por esta razón que se recomienda utilizar la preferencia a nivel de modelo “Local
Database File” para indicar la ubicación de la base de datos (absoluta o relativa),
porque sino al poner en producción una aplicación Web no se encontrarán los datos
(porque se buscarán en el directorio “padre” del objeto no en el directorio actual).

F5 – Run
En el diálogo de ejecución (Run) se puede filtrar la lista de programas a
compilar/ejecutar por ambiente.

Compatibilidad con versiones anteriores


En la 7.0 para poder generar Web Panels se tenían que definir todos como main. Al
pasar a la 7.5, ya no es necesario tenerlos como main, pero se mantiene el check
de main en todos esos objetos.

Además, para el caso de VB y Java, el ambiente que se define por defecto al abrir
la KB con la 7.5 es con interfaz Win. Esto haces que todos los Web Panels estén
marcados como main pero sin generador asociado, y el combo para seleccionar
un generador está vacío dado que no hay un ambiente Web definido (porque no
existía en la 7.0). La solución en este caso es modificar las opciones de estos
objetos para asociarle el ambiente correspondiente. Para esto, se recomienda hacer
lo siguiente:
Si la mayoría de los objetos main de la aplicación se generan en ambiente Win, se
deja el ambiente Default con User Interface Win, se crea un ambiente secundario
Web y se asocia este ambiente a los Web Panels (Information->Option->Generated
for). Es posible eliminar la propiedad Main a aquellos que no lo requieran.

Por el contrario, si la interface de la mayoría de los objetos main es web, se cambia


el User Interface del ambiente Default a Web, se agrega un ambiente secundario
Win y se modifica el Information de los objetos Win.

Si en algún caso no se corresponde el ambiente con la interfaz del objeto, esto será
indicado en la navegación del mismo con la siguiente advertencia:
“This object cannot be generated on this environment.”

102
Help

HTML Help

Introducción
A partir de esta versión se cambia la forma de generación de la ayuda, para pasar a
generar en formato HTML. Este mecanismo permite la definición de ayuda para
aplicaciones en el Web. Además se incorpora la posibilidad de empaquetar toda la
ayuda generada en un único archivo de formato CHM, con todas las características
que esto acarrea como son la posibilidad de buscar en la ayuda generada, definir
índices, etc.

Alcance
Lenguajes: Java – Visual Basic – Visual Fox Pro – C/SQL –C#
Interfaces: Win - Web

Descripción
Se definen un nuevo esquema de ayuda, en el que se permite seleccionar entre
dos formatos: CHM y HTML.
En esta versión, se genera por cada objeto/atributo/variable un documento HTML
que contiene el texto de ayuda definido en GeneXus para el mismo. En ambos
casos se genera un directorio HELP bajo el directorio del modelo, en el que se crea
un archivo extensión HTML por cada objeto/atributo/variable que tenga ayuda.
En el caso de CHM, se crea además un archivo de nombre APPHLP.CHM en el
directorio del modelo.

CHM

Además de los archivos HTM, se maneja un archivo de definición de proyecto (de


extensión HHP), utilizado por el compilador del HTML Help Workshop para la
generación del CHM.

HTML

La principal característica de este formato es el poder generar ayuda que no sea


compatible solo con la plataforma Windows GUI.
De esta manera se abrirá un browser con el HTML correspondiente a la ayuda.
Esto es especial importancia para aplicaciones Web.

103
Definición de Ayuda
En GeneXus existen dos instancias de ayuda, la ayuda a nivel de objeto
(Transacción, Work Panel, etc) y la ayuda de los distintos atributos/variables dentro
de estos.

Para definir la ayuda de un objeto, se debe hacer seleccionar la Tab Page HELP del
objeto.

En dicha página se presenta el editor de HTML, similar al editor utilizado para


realizar los objetos Web.

La ayuda a nivel de atributo/variable/dominio se definen el dialogo de


creación/edición de estos, en la TAB Page correspondiente, se cuenta con un editor
HTML de atributos/variables/dominios con este fín..

Generación de la Ayuda
La opción para generar el help de objetos/atributos GeneXus se encuentra en la
barra de herramientas, bajo el item Build.

Al seleccionar la generación de menú se habilita un wizard, el que permite


inicializar algunas propiedades sobre el archivo que contendrá el help de la

104
aplicación.
El wizard consta de tres pasos

Paso 1

En el primer paso se definen:


• El tipo de help que se quiere generar.
• El compilador que ha de utilizarse para generar la aplicación.

Type of Help

Existen dos formas: CHM y WEB. La principal diferencia entre ambos es que para la
generación WEB no se requiere el uso de un compilador, simplemente se generan
los archivos HTML correspondientes a cada ayuda de objeto.
CHM
La elección de esta opción implica tener un compilador de ayuda HTML, a través del
cual generar el archivo APPHELP.CHM utilizado luego por la aplicación GeneXus.

El compilador con el que se ha trabajado es el HTML Help Workshop, que se


encuentra en el CD del Visual Studio 6.0, bajo el directorio HTMLHelp.

La ayuda generada se presenta en un único archivo de formato CHM, donde cada


objeto/atributo/variable con ayuda aparece como un ítem del contenido.

105
HTML
La principal característica de este formato es el poder generar ayuda que no sea
compatible solo con la plataforma Windows GUI.

En este caso no se requiere de un compilador, simplemente se generarán los


archivos HTM.
De esta manera se abrirá un browser con el HTML correspondiente a la ayuda.

Help Compiler Path

Ubicación del compilador del HTML Help Workshop.


En el caso de la generación WEB este campo es deshabilitado; pero en caso de la
generación CHM debe especificarse el mismo, o en caso contrario no podrá seguir
avanzándose en la aplicación.

Paso 2
Define opciones que modifican propiedades del archivo de definición del proyecto.

106
Project Settings
Define opciones que modifican propiedades del archivo de definición del proyecto.
Estas opciones aplican sobre todo para el caso de generar un archivo CHM o
utilización de un activeX o componente Java para el Web. Solo aplica si se
seleccionó CHM en el paso 1.
INCLUDE FULL-TEXT SEARCH
Habilita la posibilidad de realizar búsquedas de texto sobre todos los documentos
que conforman el CHM. Esta opción no es válida si se está generando para el Web.

DEFAULT HTML PAGE


La página por defecto es aquella Definición de la página HTML por defecto, aquella
página que se muestra cuando no se ha especificado algún tópico en particular por
defecto cuando no se ha seleccionado ningún tópico de la ayuda.
La aplicación generación de help crea genera una página por defecto pero cuyo
contenido es muy simple. El usuario puede de esta forma se puede definir una
página propia y utilizarla.

CUSTOM CONTENTS
Al igual que la página por defecto, también se genera un archivo de contenido. El
archivo de contenido define una estructura de árbol que permite organizar los ítems
dentro de la ayuda.
En GeneXus no hay forma de indicar como agrupar los ítems de la ayuda, así que
por defecto se genera una raíz del árbol, de la que cuelgan todos los tópicos de
ayuda. Los únicos ítems que aparecen anidados es en el caso de las variables que
poseen ayuda, en ese caso estos ítems aparecen anidados debajo de la ayuda del
objeto en el cual están definidas.
Este archivo de contenido puede editarse con el HTML HELP Workshop y de esta
forma crear un árbol mejor organizado personalizado. Si ese archivo es salvado con
otro nombre, puede utilizarse en esta opción en vez de generar el archivo por
defecto.

107
CUSTOM INDEX
Idem al archivo de contenido, pero para el archivo de definición del índice.
En el caso del archivo de índice, puede utilizarse el HTML HELP Workshop para
darle un orden alfabético a los ítems.

Paso 3
Compilación de la ayuda.
Este paso solo es valido válido si se genera la ayuda en formato CHM, en caso de
generar HTML, el proceso termina en el paso 2.

El HTML Help Workshop presenta una herramienta para la edición de los archivos
anteriormente descritos (cuya interfaz es la siguiente figura).Se abre el HTML Help
WorkShop para compilar la ayuda generada.

Se inicia el proyecto en el que se muestran todos los archivos que se incluyen así
como la configuración del mismo.
Se debe compilar el proyecto por medio del botón o la opción Compile del ítem
File del menú. Esto genera un archivo llamado APPHLP.CHM en el directorio del
modelo.

108
Consideraciones generales
• La ayuda se define a nivel de modelo, prototipo/producción.
• Cada vez que se genera la ayuda, se sobrescriben TODOS los archivos htm
(aunque no hayan sido modificados).
• No se borran archivos HTM. Si se renombran objetos/atributos/variables,
quedan creados los documentos con los nombres anteriores.
• Los documentos HHP, HHC, HHK se sobrescriben si son default (es decir, si
no son personalizados).
• Existe un documento con ciertos TIPS sobre el HTML Help Workshop, como
son agregar botones, poder visualizar un CHM desde un browser, etc.
• En el caso de procedimientos y reportes con protocolo SOAP, la ayuda es
anexada en el WSDL del mismo, mas detalles en la documentación de SOAP

Consideraciones específicas de Aplicaciones WEB


En caso de trabajar con aplicaciones Web, se asocia al evento predefinido “HELP” la
ayuda del objeto. Esto quiere decir que al disparar el evento “HELP” en un objeto
Web se va a mostrar en una nueva ventana del browser la ayuda en formato HTML
del mismo.
El evento “HELP” puede ser asignado a un botón o a una imagen.

Para incluir ayuda en una aplicación Web, debemos generar la misma como HTML,
ya que los browser por defecto no pueden interpretar el formato CHM.
Para indicar el directorio donde se ubican los archivos de Ayuda (HTM) se creó la
preferencia del modelo Help Files Base URL, bajo el grupo Web Information.

En dicho directorio, que puede indicarse absoluto o relativo, se deben colocar los

109
archivos de ayuda generados en formato HTM correspondiente a cada objeto (no se
tiene en cuenta la ayuda a nivel de variables/atributos)
La ayuda se maneja a nivel de JavaScript, por lo que se debe tener en el directorio
de la aplicación (o de archivos estáticos en el caso de Java) el JavaScript
gx_help.js .

Consideraciones específicas para el generador Java


En el caso de Java es posible generar la ayuda en archivos HTML para aplicaciones
GUI, ya que el CHM no es multiplataforma
Por este motivo se han instrumentado un conjunto de propiedades:

Help Mode
Esta preferencia define que tipo de ayuda van a utilizar las aplicaciones, es
independiente de cómo se realice la ayuda.

Windows HTML Help


Si se va a generar la ayuda como CHM
Web HTML Help
Si se va a generar la ayuda como HTML

110
En el caso de tener esta última seleccionada se habilita la siguiente
preferencia:

WebHelp base URL


Define la URL base donde se van a buscar los HTML de la ayuda.

Ayuda y Documentación HTML para


atributos/dominios/variables

Introducción
Al definir atributos, variables o dominios, se permite agregarles tanto sea ayuda
como documentación HTML, con este fin existen opciones de edición de formato
HTML en el dialogo de definición de los mismos.

Alcance
Lenguajes: Java – Visual Basic – Visual Fox Pro – C/SQL –C#
Interfaces: Win - Web

Descripción
Al definir un atributo, dominio o variable, en los TAB page Help y Documentation se
encuentran opciones de edición del formato HTML.

111
Opciones de edición
1. Tipo de fuente

Se habilitan todos los tipos de fuente instalados en el sistema.

2. Tamaño de la fuente

Los valores válidos son del 1 al 7, el tamaño real que se aplica a la fuente para
cada uno de estos valores está definido por el Internet Explorer.

3. Formato de párrafo

La lista de formatos es fija. Son válidos los siguientes valores:


• Normal
• Heading 1
• Heading 2
• Heading 3
• Heading 4
• Heading 5
• Heading 6

112
4. Negrita, Itálica y Subrayado

5. Color

6. Listas ordenadas y Listas

7. Decremento e Incremento de sangría del párrafo

8. Justificación a la izquierda, centrada y a la derecha un párrafo

9. Visualización de detalles

10. Inserción de imágenes

Se habilita un diálogo a través del cual se especifica la ubicación de la imagen


que desea incorporarse en el documento. Este nuevo diálogo es propio del
ActiveX que manipula el documento HTML (es decir que no corresponde a
GeneXus).

11. Edición del documento HTML en formato texto

Se habilita un nuevo diálogo donde puede modificarse el documento HTML a


través de un editor de texto. Los cambios introducidos en dicho diálogo se
reflejarán en la vista HTML cuando se acepten los mismos.

Esta es una opción a través de la cual se pueden incorporar otros elementos al


documento que no están habilitados a través de los botones o shortcuts
definidos (como puede ser la definición de una tabla).

Shortcuts
1. Selección de todo el documento (Ctrl + A)
2. Copiar (Ctrl + C)
3. Pegado (Ctrl + V)
4. Cortar (Ctrl + X)
5. Búsqueda de texto (Ctrl + F)
6. Deshacer (Ctrl + Z)
7. Rehacer (Ctrl + Y)
8. Negrita (Ctrl + N)
9. Itálica (Ctrl + I)

113
10. Subrayado (Ctrl + U)
11. Borrar (Supr or Delete)

114
Tipos de Datos

Nuevos Tipos de Datos


En esta versión se incluyen nuevos tipos de datos para la definición de
variables.
Estos nuevos tipos son:
WebWrapper
WebSession
ExcelDocument
WordDocument
XmlWriter
XmlReader
MAPISession
OutlookSession
POP3Session
SMTPSession
MailRecipient
MailMessage
HttpRequest
HttpResponse
HttpClient
DBConnection
Location

Con esta implementación se pasa a un modelo de objetos y se pueden


crear desde GeneXus variables que tienen como tipo estos objetos,
configurar sus propiedades y ejecutar sus métodos en vez de realizar
llamados a funciones externas.

Tipo de Datos DBConnection

Introducción
El objetivo del tipo de datos DBConnection es permitir que las opciones de
configuración para las conexiones ODBC a la base de datos puedan ser
determinadas en tiempo de ejecución.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Reportes, Procedimientos.
Lenguajes: Visual Basic – Visual Fox – C/SQL.
Interfaces: Web Form, Win Form.

115
Descripción
Para poder modificar las opciones de configuración de los diferentes datastores en
tiempo de ejecución desde un objeto GeneXus, se debe definir una variable del
tipo de datos DBConnection y luego invocar a los métodos y propiedades
necesarios.

Propiedades:
DatastoreName

Indica el datastore GeneXus que esta asociado a la variable. El valor es de


tipo carácter.

Esta propiedad es solo de lectura, para asignar un datastore a la variable, se debe


utilizar la función GetDatastore(), por ej:

&MyConn = GetDatastore(“Default)

ODBCDatasourceName

Asocia un nombre de datasource a la conexión. Es válido solamente cuando


el datastore asociado utiliza un datasource para conectarse. El valor es de tipo
carácter.

ODBCFileDatasourceName

Asocia un nombre de datasource de archivo a la conexión. Es válido


solamente cuando el datastore asociado utiliza un datasource de archivo para
conectarse. El valor es de tipo carácter.

ODBCDriverName

Asocia un nombre de driver a la conexión. Es válido solamente cuando el


datastore asociado utiliza un driver para conectarse. El valor es de tipo carácter.

UserName

Asocia un usuario a la conexión. El valor es de tipo carácter. La propiedad


debe contener siempre el mismo valor que el retorno de la funcion userid('server').
Esto es cierto inmediatamente luego de realizada la conexión y hasta que el
programador eventualmente cambie su valor, en ese caso el valor podrá ser
diferente hasta que se ejecute el método Connect().

UserPassword

Asocia una contraseña a la conexión. El valor es de tipo carácter.

116
ConnectionData

El contenido de esta propiedad se concatena al string de conexión que


GeneXus genera a partir del resto de las propiedades. Se utiliza normalmente para
especificar parámetros adicionales para la conexión, por ejemplo la base de datos.
El valor es de tipo carácter.

ShowPrompt

Indica si se mostrará el diálogo al realizarse la conexión. El valor es de tipo


numérico. Los valores posibles son:

1 Siempre se muestra el diálogo de conexión


2 Nunca se muestra el diálogo
3 Se muestra el diálogo si es necesario, es decir si faltan datos para
que la conexión sea posible.

ErrCode

Devuelve el código del último error. El valor es de tipo numérico. Los


códigos de error se describen mas adelante.

ErrDescription

Devuelve la descripción del último error. El valor es de tipo carácter.

Métodos:
Connect()

Se realiza la conexión al datastore asociado. El valor que devuelve es de tipo


numérico, y es cero en caso de éxito. En caso de error devuelve el código
del mismo.

Este método no da error sobre una conexión abierta, simplemente la conexión


se cierra y se vuelve a abrir con los nuevos valores.

Disconnect()

Se realiza la desconexión al datastore asociado. El valor que devuelve es de


tipo numérico, y es cero en caso de éxito. En caso de error devuelve el
código del mismo.

Este método no da error si es utilizado en un programa que esta

117
generado con la preference "Connect at first request" y la
conexión aun no se hizo.

Códigos de Error:

 

     
0 No Error No hubo error.
1 Unknown Error Error no conocido, puede ocurrir cuando
se pide la descripción de un código de
error que no existe.
2 No GeneXus Datastore Se uso un método o propiedad sobre
attached una variable que no tiene asociado un
datastore. Se soluciona asignando
previamente la propiedad
DatastoreName.
3 Internal Error: Function El método o propiedad recibió un error
call failed comunicando un valor al acceso a datos.
Normalmente se debe a un valor de
parámetro no válido o fuera de rango.

Ejemplo
A continuación se detalla un ejemplo de utilización en un objeto GeneXus:

Variables

&MyConnection tipo DBConnection

Comienza Fuente GX

&MyConnection = GetDatastore("default")

&MyConnection.Disconnect

&MyConnection.UserName = "Administrador"

&MyConnection.Password = "Adm!Password"

&MyConnection.ShowPrompt = 2

&MyConnection.Connect

Fin Fuente GX

118
Consideraciones generales

• Solo esta implementado cuando se utiliza tecnología de acceso a datos


ODBC (para el caso del generador C/SQL, la preferencia “C/SQL Access
Method” deberá tener dicho valor).

• Se debe tener en cuenta que los métodos Connect()/Disconnect() cierran los


cursores que estén abiertos en la conexión a la que aplican.

Por lo anterior, no es posible ejecutar los métodos Connect() y/o


Disconnect() dentro del alcance de un comando For each.

Es responsabilidad del desarrollador utilizar la conexión/desconexión en


lugares correctos. Por ej. si se realiza la desconexión en la mitad de un
procedimiento, probablemente la ejecución cancelará. También existe la
posibilidad de que continúe trabajando si el procedimiento se reconecta,
pero en todo caso los resultados son impredecibles.

• Cuando se utiliza el generador Visual Basic es necesario haber accedido a la


base de datos antes de utilitar la función GetDatastore(), de lo contrario al
ejecutarse la misma fallará, y la propiedad ErrCode quedará con el valor 2.

Tipo de Datos WebWrapper

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
- Lenguajes: Java - Visual Basic – C/SQL – C#
- Interfaces: Web, Win

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.

119
Propiedades:

BaseURL Es la dirección Base del Web Panel

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

A la propiedad Object debe asignársele siempre el resultado de la función


Create( Objeto, Parámetros)

Metodos:
GetResponse

Retorna el código HTML que devolvería el objeto Web especificado en la propiedad


Source con los parámetros allí indicados.

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 desea hacer un WebWrapper de un Web Panel que incluya imágenes, se


puede hacer de dos maneras:
• Poner en el Web Panel las imágenes en forma absoluta, el inconveniente de
esto es que el usuario debe estar conectado en el momento de leer el mail.
• Poner en el Web Panel las imágenes relativas y mandarlas como atachment
en en el mail. En este caso la ruta de la imagen no debe incluir directorios
(i.e. /imágenes/logo.jpg) si no hacer referencia directamente a la misma
(i.e. logo.jpg).

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.

En Outlook 2000 y Outlook Express el comportamiento es el esperado: se abre un


browser, se hace el POST al servidor Web, y en el browser se muestra la respuesta
(incluso puede haber una redireccion, call o link, en el evento).

120
En Outlook XP el comportamiento es el siguiente: el POST lo hace el propio Outlook
(no se abre un browser para hacer el POST). Luego se abre un browser haciendo un
GET de la página para mostrarla. Pero dicho GET se hace solamente si no había una
redirección en el evento que ejecutó el POST. (De todas formas, el evento se ejecuta
siempre).

Por ejemplo, si se tiene un evento asociado a un botón que graba algo en la base de
datos y asigna cierto valor a una variable que está en el form. En Outlook 2000 y
Outlook Express, al apretar dicho botón en el mensaje se ejecutará el evento, por lo
que se hará el cambio a la base de datos, y se abrirá un browser donde se verá en el
form la variable con el valor que se le asignó en el evento. En Outlook XP se
ejecutará el evento, haciendo el cambio en la base de datos, pero el form de
respuesta nunca se mostrará. Luego se abrirá un browser donde se desplegará el
form SIN MODIFICAR LA VARIABLE.

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:

1) No usar eventos. Siempre se pueden usar links.

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
if base de datos fue modificada
webcomponent.object = create( HGracias, pars...)
else
webcomponent.object = create( HMailForm, pars...)
endif
End Event

En el evento de usuario de HMailForm se haría la modificación a la base de datos


por la cual se chequea en la condición. HGracias es el Web Panel al cual se quería
hacer la redirección al procesar el evento.

Consideraciones específicas del generador C/SQL


Al utilizar el tipo de dato WebWrapper con el generador C/SQL, hay que tener en
cuenta los siguientes factores:

• 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.

121
Consideraciones específicas del generador Visual
Basic
En caso de tener en el Web Panel que se envía como Web Wrapper Link o
Embedded Pages a objetos GeneXus del mismo modelo, se debe indicar la
preferencia del objeto “Generation Mode” en Smart Static Panel.

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

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
- Lenguajes: Java - Visual Basic - C#
- 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.

122
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

Esta propiedad retorna un String que es el identificador de la sesión. Por ejemplo:


&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)

Retorna un String correspondiente a la entrada key de la sesiones. En caso de que


la clave no exista retorna el String nulo. Por ejemplo:

&User = &session.get(“user”)

Remove(key)

Permite remover un valor de una sesión. Por ejemplo:

&Session.remove(“user”)

Destroy()

Detruye el contenido de la sesión. Es recomendable utilizarlo cuando el usuario


hace un “logout”, si es que existe este concepto en la misma. Por ejemplo:

&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.

123
• 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

• Si no se ejecuta el 'destroy()', el servidor Web destruye la sesión cuando ha


pasado un determinado tiempo desde la última vez que se utilizó. Esto
depende del servidor Web/plataforma, y se configura de forma nativa en cada
una.

• La forma en que se almacena la información de sesión también depende de la


plataforma, y condiciona la capacidad de tener la aplicación en mas de un
servidor Web. Básicamente, si la sesión se almacena de forma local al
servidor Web, solo es visible en ese servidor Web, por lo que si el siguiente
request del cliente va a parar a otro servidor Web, no va a tener disponible
los valores de sesión.

Consideraciones específicas para el Generador Visual


Basic
• En VB el destroy() limpia los valores almacenados en la sesión, pero si
inmediatamente se pide ID de la sesión devuelve el mismo ID. Java
devuelven un nuevo ID.

Ejemplos

Supongamos un sistema Web donde el usuario debe autentificarse por medio de un


usuario y una password que están previamente gravadas en la base de datos.
Entonces podemos definir en el Web Panel de Inicio una variable tipo WebSession
(&Session) y las variables de entrada &User y &Password. En el evento Enter del
Web Panel definir

For each
Where UsrNom = &User
Where UsrPsw = &Password
&Session.Set(“Name”, UsrNombre)
Call (HWelcome)
When none
Return
//Usuario no valido
endfor

124
De esta manera validamos el usuario con la base de datos y en caso de los valores
correspondan guardamos el nombre del usuario en la sesión y vamos a un Web
Panel de bienvenida (HWelcome) .
Luego en el Web Panel Welcome definir en el evento Start:

&UsrNombre = &session.Get(“Name”)
If Trim(&UsrNombre)=””
Return ///Sesión no valida
Else
TX.Caption = “Bienvenido “+ &UsrNombre + “a nuestro sitio!”
Endif

De esta manera, obtenemos el nombre del usuario desde la sesión y escribimos un


mensaje de bienvenida en pantalla.

Tipo de Datos XMLWriter

Introducción
El objetivo del tipo de datos XMLWriter es proveer la posibilidad de grabar archivos
XML de un modo más sencillo que las funciones incluidas en versiones anteriores. El
documento XML contiene una introducción a dicho lenguaje.
Se recomienda leer también el documento XMLReader.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Reportes, Procedimientos.
Lenguajes: Java – Visual Basic – Visual Fox – C/SQL – C#.
Interfaces: Web Form, Win Form.

Descripción
Para poder crear un archivo XML desde un objeto GeneXus, se debe definir una
variable de un nuevo tipo de datos denominado XmlWriter (xmlwrt) y luego invocar
a los métodos necesarios para crear los nodos que lo componen.

Métodos:
MÉTODOS BÁSICOS:

Open([FileName])

Permite crear un documento XML.


File Name es el nombre de archivo con el cual se va a
crear el documento, si se omite, el mismo se genera por

125
“standard output”. En caso de ser un objeto web se genera
en el response. (Funciona con CGI, ISAPI WebClasses y
Servlets).

FileName – Character

OpenToString()

Permite crear un documento XML a un buffer inerno en lugar de a un


archivo.
El contenido del buffer puede ser consultado por medio de
la propiedad ResultingString

WriteStartElement(<ElementName>)

Comienza un elemento compuesto. Este elemento puede tener


subelementos, por lo que es valido anidar llamadas a
WriteStarElement/WriteElement.

<ElementName> - Character

WriteElement(<ValueName>, <ElementValue>)

Almacena un valor dentro del tag de nombre ValueName. En el caso


de que ElementValue sea de tipo Character, se sustituyen los
caracteres especiales por secuencias de caracteres (el '<' se
sustituye por '&lt;', el '>' por '&gt;', etc.).
A diferencia del caso anterior este elemento no contiene
subelementos.

<ValueName> - Character
<ElementValue> - Character

WriteText(<Value>)

Genera character data con el string <Value>. Se sustituyen los


caracteres especiales por secuencias de caracteres (el '<' se
sustituye por '&lt;', el '>' por '&gt;', etc.).

<Value> - Character

WriteRawText(<Value>)

Genera cualquier texto sin sustituir los caracteres especiales por


secuencias de caracteres.

<Value> - Character

126
WriteAttribute(<AttriName>, <AttriValue>)

Asigna un atributo al último elemento. Es decir, al


elemento que se creó con la última invocación a
WriteStartElement(<ElementName>) o
WriteElement(<ValueName> , <ElementValue>).

<AttriName> - Character
<AttriValue> - Character

WriteEndElement()

Cierra el último elemento abierto.

Close()

Cierra el documento.

OTROS MÉTODOS:

WriteComment(<Comment>)

Escribe el comentario indicado en <Comment>

Ejemplo:
WriteComment(‘Comentario’) genera lo siguiente:
<!— Comentario -->

<Comment> - Character

WriteEntityReference(<Entity>)

Escribe una referencia a la entidad <Entity>

Ejemplo:
WriteEntityReference(‘Entidad’) genera lo siguiente:
&Entidad;

<Entity> - Character

WriteCData(<DataValue>)

Escribe una sección Cdata con el valor <DataValue>.


Si el contenido especificado para la sección Cdata contiene la secuencia de
caracteres ]]>, el mismo es fraccionado y se generan tantas secciones
Cdata como sean necesarias para obtener un documento XML bien formado.

Ejemplo:

127
WriteCData(‘Value’) genera lo siguiente:
<![CDATA[value]]>

<DataValue> - Character

WriteProcessingInstruction(<Action>, <Value>)

Escribe el registro del tipo processing instruction indicado por


<Action> y <Value>

Ejemplo:
WriteProcessingInstruction(‘play’, ‘sound = “Hello.wav”’)
genera lo siguiente:
<? Play sound=”Hello.wav” ?>

<Action> - Character
<Value > - Character

WriteStartDocument([StandAlone])

Escribe la declaración de XML usando la versión 1.0 y


codificación ISO-8859-1. Opcionalmente se puede indicar un
entero (0/1) como valor booleano para usar en la
declaración standalone.
Este método debe ser llamado al comienzo de la generación
del documento (luego del open() y antes de cualquier otro
método).

Ejemplo:
WriteStartDocument() genera lo siguiente:
<?xml version=”1.0” enconding=”ISO-8859-1” ?>

StandAlone – Integer (0/1)

WriteDocType(<DocName> [,SubSet])

Escribe la declaración DOCTYPE del documento XML. Si se


incluye un SubSet se ingresa entre corchetes al final de
la declaración.

Ejemplo:
WriteDocType(‘<book>’, ‘<!ENTITY ge “entity”>’) genera lo
siguiente:
<!DOCTYPE <book> [<!ENTITY ge “entity”>]>

<DocName> - Character
SubSet – Character

WriteDocTypeSystem(<DocName>,<uri> [,SunSet])

128
Escribe la declaración DOCTYPE del documento XML con una
declaración de tipo SYSTEM. Si se incluye un SubSet se ingresa entre
corchetes al final de la declaración.

Ejemplo:
WriteDocTypeSystem(‘<book>’, ‘file.dtd’) genera lo
siguiente: <!DOCTYPE <book> SYSTEM “file.dtd”>

<DocName> - Character
<uri> - Character
SubSet – Character

WriteDocTypePublic (<DocName>,<PubId>, <uri> [,SunSet])

Escribe la declaración DOCTYPE del documento XML con una


declaración de tipo PUBLIC. Si se incluye un SubSet se ingresa entre
corchetes al final de la declaración.

Ejemplo:
WriteDocTypePublic(‘<book>’,‘Id’,
‘http://www.ser.com/dtd’) genera lo siguiente:
<!DOCTYPE <book> PUBLIC “Id”
“http://www.ser.com/dtd”>

<DocName> - Character
<PubId> - Character
<uri> - Character
Subset - Character

Propiedades:

Indentation
Define cuantos caracteres se utilizan para indentar el código generado. Por
defecto es 2.

IndentChar
Define el carácter que se utiliza para indentar el código generado. Por
defecto se utiliza un espacio en blanco.

ErrCode
Retorna un valor mayor que cero en caso de haber ocurrido un error durante
la generación del documento XML.

ErrDescription
Contiene la descripción del error ocurrido cuando ErrCode tiene un valor
distinto de cero.

ResultingString
Permite consultar el valor del documento XML que se encuentra en un buffer
interno cuando el documento se creó a partir del método OpenToString().

129
El documento retornado puede ser incompleto si se invoca a la propiedad
antes de la ejecución del método close()

Soporte para Name Spaces


En esta sección se describen las funcionalidades disponibles para generar
documentos XML que utilizan name spaces.

MÉTODOS:

WriteNSStartElement(<LocalName> [,Prefix, NameSpaceURI])

Este método es análogo al WriteStartElement.


Si se indica un NameSpaceURI que no está en el ámbito de definición
del elemento, o este tiene un prefijo diferente del parámetro Prefrix,
se crea automáticamente el atributo xmlns:prefix=URI

<LocalName> - Character
Prefix - Character
NameSpaceURI - Character

WriteNSElement(<LocalName> [,NameSpaceURI [,Value]])

Este método es análogo al WriteElement.


El prefijo se determina automáticamente en base a los prefijos
definidos en el ámbito del elemento. Si ningún prefijo estuviera
asociado al URI especificado, se define junto con el elemento un
name space por defecto.

Ejemplo:
WriteNSElement(‘Precio’, ’20.5’, ‘http://www.genexus.com’)
genera lo siguiente:
<prefijo:Precio>20.5</prefijo:Precio>
o
<Precio xmlns=” http://www.genexus.com”>20.5</Precio>

<LocalName> - Character
NameSpaceURI - Character
<Value > - Character

WriteAttribute(<LocalName>, <Value>)

Cuando se trabaja con documentos con name sapace, el método


WriteAttribute tiene un comportamiento especial para algunos
atributos. Si el nombre del atributo es “xmlns” o comienza con
“xmlns:” se registra la definición del atributo como la definición de un
name space.
De esta forma, en futuras invocaciones de un método
WriteNSStartElement o WriteNSElement puede determinarse el

130
prefijo correspondiente a una determinada URI.

EJEMPLO DE SOPORTE DE NAME SPACE:


El siguiente procedimiento genera el archivo ejemplo.xml

&writer.Open(‘ejemplo.xml’)
&writer.WriteNSStartElement(‘a’)
&writer.WriteAttribute(‘xmlns:p1’, ’http://www.artech.com’)
&writer.WriteAttribute(‘xmlns’, ‘http://defecto.com’)
&writer.WriteAttribute(‘att’, ‘a1’)
&writer.WriteNSElement(‘b’, ’http://www.artech.com’)
&writer.WriteAttribute(‘att’, ‘a1’)
&writer.WriteAttribute(‘p1:att2’, ‘a2’)
&writer.WriteNSElement(‘b’, ’http://www.genexus.com’)
&writer.WriteAttribute(‘xmlns:p1’,’http://www.genexus.com’)
&writer.WriteAttribute(‘xmlns:p2’,’http://www.artech.com/segundo’)
&writer.WriteAttribute(‘p2:att1’, ‘a1’)
&writer.WriteEndElement()
&writer.Close()

El archivo ejemplo.xml queda de la siguiente forma:

<a
xmlns:p1="http://www.artech.com"
xmlns="http://defecto.com"
att="a1">
<p1:b
att1="a1"
p1:att2="a2"
/>
<p1:b xmlns:p1="http://www.genexus.com"
xmlns:p2="http://www.artech.com/segundo"
p2:att1="a1"
/>
</a>

Ejemplo
El siguiente procedimiento genera un archivo llamado Reunion.xml que contiene
datos de una reunión, indicando que integrantes participaron de la misma, y cuales
son las tareas de cada uno.

for each
&filexml.open('Reunion.xml')
&filexml.WriteStartDocument()

&filexml.WriteStartElement('REUNION')
&filexml.WriteAttribute('Fecha', dtoc(ReuFch) )

131
&filexml.WriteElement('FECHA', dtoc(ReuFch) )
&filexml.WriteComment('Descrpción de la reunión')
&filexml.WriteCData(ReuDsc )
&filexml.WriteStartElement('INTEGRANTES')
for each
&filexml.WriteElement('INTEGRANTE', ReuPerNom )
endfor
&filexml.WriteEndElement()
&filexml.WriteStartElement('TAREAS')
for each
&filexml.WriteStartElement('TAREA')
&filexml.WriteElement('RESPONSABLE', ReuTarPerNom)
&filexml.WriteCData(ReuTarDsc )
&filexml.WriteEndElement()
endfor
&filexml.WriteEndElement()
&filexml.WriteEndElement()
&filexml.Close()
endfor

El archivo reunion.xml contiene:

<?xml version="1.0" encoding="ISO-8859-1" ?>


<REUNION Fecha="06/03/01">
<FECHA>06/03/01</FECHA>
<!-- Descrpción de la reunión-->
<![CDATA[ Reunion del equipo de desarrollo de la aplicación.
La reunión fue realizada el Viernes a las 9:30 horas.]]>
<INTEGRANTES>
<INTEGRANTE>Juan Pedro</INTEGRANTE>
<INTEGRANTE>Laura</INTEGRANTE>
<INTEGRANTE>Diego</INTEGRANTE>
<INTEGRANTE>Florinda</INTEGRANTE>
</INTEGRANTES>
<TAREAS>
<TAREA>
<RESPONSABLE>Juan Pedro</RESPONSABLE>
<![CDATA[ Realizar la documentción de la aplicación]]>
</TAREA>
<TAREA>
<RESPONSABLE>Florinda</RESPONSABLE>
<![CDATA[ Reunion con los clientes.]]>
</TAREA>
<TAREA>
<RESPONSABLE>Laura</RESPONSABLE>
<![CDATA[ Realizar el maunal de usuario]]>
</TAREA>
<TAREA>
<RESPONSABLE>Diego</RESPONSABLE>
<![CDATA[ Documentar las especificaciones.]]>
</TAREA>

132
</TAREAS>
</REUNION>

133
Glosario
Las siguientes definiciones fueron extraídas de “Extensible Markup Language (XML)
1.0 (Second Edition)”; por más información referirse a
http://www.w3.org/TR/2000/REC-xml-20001006 ; y para el caso de los
Namespaces referirse a http://www.w3.org/TR/1999/REC-xml-names-19990114/

• Character data: Markup takes the form of start-tags, end-tags, empty-


element tags, entity references, character references, comments, CDATA
section delimiters, document type declarations, processing instructions, XML
declarations, text declarations, and any white space that is at the top level
of the document entity (that is, outside the document element and not
inside any other markup).
All text that is not markup constitutes the character data of the
document.

• Entities: An XML document may consist of one or many storage units.


These are called entities; they all have content and are all (except for the
document entity and the external DTD subset) identified by entity name.
Entities may be either parsed or unparsed.
A parsed entity's contents are referred to as its replacement text; this text is
considered an integral part of the document.
An unparsed entity is a resource whose contents may or may not be text,
and if text, may be other than XML. Each unparsed entity has an associated
notation, identified by name. Beyond a requirement that an XML processor
make the identifiers for the entity and notation available to the application,
XML places no constraints on the contents of unparsed entities.
Parsed entities are invoked by name using entity references; unparsed
entities by name, given in the value of ENTITY or ENTITIES attributes.

• Entity reference: Refers to the content of a named entity.

• CDATA sections may occur anywhere character data may occur; they are
used to escape blocks of text containing characters which would otherwise
be recognized as markup. CDATA sections begin with the string "<![CDATA["
and end with the string "]]>".

• Processing instructions (PIs) allow documents to contain instructions for


applications.

• Standalone document declaration: Markup declarations can affect the


content of the document, as passed from an XML processor to an application;
examples are attribute defaults and entity declarations. The standalone
document declaration, which may appear as a component of the XML
declaration, signals whether or not there are such declarations which appear
external to the document entity or in parameter entities.

• Document type declaration: XML provides a mechanism, the document


type declaration, to define constraints on the logical structure and to support
the use of predefined storage units. An XML document is valid if it has an

134
associated document type declaration and if the document complies with the
constraints expressed in it.
The XML document type declaration contains or points to markup
declarations that provide a grammar for a class of documents. This grammar
is known as a document type definition, or DTD. The document type
declaration can point to an external subset (a special kind of external entity)
containing markup declarations, or can contain the markup declarations
directly in an internal subset, or can do both. The DTD for a document
consists of both subsets taken together.

• XML namespaces provide a simple method for qualifying element and


attribute names used in Extensible Markup Language documents by
associating them with namespaces identified by URI references.

Tipo de Datos XMLReader

Introducción
El objetivo del tipo de datos XMLReader es proveer la posibilidad de leer el
contenido de los archivos XML. El documento XML contiene una introducción a dicho
lenguaje.
Se recomienda leer también el documento XMLWriter.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Reportes, Procedimientos.
Lenguajes: Java – Visual Basic – Visual Fox – C/SQL – C#.
Interfaces: Web Form, Win Form.

Descripción
Para poder leer el contenido de un archivo XML desde un objeto GeneXus, se debe
definir una variable de un nuevo tipo de datos denominado XmlReader y luego
invocar a los métodos y propiedades necesarios para obtener la información de los
nodos que lo componen.
La idea básica del funcionamiento es la siguiente: existe un método Read() que se
comporta a manera de cursor avanzando al siguiente nodo del archivo, luego
utilizando ciertas propiedades como por ejemplo Name y Value se puede obtener
los datos del nodo, en este caso el nombre y el valor del mismo. De esta forma
utilizando el método Read() se “navega” a lo largo del documento en forma
secuencial obteniendo los distintos nodos del mismo.

Métodos:
MÉTODOS BÁSICOS:

135
Open(<FileName>)

Permite abrir un documento XML.


File Name es el nombre de un archivo XML o una URL con un
archivo XML. Puede usarse la propiedad ErrCode para
consultar el éxito de la operación.

<FileName> – Character

OpenFromString(<DocXML>)

Permite abrir un documento XML contenido en un string.

<DocXML > – Character

Read()

Este método se utiliza para ir obteniendo en forma


secuencial los distintos nodos del archivo abierto.
Invocando al mismo se avanza al siguiente nodo y retorna
un valor entero mayor que cero si se leyó un nodo y cero
en caso contrario.

ReadType(<NodeTypeConstraint> [,NameConstraint])

Al igual que el método Read(), este método avanza al


siguiente nodo pero que cumpla con las restricciones
indicadas y retorna un valor entero mayor que cero si se
leyó un nodo y cero en caso contrario.
La restricción <NodeTypeConstraint> especifica cuales son los tipos
de nodos que quiero leer. Se especifica indicando las constantes del
tipo de nodo concatenadas por medio del carácter “+”
Por ejmplo: <NodeTypeConstraint> = 1 + 4 (especifica el tipo
Element y Text)
Si NameConstraint tiene un valor no nulo, especifica que
valor debe de tener el nombre del nodo que quiero leer,
siempre y cuando el nodo sea de tipo Element o EndTag.

<NodeTypeConstraint> – Character
NameConstraint – Character

GetAttributeByIndex(<Index>)

Retorna el valor del atributo en la posición <Index> del nodo actual


obtenido por el método Read o ReadType.
Solo es válido para nodos de tipo Element.
Las posiciones se numeran desde 1.

<Index> – Integer

136
GetAttributeByName(<Name>)

Retorna el valor del atributo de nombre <Name >del nodo actual


obtenido por el método Read o ReadType.
Solo es válido para nodos de tipo Element.

<Name> – Character

ExistsAttribute(<Name>)

Retorna 1 si el atributo de nombre <Name> del nodo actual


obtenido por el método Read o ReadType existe y 0 en caso
contrario.
Solo es válido para nodos de tipo Element.

<Name> – Character

Close()

Cierra el documento.

OTROS MÉTODOS:

SetDocEncoding (<Encoding>)

Permite establecer explícitamente la codificación de caracteres


utilizada en el documento. El valor indicado tiene precedencia sobre
la propiedad encoding de la declaración <?xml?> del documento.
Los valores posibles de <Enconding> son:
ANSI
US-ASCII
UTF-8
UTF-16
ISO-8859-1

<Enconding> - Character

SetNodeEncoding(<Encoding>)

Permite establecer la codificación de caracteres utilizada


para los valores retornados por el objeto XMLReader al
programa GeneXus.
Los valores posibles de <Enconding> son:
ANSI
UTF-8
El valor por defecto es ANSI.

137
<Enconding> - Character

Skip()
Permite saltear un elemento completo con todos sus hijos.
Solo es válido para nodos de tipo Element.

ReadRawXML()
Permite obtener texto XML plano a partir del inicio de un elemento.
Solo es válido para nodos de tipo Element.

AddSchema(<URI>, [Namespace])
Indica que se va a utilizar el “schema” de la <URI> para
validar el XML del [Namespace] indicado.
Si no se indica [Namespace], se toma el del atributo
targetNamespace del esquema.
Lo indicado en este método tiene prioridad sobre el atributo
schemaLocation del documento XML (en caso de que exista).
Para utilizar este método hay que indicar en la propiedad
ValidationType que se realice validación por esquema o automática.

<URI> – Character
Namespace – Character

Propiedades:
PROPIEDADES BÁSICAS

Nodetype
Retorna el tipo de nodo actual obtenido por el método Read o ReadType.
Los valores posibles son:
1- Element
2- EndTag
4- Text
8- Comment
16 - WhiteSpace
32 - Cdata
64 - ProcessingInstruction
128 - DocumentTypeElementType
EndTagType
TextType
CommentType
WhiteSpaceType
CDataType
ProcessingInstructionType
DoctypeType
Estas propiedades contienen valores constantes que pueden utilizarse para
comparar el resultado de la propiedad NodeType o con el método
ReadType

Name
Retorna el nombre del nodo actual obtenido por el método Read o

138
ReadType.
Solo es válido para nodos de tipo Element y EndTag.

Value
Retorna el valor del nodo actual obtenido por el método Read o ReadType.
Solo es válido para los nodos de tipo Text, Comment, ProcessingInstruction,
DocumentType y Element

IsSimple
Indica si el nodo actual obtenido por el método Read o ReadType responde a
una estructura del tipo <Elemento>Valor</Elemento>

AttributeCount
Retorna la cantidad de atributos que posee el nodo actual obtenido por el
método Read o ReadType.
Solo es válido para nodos de tipo Element.

EOF
Retorna si se alcanzo el final del docuemnto.

ErrCode
Retorna un valor mayor que cero en caso de haber ocurrido un error durante
el procesamiento de un documento XML.

ErrLineNumber; ErrLinePos
Retornan el numero de linea y posición dentro de la misma respectivamente
en caso de que ErrCode sea distinto de cero.

ErrDescription
Retorna la descripción del error en caso de que ErrCode sea distinto de cero.

OTRAS PROPIEDADES
ReadExternalEntities
Esta propiedad booleana indica si deben leerse las entidades externas
parseadas que forman parte del documento XML que se esté procesando
(esto incluye el subconjunto externo del DTD). Si la lectura está habilitada,
el objeto XMLReader leerá y procesará en forma transparente para el
usuario toda referencia a archivos o URLs externas que sean incluidas por el
documento. En caso contrario, las referencias a entidades externas son
ignoradas.

RemoveWhiteSpaces
Esta propiedad booleana indica si deben eliminarse los espacios en blanco,
tabuladores y finales de línea del inicio y fin del valor de un nodo de tipo
TEXT o ELEMENT.
El valor por defecto es TRUE.

RemoveWhiteNodes
Esta propiedad booleana indica si deben pasarse por alto los nodos de tipo
WhiteSpace al procesar un documento.
El valor por defecto es TRUE.

139
SimpleElements
Esta propiedad determina si los elementos con una estructura simple como
la siguiente
<elemento>valor</elemento>
o
<elemento/>
son procesados como un único nodo de tipo Element
El valor por defecto es TRUE.

ValidationType
Esta propiedad determina como se va a validar el XML leído.
Los valores posibles son:
• 0 – No se realiza validación
• 1 – Validación automática
• 2 – Validación por medio de DTD
• 3 – Validación por medio de un “Schema”
• 4 – Validación por medio de XDR
Cuando se elige validación automática el comportamiento es el siguiente
(extraído de la documentación de .NET):

If there is no DTD or schema, it will parse the XML without validation.

If there is a DTD defined in a <!DOCTYPE ...> declaration, it will load the


DTD and process the DTD declarations such that default attributes and
general entities will be made available. General entities are only loaded and
parsed if they are used (expanded).

If there is no <!DOCTYPE ...> declaration but there is an XSD


"schemaLocation" attribute, it will load and process those XSD schemas and
it will return any default attributes defined in those schemas.

If there is no <!DOCTYPE ...> declaration and no XSD or XDR schema


information then the parser is a non-validating parser (i.e.
ValidationType=ValidationType.None)

If there is no <!DOCTYPE ...> declaration and no XSD "schemaLocation"


attribute but there are some namespaces using the MSXML "x-schema:"
URN prefix, it will load and process those schemas and it will return any
default attributes defined in those schemas.

If there is no <!DOCTYPE ...> declaration but there is a schema declaration


(<schema>), it will validate using the in-line schema.

Soporte para Name Spaces


En esta sección se describen las funcionalidades disponibles para procesar
documentos XML que utilizan name spaces.

140
MÉTODOS:
Los siguientes métodos retornan los distintos componentes del nombre de
un atributo indicado por <Index>.
Solo son válidos para nodos de tipo Element.
Las posiciones se numeran desde 1.

GetAttributeName(<Index>)

GetAttributePrefix(<Index>)

GetAttributeLocalName(<Index>)

GetAttributeURI(<Index>)

<Index> - Integer

PROPIEDADES
Las siguientes propiedades sólo son válidas para nodos de tipo Element y
EndTag.

Name
Retorna el nombre completo prefijo:nombrelocal

Prefix
Retorna el prefijo que representa al name space del nombre

LocalName
Retorna el nombre sin el prefijo que representa al name space.

NameSpaceURI
Retorna el URI usado para identificar al name space.

Cuando un elemento no está calificado con un name space, las propiedades


Name y LocalName coinciden.

Entity references
Por defecto, tanto las entidades internas como externas son procesadas
automáticamente reemplazando las referencias por sus valores. El procesamiento
de las externas sin embargo puede ser desactivado usando la propiedad
ReadExternalEntities.
Se dispone además de las siguientes funcionalidades:

MÉTODOS
Los siguientes métodos permiten acceder a la notación y entidad
referenciadas por un atributo de tipo ENTITY.
El atributo puede especificarse por medio de su posición en el texto o por su
nombre y no se verifica que sea de tipo ENTITY. Si ninguna declaración fue

141
hecha en el DTD del documento para el valor atributo se devuelve una
cadena vacía.
Solo son válidos para nodos de tipo Element.
Las posiciones se numeran desde 1.

GetAttEntityValueByIndex(<Index>)

GetAttEntityValueByName(<Name>)

GetAttEntityNotationByIndex(<Index>)

GetAttEntityNotationByName(<Name>)

<Index> - Integer
<Name> - Character

Ejemplo
Se tiene el siguiente documento XML, llamado Reunion.xml

<?xml version="1.0" encoding="ISO-8859-1" ?>


<REUNION Fecha="06/03/01">
<FECHA>06/03/01</FECHA>
<!-- Descrpción de la reunión-->
<![CDATA[ Reunion del equipo de desarrollo de la aplicación.
La reunión fue realizada el Viernes a las 9:30 horas.]]>
<INTEGRANTES>
<INTEGRANTE>Juan Pedro</INTEGRANTE>
<INTEGRANTE>Laura</INTEGRANTE>
<INTEGRANTE>Diego</INTEGRANTE>
<INTEGRANTE>Florinda</INTEGRANTE>
</INTEGRANTES>
<TAREAS>
<TAREA>
<RESPONSABLE>Juan Pedro</RESPONSABLE>
<![CDATA[ Realizar la documentción de la aplicación]]>
</TAREA>
<TAREA>
<RESPONSABLE>Florinda</RESPONSABLE>
<![CDATA[ Reunion con los clientes.]]>
</TAREA>
<TAREA>
<RESPONSABLE>Laura</RESPONSABLE>
<![CDATA[ Realizar el maunal de usuario]]>
</TAREA>
<TAREA>
<RESPONSABLE>Diego</RESPONSABLE>
<![CDATA[ Documentar las especificaciones.]]>
</TAREA>

142
</TAREAS>
</REUNION>

Este procedimiento GeneXus lee el archivo y obtiene los integrantes de la reunión.

&readfile.open(‘Reunion.xml’ )
&readfile.ReadType(1, 'INTEGRANTES')
&readfile.read()
do while &readfile.name <> 'INTEGRANTES'
&Integrante = &readfile.value
&readfile.read()
enddo
&readfile.close()

Este procedimiento GeneXus lee el archivo y obtiene las tareas de un integrante de


la reunión.

&readfile.open(‘Reunion.xml’)
&exito = &readfile.ReadType(1, 'RESPONSABLE')
do while &readfile.value <> &Integrante
&exito= &readfile.ReadType(1, 'RESPONSABLE')
If &exito = 0
Exit
Endif
enddo
If &exito <> 0
&readfile.read()
&tareas = &readfile.value
else
&tareas = Nullvalue(&tareas )
Endif
&readfile.close()

Tipo de Datos para el manejo de planillas Excel

Introducción
La finalidad de este nuevo tipo de datos es unificar las funciones de interacción con
la generación de planillas Excel para los distintos lenguajes generados.

Una ventaja importante de esta implementación con respecto a las anteriores, es


que se manejan las planillas con un modelo orientado a objetos. No hay que llevar
control de los manejadores de los documentos (Handles).

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: Java, Visual Basic , Visual FoxPro
Interface: Win, Web

143
Descripción
Para utilizar esta nueva funcionalidad se creó el tipo de datos llamado
ExcelDocument que permite, a través de sus propiedades y métodos generar y
manejar planillas de Microsoft Excel.

Además internamente se implementa el tipo de datos ExcelCells, que se utiliza


para manejar al conjunto de celdas que existen en la planilla.

ExcelCells
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


Bold Numérico Lectura/Escritura
Color Numérico Lectura/Escritura
Date DateTime Lectura/Escritura
Font Carácter Lectura/Escritura
Italic Numérico Lectura/Escritura
Number Numérico Lectura/Escritura
Size Numérico Lectura/Escritura
Text Carácter Lectura/Escritura
Type Carácter Lectura
Underline Numérico Lectura/Escritura

PROPIEDADES

Bold
Especifica si las celdas se muestran en negrita (1) o no (0).

Sintaxis: &ExcelDocument.Cells(…).Bold

Esta propiedad solamente devolverá 1 si todas las celdas en el objeto ExcelCells


están en negrita. En caso contrario devolverá 0.

Color
Especifica el color de las celdas.

Sintaxis: &ExcelDocument.Cells(…).Color

Si se especifica un valor positivo se tomará dicho valor como índice de color de Excel. En
cambio, si se especifica un valor negativo (excepto –1), se tomará su valor absoluto como
número de color en el esquema RGB (es decir, como un valor retornado por la función RGB).
Si se especifica el valor –1, se toma el color por defecto definido en Excel.

Si existen celdas en el objeto ExcelCells con distintos colores, esta propiedad


devolverá 0.

144
Date
Valor de las celdas en formato de fecha y hora.

Sintaxis: &ExcelDocument.Cells(…).Date

Si existen celdas en el objeto ExcelCells con distintos valores, la propiedad Date


devolverá la fecha nula.

Font
Especifica la fuente utilizada para desplegar el valor de las celdas.

Sintaxis: &ExcelDocument.Cells(…).Font

Si existen celdas en el objeto ExcelCells que utilizan distintas fuentes, la propiedad


Font devolverá la cadena vacía.

Italic
Especifica si las celdas se muestran en itálica (1) o no (0).

Sintaxis: &ExcelDocument.Cells(…).Italic

La propiedad Italic solamente devolverá valor 1 si todas las celdas en el objeto


ExcelCells están en itálica. En caso contrario devolverá 0.

Number
Valor de las celdas en formato numérico.

Sintaxis: &ExcelDocument.Cells(…).Number

Si existen celdas en el objeto ExcelCells con distintos valores, la propiedad Number


devolverá cero.

Size
Especifica el tamaño de la fuente utilizada para desplegar el valor de las celdas.

Sintaxis: &ExcelDocument.Cells(…).Size

Si existen celdas en el objeto ExcelCells que utilizan distintos tamaños fuentes, la


propiedad Size devolverá 0.

Text
Valor de las celdas en formato de texto.

Sintaxis: &ExcelDocument.Cells(…).Text

Si existen celdas en el objeto ExcelCells con distintos valores, la propiedad Text

145
devolverá la cadena vacía.

Type
Devuelve el tipo del valor de una celda determinada.

Sintaxis: &ExcelDocument.Cells(…).Type

La propiedad Type tendrá uno de los siguientes valores:


• “N” si el tipo es numérico.
• “C” si el tipo es carácter.
• “D” si el tipo es fecha o fecha/hora.
• “U” si el tipo es desconocido.

Si existen celdas en el objeto ExcelCells que contienen distintos tipos, la propiedad


Type devolverá “U”.

Underline
Especifica si las celdas se muestran subrayadas (1) o no (0).

Sintaxis: &ExcelDocument.Cells(…).Underline

La propiedad Underline solamente devolverá valor 1 si todas las celdas en el objeto


ExcelCells están subrayadas. En caso contrarió devolverá 0.

ExcelDocument
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


AutoFit Numérico Lectura/Escritura
Delimiter Carácter Lectura/Escritura
ErrCode Numérico Lectura
ErrDescription Carácter Lectura
ErrDisplay Numérico Lectura/Escritura
MacroReturnText Carácter Lectura
MacroReturnNumber Numérico Lectura
MacroReturnDate Fecha Lectura
ReadOnly Numérico Lectura/Escritura
Template Carácter Lectura/Escritura

Método Parámetros Tipo


Cells Row Numérico
Column Numérico
Height Numérico
Width Numérico
Clear (ninguno)
Close (ninguno)

146
Hide (ninguno)
Open FileName Carácter
Print Preview Numérico
RenameSheet SheetName Carácter
RunMacro MacroName Carácter
Par1 … Par30 (Cualquiera)
Save (ninguno)
SelectSheet SheetName Carácter
Show (ninguno)
Unbind (ninguno) Numérico

PROPIEDADES

AutoFit
Ajustar automáticamente o no el ancho de las columnas.

Sintaxis: &ExcelDocument.AutoFit

Especifica si se ajustará automáticamente (1) o no (0) el ancho de las columnas al modificar


cualquiera de las propiedades de una celda o un grupo de ellas. El ajuste automático se hará
de manera tal que quede visible todo el contenido de las celdas modificadas.
El valor por defecto es 0.

Delimiter
Separador de campos a utilizar al abrir archivos de texto.

Sintaxis: &ExcelDocument.Delimiter

El valor por defecto es la coma (“,”).

ErrCode
Código de error de la última operación.

Sintaxis: &ExcelDocument.ErrCode

Ver sección “Códigos y Mensajes de Error”.

ErrDescription
Mensaje de error de la última operación.

Sintaxis: &ExcelDocument.ErrDescription

Ver sección “Códigos y Mensajes de Error”.

ErrDisplay
Desplegar o no mensajes de error.

147
Sintaxis: &ExcelDocument.ErrDisplay

Especifica si al ocurrir un error se desplegará un mensaje advirtiendo al usuario con el texto


del error (1) o no (0).
El valor por defecto es 0.

MacroReturnText
Ultimo valor de tipo carácter devuelto por un llamado a una macro mediante el
método RunMacro.

Sintaxis: &WordDocument.MacroReturnText

Nota:
- Esta propiedad no está disponible para el generador Java.

MacroReturnNumber
Ultimo valor numérico devuelto por un llamado a una macro mediante el método
RunMacro.

Sintaxis: &WordDocument.MacroReturnNumber

Nota:
- Esta propiedad no está disponible para el generador Java.

MacroReturnDate
Ultimo valor de tipo fecha devuelto por un llamado a una macro mediante el
método RunMacro.

Sintaxis: &WordDocument.MacroReturnDate

Nota:
- Esta propiedad no está disponible para el generador Java.

ReadOnly
Abrir el próximo documento como sólo lectura.

Sintaxis: &ExcelDocument.ReadOnly

Si ReadOnly es 1, la próximas llamadas al método Open causarán que las planillas


se abran como sólo lectura.
Si es 0 se intentarán abrir como lectura/escritura, pero si ya se encuentran
abiertas se abrirán como sólo lectura.
El valor por defecto es 0.

Template
Nombre del template a utilizar para documentos nuevos.

148
Sintaxis: &ExcelDocument.Template

Indica el camino y el nombre del archivo que se que se utilizará como Template en
las próximas llamadas al método Open con un nombre de archivo no existente.
El valor por defecto es la cadena vacía. En este caso se utilizará el template
por defecto.

El tipo de archivo puede ser cualquiera permitido por Excel para utilizarlo
como Template. Si es el string vacío, se usará el template por defecto. Por
defecto, no hay template asignado y por lo tanto se utiliza el template por
defecto.

Si se define un template, y luego se borra porque ya no se necesita, para volver a


utilizar el template por defecto se debe hacer una llamada a esta propiedad,
pasando por parámetro un string vacío (“”).

MÉTODOS

Cells
Devuelve una celda o un conjunto de celdas.

Sintaxis: &ExcelDocument.Cells(Row, Column[, Height, Width])

Devuelve un objeto ExcelCells con las celdas que componen el área que comienza
en la fila Row y columna Column y tiene Height celdas de alto y Width celdas de
ancho.
Si no se especifican los parámetros Height y Width se devolverá solamente la celda
ubicada en la fila Row y columna Column

Clear
Borra el contenido y el formato de todas las celdas de la hoja activa.

Sintaxis: &ExcelDocument.Clear()

Close
Salva y cierra el documento.

Sintaxis: &ExcelDocument.Close()

Hide
Oculta el documento.

Sintaxis: &ExcelDocument.Hide()

149
Open
Abre el documento especificado.

Sintaxis: &ExcelDocument.Open(FileName)

De no existir el documento especificado, éste se crea utilizando el template


especificado en la propiedad Template.
Al abrir un documento mediante el método Open, éste no es desplegado en
pantalla. Para mostrarlo es necesario llamar al método Show.

Print
Imprime el documento en la impresora por defecto.

Sintaxis: &ExcelDocument.Print([Preview])

El parámetro Preview indica si se mostrará el documento por pantalla (1) o no (0)


antes de imprimirlo. El valor por defecto es 0.

Nota:
- Para poder utilizar este método se debe configurar la preferencia “Functions
= Allow non standard functions” en diseño y prototipo.

RenameSheet
Renombra la hoja activa al nombre especificado.

Sintaxis: &ExcelDocument.RenameSheet(SheetName)

RunMacro
Ejecuta una macro contenida en el documento con los parámetros que se
especifiquen.

Sintaxis: &ExcelDocument.RunMacro(MacroName[, Par1 ... [,Par30]])

Notas:
• Los parámetros son sólo de entrada. Si la macro llamada devuelve
valores, éstos quedarán almacenado en las propiedades
MacroReturnText, MacroReturnNumber y MacroReturnDate, dependiendo
de su tipo.
• Hay un máximo de 30 parámetros, esto es una limitación de Word.
• Esta función no está disponible para el generador Java.
• Si se utiliza este método con Office 97, no es posible utilizar
parámetros, esto es una limitación de Office 97. Por esta razón
tampoco es posible invocar las propiedades MacroReturnText,
MacroReturnNumber y MacroReturnDate en este caso.

Save
Guarda el documento a disco.

150
Sintaxis: &ExcelDocument.Save()

SelectSheet
Cambia la hoja activa a la especificada.

Sintaxis: &ExcelDocument.SelectSheet(SheetName)

De no existir la hoja especificada, se crea.

Show
Muestra el documento en pantalla.

Sintaxis: &ExcelDocument.Show()

Unbind
Permite dejar abierta la planilla Excel, luego de finalizar la aplicación.

Sintaxis: &ExcelDocument.Unbind()

Este método es útil si se desea que una planilla permanezca abierta luego de que
se pierde de alcance el objeto ExcelDocument, incluso luego de finalizada la
aplicación.
Al liberar una planilla se pierde por completo la referencia entre el objeto
ExcelDocument y el documento abierto. Las operaciones sobre el objeto
ExcelDocument no afectan más al documento. De hecho, el objeto ExcelDocument
se comporta como si no tuviera un documento abierto hasta que no se llame
nuevamanete al método Open.

Códigos y Mensajes de Error


Los valores posibles son:

Código Mensaje
0 Ok
2 Workbook no longer valid (sucede cuando un libro que
fue abierto desde un programa es cerrado a mano por el
usuario).
3 Application no longer valid (sucede cuando Excel es
cerrado a mano por el usuario).
4 Invalid template
5 Invalid worksheet name
6 Invalid font properties
7 Invalid cell value
8 Invalid cell coordinates
9 Invalid file name
10 Could not open file
11 Error running macro
12 Could not save file

151
Consideraciones Generales
- Los métodos descritos anteriormente fueron implementados de forma tal
que devuelven (como si fueran funciones) el código de error, por lo que es
posible llamarlos como funciones.
Por ejemplo:
&Err = &ExcelDocument.Open(Archivo)

Compatibilidad con versiones anteriores de GeneXus


Las funciones de GXoffice que existían hasta la versión 7.0 de GeneXs, se siguen
soportando, el generador funciona de forma tal que mapea internamente estas
funciones para que utilicen estos nuevos tipos de datos.
Estas funciones se soportan unicamente por compatibilidad, por lo que no se
recomienda hacer nuevas implementaciones con las mismas pues las nuevas
funcionalidades no serán implementadas en dichas funciones.

Tipo de Datos para el manejo de documentos Word

Introducción
La finalidad de este nuevo tipo de datos es unificar las funciones de interacción con
la generación de documentos Word para los distintos lenguajes generados.

Una ventaja importante de esta implementación con respecto a las anteriores, es


que se manejan las planillas con un modelo orientado a objetos, no es necesario
llevar control de los manejadores de los documentos (Handles).

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: Java, Visual Basic , Visual FoxPro
Interface: Win, Web

Descripción
Para utilizar esta nueva funcionalidad se creó el tipo de datos llamado
WordDocument que permite, a través de sus propiedades y métodos generar
documentos de Microsoft Word.

152
WordDocument
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


ErrCode Numérico Lectura
ErrDescription Carácter Lectura
ErrDisplay Numérico Lectura/Escritura
MacroReturnText Carácter Lectura
MacroReturnNumber Numérico Lectura
MacroReturnDate Fecha Lectura
ReadOnly Numérico Lectura/Escritura
Template Carácter Lectura/Escritura
Text Carácter Lectura/Escritura

Método Parámetros Tipo


Append Text Carácter
Close (ninguno)
Hide (ninguno)
Open FileName Carácter
Print Preview Numérico
Background Numérico
Replace OldText Carácter
NewText Carácter
MatchCase Numérico
MatchWholeWord Numérico
RunMacro MacroName Carácter
Par1 … Par30 (Cualquiera)
Save (ninguno)
SaveAs FileName Carácter
FileType Carácter
DOSText Numérico
LineBreaks Numérico
Show (ninguno)
SpellCheck (ninguno)
Unbind (ninguno) Numérico

PROPIEDADES

ErrCode
Código de error de la última operación.

Sintaxis: &WordDocument.ErrCode

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

153
ErrDescription
Mensaje de error de la última operación.

Sintaxis: &WordDocument.ErrDescription

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDisplay
Desplegar o no mensajes de error.

Sintaxis: &WordDocument.ErrDisplay

Especifica si al ocurrir un error se desplegará un mensaje advirtiendo al usuario con el texto


del error (1) o no (0).
El valor por defecto es 0.

MacroReturnText
Ultimo valor de tipo carácter devuelto por un llamado a una macro mediante el
método RunMacro.

Sintaxis: &WordDocument.MacroReturnText

Nota:
- Esta propiedad no está disponible para el generador Java.

MacroReturnNumber
Ultimo valor numérico devuelto por un llamado a una macro mediante el método
RunMacro.

Sintaxis: &WordDocument.MacroReturnNumber

Nota:
- Esta propiedad no está disponible para el generador Java.

MacroReturnDate
Ultimo valor de tipo fecha devuelto por un llamado a una macro mediante el
método RunMacro.

Sintaxis: &WordDocument.MacroReturnDate

Nota:
- Esta propiedad no está disponible para el generador Java.

ReadOnly
Abrir el próximo documento como sólo lectura.

154
Sintaxis: &WordDocument.ReadOnly = Valor

Si ReadOnly es 1, la próximas llamadas al método Open causarán que los


documentos se abran como sólo lectura.
Si es 0 se intentarán abrir como lectura/escritura, pero si ya se encuentran
abiertas se abrirán como sólo lectura.
El valor por defecto es 0.

Template
Nombre del template a utilizar para documentos nuevos.

Sintaxis: &WordDocument.Template(Template)

Indica el camino y el nombre del archivo que se que se utilizará como Template en
las próximas llamadas al método Open con un nombre de archivo no existente.
El valor por defecto es la cadena vacía. En este caso se utilizará el template
por defecto.

Si se define un template, y luego se borra porque ya no se necesita, para volver a


utilizar el template por defecto se debe hacer una llamada a esta propiedad,
pasando por parámetro un string vacío (“”).

Text
Texto completo del documento.

Sintaxis: &WordDocument.Text

En caso de querer agregar nuevo texto a un documento existente sin perder el


formato actual, se recomienda utilizar el método Append.

MÉTODOS

Append

Agrega nuevo texto al final de un documento.

Sintaxis: &WordDocument.Append(Text)

Close
Salva y cierra el documento.

Sintaxis: &WordDocument.Close()

Hide
Oculta el documento. Si ningún documento está visible, oculta el Word.

155
Sintaxis: &WordDocument.Hide()

Open
Abre el documento especificado.

Sintaxis: &WordDocument.Open(FileName)

De no existir el documento especificado en el parámetro, éste se crea utilizando el


template especificado en la propiedad Template.
Al abrir un documento mediante el método Open, éste no es desplegado en
pantalla. Para mostrarlo es necesario llamar al método Show.
El parámetro puede contener el camino y el nombre del documento, si solo se
especifica el nombre el documento se creará en el directorio por defecto (directorio
del modelo DataXXX).

Print
Imprime el documento en la impresora por defecto.

Sintaxis: &WordDocument.Print([Preview[, Background]])

Preview Numérico Indica si se mostrará el documento en pantalla o no


antes de imprimirlo. Los valores posibles son 1 (se
muestra el documento), 0 (no se muestra el
documento).
Este parámetro es opcional y el valor por defecto es 0.
Background Numérico Indica si la impresión se llevará a cabo en segundo
plano (valor 1) o no (valor 0). En caso de indicar
impresión en segundo plano se devolverá el control al
programa llamador mientras se realiza la impresión y si
en el programa se cierra el documento cuando aún no
terminó la impresión, ésta será cancelada. Este
parámetro es opcional, el valor por defecto es 1.

Nota:
- Para poder utilizar este método se debe configurar la preferencia “Functions
= Allow non standard functions” en diseño y prototipo.

Replace
Permite sustituir todas las ocurrencias de un texto por otro.

Sintaxis: &WordDocument.Replace(OldText, NewText[, MatchCase[,


MatchWholeWord]])

OldText Carácter Indica cual es el texto que se va a sustituir


NewText Carácter Indica cual será el nuevo texto en el documento
MatchCase Numérico Si tiene valor 1 sólo se sustituirán las ocurrencias
que tengan igual configuración de mayúsculas y

156
minúsculas, si tiene valor 0 se sustituirán todas las
ocurrencias
Este parámetro es opcional, el comportamiento
por defecto es como si tuviera valor 0.
MatchWholeWord Numérico Si tiene valor 1 sólo se sustituirán aquellas
ocurrencias que no formen parte de otra palabra,
si tiene el valor 0 se sustituirán todas las
ocurrencias
Este parámetro es opcional, el comportamiento
por defecto es como si tuviera valor 0

Nota:
- La sustitución se realiza solo en el texto del documento, no se contempla el
texto del cabezal (Header) y el pie de página (Footer) para realizar la
sustitución.

RunMacro
Ejecuta la Macro indicada, contenida en el documento, con los parámetros que se
especifiquen.

Sintaxis: &WordDocument.RunMacro(MacroName[, Par1 ... [,Par30]])

MacroName Carácter Macro que se desea ejecutar


Par1 ... Par30 (Cualquiera) Parámetros utilizados por la macro.

Notas:
• Los parámetros son sólo de entrada. Si la macro llamada devuelve
valores, éstos quedarán almacenado en las propiedades
MacroReturnText, MacroReturnNumber y MacroReturnDate,
dependiendo de su tipo.
• Hay un máximo de 30 parámetros, esto es una limitación de Word.
• Esta función no está disponible para el generador Java.
• Si se utiliza este método con Office 97, no es posible utilizar
parámetros, esto es una limitación de Office 97. Por esta razón
tampoco es posible invocar las propiedades MacroReturnText,
MacroReturnNumber y MacroReturnDate en este caso.

Save
Guarda el documento Word a disco.

Sintaxis: &WordDocument.Save()

SaveAs
Guarda el documento a disco con un nuevo nombre, y opcionalmente se puede
seleccionar un nuevo tipo de archivo.

Sintaxis: &WordDocument.SaveAs(FileName[, FileType[, DOSText[,


LineBreaks]]])

157
FileName Carácter Nuevo nombre del documento Word.
FileType Carácter Nuevo tipo de archivo que se desea generar a partir del
documento Word.
Los tipos de archivo válidos son:
DOC (Formato de Word)
RTF (Rich Text Format)
HTM (HyperText Markup/ HyperText Markup
Language)
DOT (DOC Template)
TXT (Texto)
Este parámetro es opcional, el tipo de archivo por defecto
es DOC.
DOSText Carácter En caso de especificar tipo TXT se podrá especificar si el
formato del texto a utilizar será el de DOS (valor 1) o no
(valor 0).
Este parámetro es opcional, el valor por defecto es 0.
LineBreaks Numérico En caso de especificar tipo TXT indica si se agregará un
salto de página al final de cada línea (valor 1) o no (valor
0).
Este parámetro es opcional, el valor por defecto es 0.

Show
Muestra el documento en pantalla.

Sintaxis: &WordDocument.Show()

SpellCheck
Ejecuta el corrector ortográfico en el documento.

Sintaxis: &WordDocument.SpellCheck()

Unbind
Permite dejar abierto el documento Word, luego de finalizar la aplicación.

Sintaxis: &WordDocument.Unbind()

Este método es útil si se desea que un documento permanezca abierto luego de


que se pierde de alcance el objeto WordDocument, incluso luego de finalizada la
aplicación.
Al liberar un documento se pierde por completo la referencia entre el objeto
WordDocument y el documento abierto. Las operaciones sobre el objeto
WordDocument no afectan más al documento. De hecho, el objeto WordDocument
se comporta como si no tuviera un documento abierto hasta que no se llame
nuevamanete a su método Open.

158
Códigos y Mensajes de Error
Los valores posibles son:

Código Mensaje
0 Ok
2 Document no longer valid (sucede cuando un
documento que fue abierto desde un programa es
cerrado a mano por el usuario).
3 Application no longer valid (sucede cuando Word
es cerrado a mano por el usuario).
4 Invalid template
5 Invalid file name
6 Could not open file
7 Could not save file
8 Invalid value
9 Error running macro
10 Could not complete operation

Consideraciones Generales
- Los métodos descritos anteriormente fueron implementados de forma tal
que devuelven (como si fueran funciones) el código de error, por lo que es
posible llamarlos como funciones.
Por ejemplo:
&Err = &WordDocument.Open(Archivo)

Compatibilidad con versiones anteriores de GeneXus


Las funciones de GXoffice que existían hasta la versión 7.0 de GeneXs, se siguen
soportando, el generador funciona de forma tal que mapea internamente estas
funciones para que utilicen estos nuevos tipos de datos.
Estas funciones se soportan unicamente por compatibilidad, por lo que no se
recomienda hacer nuevas implementaciones con las mismas pues las nuevas
funcionalidades no serán implementadas en dichas funciones.

Tipos de Datos para el manejo de correos

Introducción
La finalidad de estos nuevos tipo de datos es unificar las funciones de interacción
con el envío y recepción de mensajes para los distintos lenguajes generados.

Una ventaja importante de esta implementación con respecto a las anteriores, es


que permite utilizar más de una instancia de conexión al servidor de correos.

159
Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: C/SQL (solo SMTPSession y POP3Session), Java, Visual Basic , Visual
FoxPro, C# (solo OutlookSession, SMTPSession y POP3Session)
Interface: Win, Web

Descripción
Para utilizar esta nueva funcionalidad se crearon los siguientes tipos de datos:

Tipo de Datos Descripción Requerimientos


OutlookSession Permite utilizar una sesión de correo para Microsoft Outlook 97 o
enviar y recibir mensajes mediante superior.
Microsoft Outlook.
MAPISession Permite enviar/recibir correos mediante Microsoft Outlook 97 o
MAPI (Mail Application Program Interface) superior o Cliente de
de Microsoft. Microsoft Exchange, y
Collaboration Data
Objects (CDO) 1.2 o
posterior.

Nota: Los CDO 1.2


vienen con los siguientes
productos:
Nota: No se recomienda utilizar este último - MS Outlook 98 y MS
modo a menos que se deseen utilizar los Outlook 2000 (Versión
servicios de Microsoft Exchange Server y no 1.21).
se cuente con Microsoft Outlook - MS Exchange 5.5
Server (Versión 1.2 o
Versión 1.21 en SP1 o
mayor).
SMTPSession Permite utilizar una sesión de correo para Protocolo TCP/IP. No
enviar mensajes mediante un servidor requiere Office.
utilizando el protocolo SMTP (Simple Mail
Transfer Protocol).
POP3Session Permite utilizar una sesión de correo para Protocolo TCP/IP. No
recibir mensajes desde un servidor requiere Office.
utilizando el protocolo POP3 (Post Office
Protocol Versión 3).
MailMessage Para configurar el mensaje que se va a
enviar/recibir, a través de diferentes
propiedades y métodos.
MailRecipient Permite configurar el nombre y la
dirección del destinatario de un
mensaje.

Los tipos de datos OutlookSession, MAPISession, SMTPSession y POP3Session


indican el modo en el que se va a realizar el envío y recepción de correos.

Además internamente se manejan los tipos de datos:

160
MailRecipientCollection Colección de objetos de tipo
MailRecipient.
StringCollection Colección de objetos de tipo Carácter.

OutlookSession
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


AttachDir Carácter Lectura/Escritura
Count Numérico Lectura
EditWindow Numérico (0 | 1) Lectura/Escritura
ErrCode Numérico Lectura
ErrDescription Carácter Lectura
ErrDisplay Numérico (0 | 1) Lectura/Escritura
NewMessages Numérico (0 | 1) Lectura/Escritura

Método Parámetros Tipo


ChangeFolder FolderName Carácter
Delete (ninguno)
MarkAsRead (ninguno)
Receive Message MailMessage
Send Message MailMessage

PROPIEDADES

AttachDir
Directorio de archivos adjuntos.

Sintaxis: &OutlookSession.AttachDir

Especifica en qué directorio se deben guardar los archivos adjuntos cuando se


ejecuta el método Receive. Si esta propiedad contiene una cadena vacía (“”), no se
guardarán los archivos adjuntos.
En el caso del método Send se tomará como directorio base para búsqueda de los
archivos adjuntos al mensaje (propiedad Attachments).
El valor por defecto es la cadena vacía ( “”).

Count
Cantidad de mensajes a recibir.

Sintaxis: &OutlookSession.Count

Retorna la cantidad de mensajes que cumplen con las condiciones de apertura de la


carpeta. Es decir, si se abrió la carpeta o la sesión especificando que se recibirán
solamente los mensajes no leídos (mediante la propiedad NewMessages), retornará

161
la cantidad de mensajes no leídos, mientras que si se abrió la carpeta especificando
que se recibirán todos los mensajes, retornará la cantidad total de mensajes.

EditWindow
Indica si se mostrará o no la ventana de edición del mensaje antes de enviarlo.

Sintaxis: &OutlookSession.EditWindow

Si EditWindow es 1, se mostrará la ventana de edición del mensaje a enviar cada


vez que se invoque a la propiedad Send. Si es 0, se enviará el mensaje sin
interacción del usuario.
El valor por defecto es 0.

ErrCode
Código de error de la última operación.

Sintaxis: &OutlookSession.ErrCode

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDescription
Mensaje de error de la última operación. La lista de mensajes se detallan en la
propiedad ErrorNumber.

Sintaxis: &OutlookSession.ErrDescription

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDisplay
Indica si se desplegará o no mensajes de error.

Sintaxis: &OutlookSession.ErrDisplay

Especifica si al ocurrir un error se desplegará un mensaje advirtiendo al usuario con


el texto del error o no, según si ErrDisplay es 1 o 0 respectivamente.
El valor por defecto es 0.

NewMessages
Indica si se recibirán solamente los mensajes nuevos o todos los mensajes.

Sintaxis: &OutlookSession.NewMessages

Si NewMessages es 1 los llamados al método Receive devolverán


solamente los mensajes no leídos de la carpeta actual. Si es 0, devolverán
todos los mensajes de la carpeta.
El valor por defecto es 0.

162
El valor de esta propiedad tendrá efecto a partir del próximo llamado al
método ChangeFolder.

Si el servidor no soporta la propiedad NewMessages=1 se dará el error 29.

MÉTODOS

ChangeFolder
Cambia la carpeta desde la cual se recibirán mensajes.

Sintaxis: &Error = &OutlookSession.ChangeFolder([FolderName])

FolderName Nombre de la carpeta desde donde se van a leer los correos.


Consultar las Notas para conocer las reglas de definición de
nombres de carpetas.
Este parámetro es opcional, si se omite o deja en blanco, se
hará referencia a la carpeta Inbox.

Notas:
- Reglas para la correcta definición de nombres de carpetas. La notación es
similar a la utilizada en DOS y UNIX para navegar entre directorios, con
algunas excepciones.

En general, las reglas son:

- Se puede utilizar el carácter “.” para indicar la carpeta actual.


- Se puede utilizar la cadena “..” para indicar la carpeta de un nivel más
alto.
- Se puede utilizar el carácter “\” para indicar una subcarpeta.
- Se puede utilizar el carácter “\” al inicio del nombre para indicar la raíz.
- Si se especifica un nombre simple, sin “\” ni “..”, se hará referencia a
una carpeta hermana del Inbox.
- Los valores “*Inbox”, “*Outbox”, “*Sent Items”, “*Deleted Items” y
“*Drafts” se utilizan para referenciar las carpetas comúnmente llamadas
por estos nombres, aunque sus nombres no sean exactamente estos.
Esto es útil cuando se utiliza un cliente en otro idioma. Por ejemplo, si se
tiene Outlook en español, “*Inbox” hará referencia a la carpeta “Bandeja
de entrada”.

A modo de ejemplo, si se tiene la siguiente estructura:


Maibox
Drafts
Inbox
Urgentes
Outbox
Pendientes
En espera
Sent Items

163
Public Folders
Favorites
All Public Folders
General

Los siguientes valores de FolderName son válidos:


“Pendientes”
“Pendientes\En Espera”
“\Mailbox\Pendientes”
“\Public Folders\All Public Folders\General”
“*Inbox\Urgentes”
Si actualmente está seleccionada la carpeta Inbox\Urgentes:
− “..” (Selecciona Inbox)
− “..\..\Pendientes\En espera”
Si actualmente está seleccionada la carpeta Inbox:
“.\Urgentes”

Delete

Elimina del servidor el último mensaje que haya sido recibido mediante el método
Receive.

Sintaxis: &OutlookSession.Delete()

El mensaje borrado se moverá a la carpeta “Deleted Items”.


Si no se llamó al método Receive o si el último llamado no retornó un mensaje
(debido a un error por ejemplo), la llamada a Delete resultará en el error 26.

MarkAsRead
Marca como leído el último mensaje que haya sido recibido mediante el método
Receive.

Sintaxis: &OutlookSession.MarkAsRead()

Si no se llamó al método Receive o si el último llamado no retornó un mensaje


(debido a un error por ejemplo), la llamada a MarkAsRead resultará en el error 26.
Esta propiedad se debe configurar luego de realizar el Receive.

Receive
Devuelve los datos del siguiente correo en la sesión actual.
Si el correo tiene archivos adjuntos y se especificó un directorio en la propiedad
AttachDir, éstos se graban a disco, de lo contrario no se guardan.

Sintaxis: &OutlookSession.Receive(Message)

Nota:
- El parámetro Message es de tipo MailMessage.

164
Send
Envía un mensaje.

Sintaxis: &OutlookSession.Send(Message)

Notas:
- El parámetro Message es de tipo MailMessage.
- Si alguna dirección de destino no puede ser resuelta, se mostrará la ventana
de edición, como si la propiedad EditWindow tuviera valor 1.

MAPISession
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


AttachDir Carácter Lectura/Escritura
Count Numérico Lectura
EditWindow Numérico (0 | 1) Lectura/Escritura
ErrCode Numérico Lectura
ErrDescription Carácter Lectura
ErrDisplay Numérico (0 | 1) Lectura/Escritura
NewMessages Numérico (0 | 1) Lectura/Escritura
Profile Carácter Lectura/Escritura

Método Parámetros Tipo


ChangeFolder FolderName Carácter
Delete (ninguno)
Login (ninguno)
Logout (ninguno)
MarkAsRead (ninguno)
Receive Message MailMessage
Send Message MailMessage

PROPIEDADES

AttachDir
Directorio de archivos adjuntos.

Sintaxis: &MAPISession.AttachDir

Especifica en qué directorio se deben guardar los archivos adjuntos cuando se


ejecuta el método Receive. Si esta propiedad contiene una cadena vacía (“”), no se
guardarán los archivos adjuntos.
En el caso del método Send se tomará como directorio base para búsqueda de los
archivos adjuntos al mensaje (propiedad Attachments).
El valor por defecto es la cadena vacía ( “”).

165
Count
Cantidad de mensajes a recibir.

Sintaxis: &MAPISession.Count

Retorna la cantidad de mensajes que cumplen con las condiciones de apertura de la


carpeta. Es decir, si se abrió la carpeta o la sesión especificando que se recibirán
solamente los mensajes no leídos (mediante la propiedad NewMessages), retornará
la cantidad de mensajes no leídos, mientras que si se abrió la carpeta especificando
que se recibirán todos los mensajes, retornará la cantidad total de mensajes.

EditWindow
Indica si se mostrará o no la ventana de edición del mensaje antes de enviarlo.

Sintaxis: &MAPISession.EditWindow

Si EditWindow es 1, se mostrará la ventana de edición del mensaje a enviar cada


vez que se invoque a la propiedad Send. Si es 0, se enviará el mensaje sin
interacción del usuario.
El valor por defecto es 0.

ErrCode
Código de error de la última operación.

Sintaxis: &MAPISession.ErrCode

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDescription
Mensaje de error de la última operación. La lista de mensajes se detallan en la
propiedad ErrCode.

Sintaxis: &MAPISession.ErrDescription

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDisplay
Indica si se desplegará o no mensajes de error.

Sintaxis: &MAPISession.ErrDisplay

Especifica si al ocurrir un error se desplegará un mensaje advirtiendo al usuario con


el texto del error o no, según si ErrDisplay es 1 o 0 respectivamente.
El valor por defecto es 0.

166
NewMessages
Indica si se recibirán solamente los mensajes nuevos o todos los mensajes.

Sintaxis: &MAPISession.NewMessages

Si NewMessages es 1 los llamados al método Receive devolverán


solamente los mensajes no leídos de la carpeta actual. Si es 0, devolverán
todos los mensajes de la carpeta.
El valor por defecto 0.

El valor de esta propiedad tendrá efecto a partir del próximo llamado al


método ChangeFolder.
Si el servidor no soporta la propiedad NewMessages=1 se dará el error 29.

Profile
Perfil a utilizar para comenzar una sesión.

Sintaxis: &MAPISession.Profile

El valor de esta propiedad tendrá efecto a partir del próximo llamado al


método Login. Si no especifica esta propiedad, el llamado al método Login
mostrará una ventana de selección de perfiles.

MÉTODOS

ChangeFolder
Cambia la carpeta desde la cual se recibirán mensajes.

Sintaxis: &OutlookSession.ChangeFolder([FolderName])

FolderName Nombre de la carpeta desde donde se van a leer los correos.


Consultar las Notas para conocer las reglas de definición de
nombres de carpetas.
Este parámetro es opcional, si se omite o deja en blanco, se
hará referencia a la carpeta Inbox.

Delete

Elimina del servidor el último mensaje que haya sido recibido mediante el método
Receive.

Sintaxis: &MAPISession.Delete()

El mensaje borrado se moverá a la carpeta “Deleted Items”.


Si no se llamó al método Receive o si el último llamado no retornó un mensaje
(debido a un error por ejemplo), la llamada a Delete resultará en el error 26.

167
Login
Inicia una sesión.

Sintaxis: &MAPISession.Login

La sesión MAPI se iniciará con el perfil indicado en la propiedad Profile. Si


dicha propiedad no fue asignada se abrirá una ventana que preguntará el
perfil a utilizar.
Luego de iniciar una sesión con el perfil indicado, se abre la carpeta
“Inbox” (o equivalente).

Logout
Finaliza la sesión.

Sintaxis: &MAPISession.Logout

MarkAsRead
Marca como leído el último mensaje que haya sido recibido mediante el método
Receive.

Sintaxis: &MAPISession.MarkAsRead

Si no se llamó al método Receive o si el último llamado no retornó un mensaje


(debido a un error por ejemplo), la llamada a MarkAsRead resultará en el error 26.

Nota:
- Para poder utilizar esta propiedad se debe configurar la preferencia
“Functions = Allow non standard functions” en diseño y prototipo.

Receive
Devuelve los datos del siguiente correo en la sesión actual.
Si el correo tiene archivos adjuntos y se especificó un directorio en la propiedad
AttachDir, éstos se graban a disco, de lo contrario no se guardan.

Sintaxis: &MAPISession.Receive(Message)

Nota:
- El parámetro Message es de tipo MailMessage.

Send
Envía un mensaje.

Sintaxis: &MAPISession.Send(Message)

Notas:
- El parámetro Message es de tipo MailMessage.
- Si la dirección de algún destinatario no puede ser resuelta, se mostrará una
ventana de resolución de nombres que dará a elegir al usuario el

168
destinatario correcto de entre los posibles destinatarios para la dirección
especificada.
- Se fuerza el envío inmediato de mails luego de hacer un Send. Esto tiene
como consecuencia que si se utiliza conexión telefónica a Internet, se realice
el discado al llamar al método Send.

SMTPSession
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


AttachDir Carácter Lectura/Escritura
Authentication Numérico (0 | 1) Lectura/Escritura
ErrCode Numérico Lectura
ErrDescription Carácter Lectura
ErrDisplay Numérico (0 | 1) Lectura/Escritura
Host Carácter Lectura/Escritura
Password Carácter Escritura
Port Numérico Lectura/Escritura
Sender MailRecipient Lectura/Escritura
Timeout Numérico Lectura/Escritura
UserName Carácter Lectura/Escritura

Método Parámetros Tipo


Login (ninguno)
Logout (ninguno)
Send Message MailMessage

PROPIEDADES

AttachDir
Directorio de archivos adjuntos.

Sintaxis: &SMTPSession.AttachDir

Especifica cuál será el directorio base para búsqueda de los archivos adjuntos al
mensaje (propiedad Attachments).
El valor por defecto es la cadena vacía ( “”).

Authentication
Indica si se intentará o no autentificación con el servidor.

Sintaxis: &SMTPSession. Authentication

Algunos servidores SMTP requieren autenticación. En dichos casos podrá


especificarse la propiedad Authentication en 1 y especificar en las
propiedades UserName y Password el nombre de usuario y la clave a

169
utilizar. Estos valores serán tomados en cuenta en el próximo llamado al
método Login.

El único mecanismo de autenticación soportado es Clear Text. Si se especifican los


parámetros UserName y Password y el servidor no soporta autenticación por Clear Text se
producirá el error 23.
El valor por defecto es 0.

ErrCode
Código de error de la última operación.

Sintaxis: &SMTPSession.ErrCode

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDescription
Mensaje de error de la última operación. La lista de mensajes se detallan en la
propiedad ErrCode.

Sintaxis: &SMTPSession.ErrDescription

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDisplay
Indica si se desplegará o no mensajes de error.

Sintaxis: &SMTPSession.ErrDisplay

Especifica si al ocurrir un error se desplegará un mensaje advirtiendo al usuario con


el texto del error o no, según si ErrDisplay es 1 o 0 respectivamente.
El valor por defecto es 0.

Nota:
- Esta propiedad no está disponible en el generador C/SQL.

Host
Dirección del servidor SMTP.

Sintaxis: &SMTPSession.Host

Puede especificarse tanto el nombre del servidor como su dirección IP.

Password
Contraseña a utilizar para autenticarse en el servidor.

Sintaxis: &SMTPSession.Password

Está propiedad será ignorada si la propiedad Authentication está en 0.

170
Port
Puerto del servidor SMTP en el Host.

Sintaxis: &SMTPSession.Port

El valor por defecto es 25, el puerto normalmente utilizado por los


servidores SMTP.

Sender
Datos del emisor a incluir en los mensajes enviados.

Sintaxis: &SMTPSession.Sender

Al crearse una variable de tipo SMTPSession, la propiedad Sender contiene un


objeto MailRecipient con las propiedades Name y Address vacias. Por esta razón,
los datos del emisor se pueden asignar directamente sobre las propiedades Name y
Address del objeto ya creado o se puede asignar otro objeto de tipo MailRecipient,
del cual se copiarán estas propiedades.

Es necesario tener datos válidos en la propiedad Sender para que funcione el


método Login.

Timeout
Tiempo de espera máximo, en segundos, para esperar por una respuesta del
servidor luego de cada pedido.

Sintaxis: &SMTPSession.Timeout

Este valor debe adaptarse a la velocidad de la red de comunicaciones y a la carga


del servidor. Se deben utilizar valores pequeños para redes locales y valores
mayores si está utilizando Internet, especialmente si se conecta a servidores muy
remotos.
El valor por defecto es 30.

UserName
Nombre de usuario a utilizar para autenticarse en el servidor.

Sintaxis: &SMTPSession.UserName

Está propiedad será ignorada si la propiedad Authentication está en 0.

MÉTODOS

Login
Inicia una sesión con un servidor SMTP.

171
Sintaxis: &SMTPSession.Login

La sesión SMTP se iniciará con el servidor indicado en la propiedad Host en


el puerto indicado en la propiedad Port. Se utilizarán los valores de la
propiedad UserName y Password para la autenticación con el servidor.

Logout
Finaliza la sesión con un servidor SMTP.

Sintaxis: &SMTPSession.Logout

Send
Envía un mensaje.

Sintaxis: &SMTPSession.Send(Message)

Notas:
- El parámetro Message es de tipo MailMessage.

POP3Session
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


AttachDir Carácter Lectura/Escritura
Count Numérico Lectura
ErrCode Numérico Lectura
ErrDescription Carácter Lectura
ErrDisplay Numérico (0 | 1) Lectura/Escritura
Host Carácter Lectura/Escritura
NewMessages Numérico (0 | 1) Lectura/Escritura
Password Carácter Escritura
Port Numérico Lectura/Escritura
Timeout Numérico Lectura/Escritura
UserName Carácter Lectura/Escritura

Método Parámetros Tipo


Delete (ninguno)
Login (ninguno)
Logout (ninguno)
Receive Message MailMessage

172
PROPIEDADES

AttachDir
Directorio de archivos adjuntos.

Sintaxis: &POP3Session.AttachDir

Especifica en qué directorio se deben guardar los archivos adjuntos cuando se


ejecuta el método Receive. Si esta propiedad contiene una cadena vacía (“”), no se
guardarán los archivos adjuntos.
El valor por defecto es la cadena vacía ( “”).

Count
Cantidad de mensajes a recibir.

Sintaxis: &POP3Session.Count

Retorna la cantidad de mensajes que cumplen con las condiciones de


apertura de la carpeta. Es decir, si se abrió la carpeta o la sesión
especificando que se recibirán solamente los mensajes no leídos (mediante
la propiedad NewMessages), retornará la cantidad de mensajes no leídos,
mientras que si se abrió la carpeta especificando que se recibirán todos los
mensajes, retornará la cantidad total de mensajes.

ErrCode
Código de error de la última operación.

Sintaxis: &POP3Session.ErrCode

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDescription
Mensaje de error de la última operación. La lista de mensajes se detallan en la
propiedad ErrCode.

Sintaxis: &Error = &POP3Session.ErrDescription

Ver sección “Códigos y Mensajes de Error” en este mismo documento.

ErrDisplay
Indica si se desplegará o no mensajes de error.

Sintaxis: &POP3Session.ErrDisplay

Especifica si al ocurrir un error se desplegará un mensaje advirtiendo al usuario con


el texto del error o no, según si ErrDisplay es 1 o 0 respectivamente.

173
El valor por defecto es 0.

Nota:
- Esta propiedad no está disponible en el generador C/SQL.

Host
Dirección del servidor POP3.

Sintaxis: &POP3Session.Host

Puede especificarse tanto el nombre del servidor como su dirección IP.

NewMessages
Indica si se recibirán solamente los mensajes nuevos o todos los mensajes.

Sintaxis: &POP3Session.NewMessages

Si NewMessages es 1 los llamados al método Receive devolverán


solamente los mensajes no leídos de la carpeta actual. Si es 0, devolverán
todos los mensajes de la carpeta.
El valor por defecto 0.

El valor de esta propiedad tendrá efecto a partir del próximo llamado al


método Login.

Las implementaciones más recientes de servidores POP3 no poseen el mecanismo


necesario para el funcionamiento correcto cuando esta propiedad tiene valor 1. En
caso de que se haga una llamada al método Login espcificando en la propiedad
Host un servidor que no posea dicho mecanismo y esta propiedad tenga valor 1, se
producirá el error 29

Password
Contraseña a utilizar para autenticarse en el servidor.

Sintaxis: &POP3Session.Password

Port
Puerto del servidor POP3 en el Host.

Sintaxis: &POP3Session.Port

El valor por defecto es 110, el puerto normalmente utilizado por los


servidores POP3.

Timeout
Tiempo de espera máximo, en segundos, para esperar por una respuesta del
servidor luego de cada pedido.

174
Sintaxis: &POP3Session.Timeout

Este valor debe adaptarse a la velocidad de la red de comunicaciones y a la carga


del servidor. Se deben utilizar valores pequeños para redes locales y valores
mayores si está utilizando Internet, especialmente si se conecta a servidores muy
remotos.
El valor por defecto es 30.

UserName
Nombre de usuario a utilizar para autenticarse en el servidor.

Sintaxis: &SMTPSession.UserName

MÉTODOS

Delete
Elimina del servidor el último mensaje que haya sido recibido mediante el método
Receive.

Sintaxis: &POP3Session.Delete()

El mensaje se elimina definitivamente, y se realiza cuando se ejeucta el Logout.


Si no se llamó al método Receive o si el último llamado no retornó un mensaje
(debido a un error por ejemplo), la llamada a Delete resultará en el error 26.

Login
Inicia una sesión con un servidor POP3.

Sintaxis: &POP3Session.Login

La sesión POP3 se iniciará con el servidor indicado en la propiedad Host en


el puerto indicado en la propiedad Port. Se utilizarán los valores de la
propiedad UserName y Password para la autentificación con el servidor.

Logout
Finaliza la sesión con un servidor POP3.

Sintaxis: &POP3Session.Logout

Receive
Recibe un mensaje.

Sintaxis: &POP3Session.Receive(Message)

Devuelve el siguiente mensaje en la carpeta o sesión actual.


Si el mensaje tiene archivos adjuntos y se especificó la propiedad
AttachDir, estos se grabarán automáticamente a disco.

175
Nota:
- El parámetro Message es de tipo MailMessage.

MailMessage
Las propiedades disponibles para este tipo de datos son las siguientes:

Propiedad Tipo Acceso


Attachments StringCollection Lectura
BCC MailRecipientCollection Lectura
CC MailRecipientCollection Lectura
DateReceived DateTime Lectura
DateSent DateTime Lectura
From MailRecipient Lectura/Escritura
HTMLText Carácter Lectura/Escritura
Subject Carácter Lectura/Escritura
Text Carácter Lectura/Escritura
To MailRecipientCollection Lectura

PROPIEDADES

Attachments
Lista de nombres de archivos adjuntos al mensaje. Los elementos de la lista deben
se separan mediante el caracter “;”.
De no especificar una ruta completa, al enviar un mensaje los archivos adjuntos se
buscarán en el directorio especificado por la propiedad AttachDir.

Sintaxis: &Message.Attachments

Nota:
- Si se utiliza modo SMTP: En la ruta de los archivos adjuntos puede
utilizarse tanto la barra (/) como la contrabarra (\) como separador de
directorios. De esta manera se brinda compatibilidad entre los ambientes
UNIX y Windows.

BCC
Lista de destinatarios ocultos (Blind Carbon Copy) de un mensaje. Los elementos
de la lista deben separarse mediante el caracter “;” (punto y coma).

Sintaxis: &Message.BCC

CC
Lista de destinatarios secundarios (Carbon Copy) de un mensaje. Los elementos de
la lista deben separarse mediante el caracter “;”.

Sintaxis: &Message.CC

176
DateReceived
Fecha y hora en que fue recibido el mensaje por el servidor.

Sintaxis: &Message.DateReceived

DateSent
Fecha y hora en que fue enviado el mensaje.

Sintaxis: &Message.DateSent

From
Emisor del mensaje.

Sintaxis: &Message.From

HTMLText
Cuerpo del mensaje en formato HTML (HyperText Markup Language).

Sintaxis: &Message.HTMLText

Notas:
- MAPI: Esta propiedad no se soporta si se utiliza modo MAPI.
- Outlook: Si bien esta propiedad se soporta en Outlook, no es posible
manejar un mensaje con contenido en texto simple y HTML a la vez. Se
tomará como contenido definitivo el último que se asigne. Al recibir un
mensaje con contenido HTML la propiedad Text contendrá el mismo texto
que la propiedad HTMLText pero sin formato (omitiendo los tags del
lenguaje HTML).
- SMTP/POP3: Es posible manejar mensajes con contenido en texto simple
y HTML a la vez. De enviar un mensaje de este tipo, el cliente que lo reciba
mostrará siempre que pueda el contenido HTML. Si el cliente no es capaz
que manejar contenido HTML mostrará el contenido en texto simple.

Subject
Asunto del mensaje.

Sintaxis: &Message.Subject

Text
Cuerpo del mensaje en formato de texto simple.

Sintaxis: &Message.Text

To
Colección de destinatarios primarios del mensaje.

177
Sintaxis: &Message.To

MailRecipient
Las propiedades disponibles para este tipo de datos son las siguientes:

Propiedad Tipo Acceso


Name Carácter Lectura/Escritura
Adress Carácter Lectura/Escritura

PROPIEDADES

Name
Nombre del destinatario.

Sintaxis: &Recipient.Name

Si no se indica un valor para la propiedad Name, se copia el contenido de la


propiedad Address en esta propiedad.

Nota:
- Outlook: No es posible utilizar esta propiedad al recibir un correo para
las propiedades To, CC, Bcc y From, si se trabaja con Outlook. Esto
significa que no es posible utilizar To.name, CC.name, Bcc.name, o
From.name en modo Outlook.

Address
Dirección de correo del destinatario.

Sintaxis: &Recipient.Address

Nota:
- Outlook: No es posible utilizar esta propiedad al recibir un correo para
las propiedades To, CC, Bcc y From, si se trabaja con Outlook. Esto
significa que no es posible utilizar To.address, CC.address, Bcc.address,
From.address en modo Outlook.

MailRecipientCollection
Las propiedades y métodos disponibles para este tipo de datos son los siguientes:

Propiedad Tipo Acceso


Count Numérico Lectura

Método Parámetros Tipo


Add Recipient MailRecipient

178
Clear (ninguno)
Item Index Numérico
New Name Carácter
Address Carácter

PROPIEDADES

Count
Cantidad de elementos en la colección.

Sintaxis: &Message(...).Count

MÉTODOS

Add
Agrega un objeto de tipo MailRecipient a la colección.

Sintaxis: &Message(...).Add(Recipient)

El objeto es copiado y por ende si se modifican las propiedades del objeto


MailRecipient luego de llamar al método Add, el elemento dentro de la colección
seguirá teniendo las propiedades que tenía cuando se llamó al método Add.
Si el objeto pasado por parámetro tiene en la propiedad Addres la cadena vacía, la
llamada al método Add es ignorada.

Si el objeto pasado por parámetro tiene en la propiedad Name la cadena vacía, a la


copia que se creará en la colección se le asignará la propiedad Name igual a la
propiedad Address.

Clear
Vacía la colección. Todos los elementos de la colección son eliminados.

Sintaxis: &Message(...).Clear()

Item
Devuelve un objeto de tipo MailRecipient que esté almacenado en la colección.

Sintaxis: &Message(...).Item(Index)

Index debe estar comprendido entre 1 y el valor de la propiedad Count.

New
Devuelve un objeto de tipo MailRecipient que esté almacenado en la colección.

Sintaxis: &Message(...).New(Name, Address)

179
Crea un nuevo objeto de tipo MailRecipient dentro de la colección, en el nombre y
dirección especificados en los parámetros Name y Address respectivamente.
Si el parámetro Address es una cadena vacía, la llamada al método New es
ignorada.

Si el parámetro Name es una cadena vacía, al nuevo objeto que se creará en la


colección se le asignará la propiedad Name igual a la propiedad Address.

StringCollection

Propiedad Tipo Acceso


Count Numérico Lectura

Método Parámetros Tipo


Add String Carácter
Clear (ninguno)
Item Index Numérico

PROPIEDADES

Count
Cantidad de elementos en la colección.

Sintaxis: &Message(...).Count

MÉTODOS

Add
Agrega un objeto de tipo MailRecipient a la colección.

Sintaxis: &Message(...).Add(String)

El objeto es copiado y por ende si se modifican las propiedades del objeto


MailRecipient luego de llamar al método Add, el elemento dentro de la colección
seguirá teniendo las propiedades que tenía cuando se llamó al método Add.
Si el parámetro String es una cadena vacía, la llamada al método Add es ignorada.

Clear
Vacía la colección. Todos los elementos de la colección son eliminados.

Sintaxis: &Message(...).Clear()

Item
Devuelve un objeto de tipo MailRecipient que esté almacenado en la colección.

180
Sintaxis: &Message(...).Item(Index)

Index debe estar comprendido entre 1 y el valor de la propiedad Count.

Códigos y Mensajes de Error


Los valores posibles son: (O=OutlookSession,
I=SMTPSession/POP3Session, M=MAPISession):

Código Mensaje Modos


0 Ok O/I/M
1 Already logged in I/M
2 Not logged in I/M
3 Could not complete login I/M
4 Could not start Outlook. O
5 Could not open folder O/M
6 Invalid sender name I
7 Invalid sender address I
8 Invalid user name I
9 Invalid password I
10 Could not send message O/I/M
11 No messages to receive O/I/M
12 Could not delete message I
13 No main recipient specified O/I/M
14 Invalid recipient O/I/M
15 Invalid attachment O/I/M
16 Could not save attachment O/I/M
17 Invalid Authentication value I
18 Not enough memory I
19 Connection lost I
20 Timeout exceeded I
21 Memory allocation error I
22 Error receiving message O/M
23 The server does not recognize any of I
the supported authentication
methods
24 Authentication error I
25 User or password refused I
26 No current message O/I/M
27 Invalid NewMessages value O/I/M
28 Invalid EditWindow value O/M
29 POP3 server does not support I
NewMessages = 1

181
Consideraciones Generales
- Los métodos descritos anteriormente fueron implementados de forma tal
que devuelven (como si fueran funciones) el código de error, por lo que es
posible llamarlos como funciones.
Por ejemplo:
&Err = &OutlookSession.Send(Mensaje)

Ejemplos
A continuación se presentan ejemplos de Eventos en GeneXus que permiten el
envío y recepción de mails con los diferentes tipos de datos (OutlookSession,
MAPISession y SMTPSession/POP3Session).

OutlookSession
La variables &Envio y &Recibo deben estar definidas de tipo MailMessage,
&Mensaje debe ser de tipo OutlookSession y las variables &DirTo y &DirCc deben
ser de tipo MailRecipient.

Event 'Enviar'
&DirTo.Address = ‘isidoro@cañones.com
&DirTo.Name = ‘Isidoro Cañones’
&Envio.To.Clear()
&Envio.To.Add(&DirTo)

&DirCc.Address = ‘cachorra@bazuka.com
&DirCc.Name = ‘Cachorra Bazuka’
&Envio.Cc.Clear()
&Envio.Cc.Add(&DirCc)

&Envio.Subject = ‘Te invito a mi fiestita’


&Envio.HTMLText = ‘El próximo Sábado festejo mi cumpleaños, por favor no
faltes.’

&Mensaje.Editwindow = 1
// Si se utiliza Outlook no es necesita realizar el login, directamente se usa el
método Send

&Mensaje.Send(&envio)
if &Mensaje.ErrCode <> 0
msg(&Mensaje.ErrDescription)
endif
EndEvent

Event 'Recibir'
&Mensaje.NewMessages = 1
&Mensaje.ChangeFolder("Inbox")
&Mensaje.Attachdir = ‘d:\archivos’

// Recibo el mensaje

182
&Mensaje.Receive(&Recibo)
&Mensaje.MarkAsRead()
&From = &Recibo.From.Address
&Sub = &Recibo.Subject
&Textohtml = &Recibo.HTMLText
EndEvent

MAPISession
La variables &Envio y &Recibo deben estar definidas de tipo MailMessage,
&Mensaje debe ser de tipo MAPISession y las variables &DirTo y &DirCc deben ser
de tipo MailRecipient.

Event 'Enviar'
&DirTo.Address = ‘isidoro@cañones.com
&DirTo.Name = ‘Isidoro Cañones’
&Envio.To.Clear()
&Envio.To.Add(&DirTo)

&DirCc.Address = ‘cachorra@bazuka.com
&DirCc.Name = ‘Cachorra Bazuka’
&Envio.Cc.Clear()
&Envio.Cc.Add(&DirCc)

&Envio.Subject = ‘Te invito a mi fiestita’


&Envio.HTMLText = ‘El próximo Sábado festejo mi cumpleaños, por favor no
faltes.’

// En modo 'M', se debe realizar el login, enviar el mensaje, y hacer el logout


&Mensaje.Profile = ‘Mi perfil’
&Mensaje.Editwindow = 1

&Mensaje.Login()
&Mensaje.Send(&Envio)
if &Mensaje.ErrCode <> 0
msg(&Mensaje.ErrDescription)
endif

&Mensaje.Logout()
EndEvent

Event 'Recibir'
&Mensaje.Attachdir = ‘d:\archivos’
&Mensaje.NewMessages = 1
&Mensaje.Profile = ‘Mi perfil’

&Mensaje.Login()
&Mensaje.Receive(&Recibo)
&Mensaje.MarkAsRead()
&Sub = &Recibo.Subject
&Textohtml = &Recibo.HTMLText
&From = &Recibo.From.Address

183
&Fechaenv = &Recibo.DateSent
&Fecharec = &Recibo.DateReceived
&Mensaje.Logout()
EndEvent

SMTPSession/POP3Session
La variables &Envio y &Recibo deben estar definidas de tipo MailMessage,
&MensSMTP debe ser de tipo SMTPSession y &MensPOP3 de tipo POP3Session y
las variables &DirTo y &DirCc deben ser de tipo MailRecipient.

Event 'Enviar'
&DirTo.Address = ‘isidoro@cañones.com
&DirTo.Name = ‘Isidoro Cañones’
&Envio.To.Clear()
&Envio.To.Add(&DirTo)

&DirCc.Address = ‘cachorra@bazuka.com
&DirCc.Name = ‘Cachorra Bazuka’
&Envio.Cc.Clear()
&Envio.Cc.Add(&DirCc)

&Envio.Subject = ‘Te invito a mi fiestita’


&Envio.HTMLText = ‘El próximo Sábado festejo mi cumpleaños, por favor no
faltes.’

// El servidor SMTP que se utiliza en este caso necesita autenticación.


&MensSMTP.Host = ‘Servidor SMTP’
&MensSMTP.Sender.Name = ‘Patoruzu’
&MensSMTP.Sender.Address = ‘patoruzu@hotmail.com’
&MensSMTP.Authentication = 1
&MensSMTP.UserName = ‘Mi usuario’
&MensSMTP.Password = ‘Mi contraseña’

&MensSMTP.Login()
&MensSMTP.Send(&envio)
if &MensSMTP.ErrCode <> 0
msg(&MensSMTP.ErrDescription)
endif

&MensSMTP.Logout()

EndEvent

Event 'Recibir'
&MensPOP3.Host = ‘Servidor POP3’
&MensPOP3.UserName = ‘Mi usuario’
&MensPOP3.Password = &contra
&MensPOP3.NewMessages = 1

&MensPOP3.Login()
&MensPOP3.Receive(&Recibo)

184
&From = &Recibo.From.Address
&Fechaenv = &Recibo.DateSent
&Fecharec = &Recibo.DateReceived
&Sub = &Recibo.Subject
&Textohtml = &Recibo.HTMLText
EndEvent

Compatibilidad con versiones anteriores de GeneXus


Las funciones de GXoffice que existían hasta la versión 7.0 de GeneXs, se siguen
soportando, el generador funciona de forma tal que mapea internamente estas
funciones para que utilicen estos nuevos tipos de datos.
Estas funciones se soportan unicamente por compatibilidad, por lo que no se
recomienda hacer nuevas implementaciones con las mismas pues las nuevas
funcionalidades no serán implementadas en dichas funciones.

Tipo de Datos HttpClient, HttpResponse y


HttpRequest

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).
Lenguajes: Java – Visual Basic – Visual Fox– C/SQL – C#.
Interfaces: Web Form, Win Form.

Descripción
Los tres tipos de datos que se definen para interactuar con http son:

HttpClient
Permite armar un request, enviarlo a una URL y leer los resultados.

HttpResponse y HttpRequest
Permiten leer los datos del request y grabar el response. Son objetos disponibles
solo en WebProcs.

185
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 menaje 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

186
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’.
Ejemplo: AddVariable(“CliCod”, &CliCod)
<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

AddAuthentication(<Method>, <Realm>, <User>, <Password>)


Se autentifica con <User> y <Password> al dominio <Realm> utilizando el
tipo de autenticación <Method>
<Method>- Integer (Pueden utilizarse las propiedades Basic y Digest)
<Realm>- String
<User>- String

187
<Password>- String

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

188
ErrDescrption
Retorna el menaje del error si ocurrió alguno en algún comando.
Tipo- String

MÉTODOS

GetVariable(<Variable>)
Retorna en un String el valor con el que viene cargada la
<Variable> en el post.
<Variable>- String

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

189
AddFile(<Value>)
Agrega el contenido del archivo al buffer de datos a enviar.
<Value>- String

Interacción con XML


Estos objetos permiten la interacción con los objetos XMLReader y XMLWriter. Para
ello existen los siguientes métodos:

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 para enviar un XML en el body de un http request.

XMLWriter.openResponse(HttpResponse)
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.

El XML a enviar tiene la forma

<parameters>
<a>valor</a>
<b>valor</b>
</parameters>

El XML que se devuelve es igual, con los valores de ‘A’ y ‘B’ modificados.

El programa ‘cliente’ sería:

&Client de tipo HttpClient


&Writer de tipo XMLWriter
&Reader de tipo XMLReader

// Determino el host y el puerto a donde hacer el request


&client.host = "localhost"
&client.port = 88

// Agrego el XML al request


&writer.openRequest(&client)
&writer.WriteStartElement("parameters")

190
&writer.WriteElement("a", &A)
&writer.WriteElement("b", &B)
&writer.WriteEndElement()
&writer.close()

// Hago el POST al webproc


&client.execute("POST", "/servlet/awebproc")

// Leo el XML que devuelve y lo cargo en las variables internas

&reader.openResponse(&client)
&reader.read()

&reader.read()
&a = val(&reader.value)

&reader.read()
&b = val(&reader.value)

&reader.close()

El programa ‘servidor’ seria el siguiente WebProc:

&Request de tipo HttpRequest


&Response de tipo HttpResponse
&Writer de tipo XMLWriter
&Reader de tipo XMLReader

// Leo los parámetros del XML


&reader.openRequest(&Request)
&reader.read()
&reader.read()
&a = val(&reader.value)
&reader.read()
&b = val(&reader.value)
&reader.close()

// Le sumo uno a cada valor


&a = &a + 1
&b = &b + 1

// Grabo los parámetros en el response

&writer.openResponse(&Response)
&writer.WriteStartElement("parameters")
&writer.WriteElement("a", &A)
&writer.WriteElement("b", &B)
&writer.WriteEndElement()
&writer.close()

191
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:

java -Dhttp.proxyHost=your.proxy.com -Dhttp.proxyPort=XX <mainclass>

Consideraciones para el generador C/SQL


La propiedad secure del tipo de datos HTTPClient en el generador C/SQL solo puede
ser utilizada en clientes Microsoft.

192
Funciones
Funciones estándar

Introducción
A partir de la versión 7.5 de GeneXus todas funciones soportadas por GeneXus
pasan a ser funciones estándar, por más que las mismas sólo estén disponibles
para algunos generadores.

Hasta ahora si una función1 no estaba implementada para todos los generadores no
se consideraba como estándar y para poder salvarla y especificarla se debería
modificar la preferencia “Function” al valor “Allow non-standatd function on saving”
y “Allow non-standatd function when specifying” en Diseño y en
Prototipo/Producción respectivamente.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Reportes, Procedimientos.
Lenguajes: Cobol, RPG, Visual FoxPro, Visual Basic, Java, C/SQL, C#
Interfaces: Web, Win.

Descripción
Todas aquellas funciones1 que estén implementadas para algún generador de
GeneXus se denomina Funciones Estándar y las mismas se clasifican en:

 Normales: Funciones que existen para todos los generadores.


Ejemplo: YMDTOD, GXMLines.
 No Portables: Funciones que existen solo para algunos generadores.
Ejemplo: WriteRegKey, funciones para manejo de texto: dfw y dfr.
 Discontinuadas (Deprecated): Funciones para las cuales existe otra
nueva que la sustituye, por ejemplo: XTOD, UDF.

Las mismas se diferencian con distintos colores en el editor GeneXus. Las Normales
aparecen en Marrón, las No Portables en Rojo y las Discontinuadas en Marrón claro.

Para poder grabar funciones NO estándar será necesario modificar la


preference/propiedad “Function”, ya sea a nivel de modelo u objeto (esto último es
posible a partir de la versión 7.5). De lo contrario aparecerá el mensaje “Error: Not
valid function” al salvar o especificar el objeto.

1
Al hablar de funciones en este documento nos referimos tanto a las funciones
propiamente dichas como a las propiedades, métodos y eventos, de controles
soportados por GeneXus.

193
Funcion FileExist()

Introducción
El objetivo de esta función es permitir verificar la existencia de un archivo, en una
cierta ubicación.

Alcance
Objetos : Transacciones, WorkPanels, WebPanels, Procedimientos, Reportes
Lenguajes: C/SQL, Java, Visual Basic y Visual FoxPro
Interface: Win, Web

Descripción
Esta función recibe un string como parámetro con el camino y nombre del archivo a
verificar y retorna un 1 en caso de éxito y 0 en otro caso.

La búsqueda del archivo se realiza en el equipo donde esta ejecutando el programa


que invoca a esta función.
Si es usada en Web objects, se buscará en el Servidor Web. Para el resto de los
objetos en el caso de C/SQL y Java, se realizará la búsqueda en el servidor de
procesos.

Sintaxis:

&res = FILEEXIST(&archivo)

Siendo:
- &archivo, un string con el nombre y camino del archivo
- &res, un numérico que retorna 1 en caso de éxito y 0 en caso contrario.

Ejemplo
Camino relativo:

&archivo = “misdoc\docu.doc”
&res = FILEEXIST(&archivo)

El camino relativo se toma a partir del directorio por defecto donde se encuentra el
programa. En el caso de objetos C/SQL y Java se recuerda que el directorio se
considera en el servidor de procesos y no en la estación de trabajo.

En el caso de Web Objects, el directorio lo determina el Web Server, por lo que


normalmente será conveniente usar caminos absolutos.

El caso &archivo = “C:\misdoc\docu.doc” también es de camino relativo ya que


depende de la maquina donde ejecute el programa. Por ej, si es un web panel

194
buscara el archivo docu.doc en el disco C del Web Server, mientras que si se utiliza
en un procedimiento VB será el disco C de la estación de trabajo.

Camino absoluto:

&archivo = “\\server\c\misdoc\docu.doc”
&res = FILEEXIST(&archivo)

Nota: Es necesario tener acceso de lectura sobre los archivos especificados en el


camino.

Función DeleteFile

Introducción
Se implementó la función DELETEFILE, la cual permite borrar un archivo.

Alcance
Objetos: Procedimientos, Reportes, Transacciones, Web panels, Work panels
Generadores: C/SQL – JAVA – VB – VFP – C#
Interfaces: Web y Win

Descripción
Sintaxis: &var = deletefile(&filename)

&var N(1) Devuelve el éxito (1) o no (0) de la ejecución de la función.


&filename C(X) Parámetro que indica path y nombre del archivo que se
desea borrar. Tener en cuenta que este path debe ser
absoluto para el lugar donde la aplicación este corriendo
esta función.

Ejemplo
&filename= “c:\Temp\report.gxr”
&var=deletefile(&filename)

Funciones de lectura y escritura del registro de


Windows

Introducción
A partir de la versión 7.5, se incluyen funciones que permiten escribir y leer

195
información en el registro de Windows desde GeneXus.

Alcance
Objetos: Transacciones, Workpanels, Webpanels, Procedimientos y Reportes.
Lenguajes: Visual Basic, Visual FoxPro

Descripción
Permiten tener un manejo avanzado del registro de Windows, por eso se
recomienda utilizarlas con precaución.

Algunos usos de estas funciones serían, poder guardar configuración del usuario
conectado, o preferencias de alguna aplicación. Así como también poder obtener la
ubicación del directorio temporal de la máquina, o el idioma del sistema operativo.

En particular, la función que permite escribir en el registro de Windows, se puede


utilizar para guardar la información de la ubicación de la base de datos local de una
aplicación GeneXus, que luego se accederá con la Keyword RegKey (este método es
el que sustituye al archivo con extensión INI para indicar la ubicación de la base de
datos local).

Funciones
WRITEREGKEY
Permite ingresar información en el registro de Windows.

Sintaxis: &Ret = WriteRegKey(&Path, &Value)

&Path Es el camino donde se va a guardar el valor.


Es de tipo carácter.
&Value Es el valor a configurar en el &Path especificado, también es de
tipo carácter.
&Ret Es el valor devuelto por la función luego de realizar la operación.
Si el valor devuelto es 0, significa que no hubo errores, si es
diferente de 0 es porque hubo errores.
Esta variable es de tipo numérico.

READREGKEY
Permite leer información del registro de Windows.

Sintaxis: &String = ReadRegKey(&Path)

&Path Camino desde donde se desea obtener el valor.

196
Es de tipo carácter.
&String Valor almacenado en el &Path especificado.
Es de tipo carácter.

Consideraciones Generales
• No es posible grabar cualquier sección del registro de Windows, sólo se
permiten grabar valores bajo las siguientes carpetas:
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\Software
HKEY_CURRENT_CONFIG\Software

• En Windows NT y Windows 2000 es necesario tener permisos para actualizar


HKEY_CURRENT_CONFIG y HKEY_LOCAL_MACHINE

Ejemplo
El siguiente ejemplo muestra el uso de estas funciones desde GeneXus.

Event Start
&path = 'HKEY_LOCAL_MACHINE\Software\Empresa'
&Value = 'C:\Program Files\Aplicacion'
EndEvent // Start

Event 'Grabar'
&Ret = WriteRegKey(&Path, &Value)
EndEvent // 'grabar'

Event 'Leer'
&String = ReadRegKey(&Path)
EndEvent // Enter

En este ejemplo se crea un nuevo String Value debajo de la clave


‘HKEY_LOCAL_MACHINE\Software’, de nombre ‘Empresa’ y el valor asociado será ‘C:\Program
Files\Aplicación’.

Funciones de Encriptación

Introducción
En algunos casos es necesario tener información segura en las aplicaciones no Web,
por lo que se necesita tener funciones de encriptación que puedan ser utilizadas
en cualquier objeto GeneXus.

Para esto, se implementaron funciones de encriptación que pueden ser usadas en


cualquier objeto GeneXus, para encriptar y desencriptar información.

197
Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: C/SQL, Java, Visual Basic, Visual FoxPro, C#
Interfaces: Web, Win

Descripción
Las funciones que se implementaron son las siguientes:

GetEncryptionKey
Esta función genera una nueva clave de encriptación de hasta 32 caracteres de
largo.
Se utiliza para inicializar la encriptación.

Sintaxis: &Res = GetEncryptionKey()

&Res Carácter Es el valor de la clave que se utilizará para la encriptación.


Para generar una nueva clave se debe ejecutar la función
nuevamente.

Encrypt64
Encripta el valor recibido como parámetro, utilizando la clave indicada.

Sintaxis: &Res = Encrypt64 (&Texto, &Clave)

&Res Carácter Es el resultado de la encriptación del parámetro utilizando la clave


generada por la función.
&Texto Carácter Parámetro a ser encriptado.
&Clave Carácter Clave que se utilizará para la encriptación, generada por la función
GetEncryptionKey().

Decrypt64
Desencripta el valor recibido en el primer parámetro, utilizando la clave indicada.

Sintaxis: &Res = Decrypt64 (&Texto, &Clave)

&Res Carácter Es el resultado de la desencriptación.


&Texto Carácter Parámetro a ser desencriptado.
&Clave Carácter Clave que se utilizará para la desencriptación, generada por la

198
función GetEncryptionKey().

Consideraciones generales
• Siempre se debe trabajar con claves generadas por la función
GetEncryptionKey, no se puede utilizar cualquier valor para la clave.
Las claves que se deben utilizar para la encriptación deben ser números
Hexadecimales, de un largo determinado y en lo posible aleatorias. Por esta
razón, dado que el algoritmo es público, la fortaleza de esta implementación
está en la clave por lo que se recomienda fuertemente utilizar esta función
para generar las claves, ya que garantiza un nivel de seguridad mayor.
• El valor devuelto por la función Encrypt64 es codificado en Base64. El largo
del valor devuelto es el largo del texto ajustado a un múltiplo de 16 bytes
(por ejemplo, si el texto tiene largo 1, se ajusta a largo 16), multiplicado por
4 dividido 3.
• Tener en cuenta que la clave para encriptar y desencriptar debe ser la
misma, por eso si se encripta algún parámetro y se guarda en una base de
datos por ejemplo, para ser utilizado pasado un tiempo, también se debe
guardar la clave, porque para realizar la desencriptación se debe utilizar la
misma clave.
• Las funciones están basadas en el algoritmo 'TwoFish'
(http://www.counterpane.com/twofish.html) y son las mismas que se usan
para el manejo de parámetros encriptados en los Web Panels.

Ejemplos
Estas funciones pueden ser útiles en el caso que se quiera guardar información
encriptada en la base de datos.
En este caso se pueden utilizar las funciones de la siguiente forma:

Se puede tener un procedimiento que encripte la información antes de insertarla en


la base de datos.

Procedimiento
.........
&Clave = GetEncryptionKey() // Genera la clave de encriptación.
&Var1 = Encrypt64(&Info, &Clave) // Devuelve la encriptación de la
información, utilizando la clave generada
anteriormente, este sería el valor que se
guarda en la base de datos.

// Inserción del registro en la base de datos.


New
....
Clave = &Clave
Info = &Var1
EndNew

199
Cuando se necesite el valor original de la información se debe obtener de la
siguiente forma:

&Clave = Clave // Se obtiene la clave con la que se


realizó la encriptación
&Var2 = Decrypt64(Info, &Clave) // Se desencripta la información
utilizando la misma clave que se utilizó
para encriptar

En &Var2 se tendrá el valor original del atributo Info.

Función Sleep

Introducción
Se implementó la función SLEEP. Permite hacer una pausa por una determinada
cantidad de segundos en la ejecución de un programa.

Alcance
Objetos: Procedimientos, Reportes, Transacciones, Web panels, Work panels
Generadores: C/SQL – VB – JAVA – VFP – C#
Interfaces: Web y Win

Descripción
Sintaxis: &var = sleep(<segundos>)
<segundos> puede ser una variable o una constante

Esta función sirve por ejemplo para implementar un "demonio" que se ejecute cada
tantos segundos. La idea es tener un loop infinito y que se espere una cantidad de
segundos entre cada iteración, por lo que se recomienda su uso en procesos tipo
‘batch’ mas que en aplicaciones interactivas, donde la aplicación se ‘muere’
mientras no finaliza el timeout especificado.

Consideraciones para Visual Basic


La cantidad de segundos tiene un rango: 0.. 2^15 (32768 seg.). Este límite queda
establecido por la función de Windows que recibe Milisegundos y con mas de 2^ 22
se va de rango con valores mayores que 2^16 - 1 o negativos que los los toma
como infinito. La función controla este límite, y no hace nada en caso de pasar el
límite y retorna 0.

Ejemplo
&var=sleep(15) – Espera 15 segundos y en &var devuelve 0

200
&var=sleep(0) – Espera 0 segundos y en &var devuelve 0

&var=sleep(-10) – Espera 0 segundos y en &var devuelve 0

Función StrSearch

Introducción
La función StrSearch permite buscar un string dentro de otro.
Esta función posee dos variantes, la función StrSearch y la función StrSearchRev.
La diferencia entre estas funciones es la dirección de búsqueda del string,
StrSearch busca de izquierda a derecha mientras que StrSearchRev lo hace en el
sentido contrario, de derecha a izquierda.

Alcance
Objetos: Procedimientos, Reportes, Transacciones, Web panels, Work panels
Generadores: C/SQL – Visual Basic - Java – Visual FoxPro – C#
Interfaces: Web y Win

Descripción
Se implementaron las siguientes funciones standard en GeneXus:

StrSearch( Str1, Str2 [, StartChar ] )


StrSearchRev( Str1, Str2 [, StartChar ] )

StrSearch retorna la posición (índice entero empezando en 1) del string Str1 en


dónde se encontro el string Str2. Busca de adelante hacia atrás.
Opcional es la posición de inicio de la búsqueda, en caso de omitirse se empieza de
la posición 1 del string Str1.

StrSearchRev funciona de igual forma que la función anterior pero busca en el


orden inverso. Si se omite el último parámetro busca a partir de la posición final de
Str1, hacia atrás.
En ambas funciones si la búsqueda no es exitosa se retorna 0.

StrSearch
Sintaxis: &Ret = StrSearch( &Str1, &Str2 [, &StartChar] )

&Str1 String sobre el cual se va a realizar la búsqueda. Puede ser de tipo


Char, Varchar o Long Varchar.

&Str2 String de búsqueda. Puede ser de tipo Char, Varchar o Long Varchar.

&StartChar Opcional. Indica la posición de comienzo de la búsqueda. Esta

201
variable es de tipo Numérico positivo.

&Ret Es el valor devuelto por la función. Si es cero indica que la búsqueda


no fue exitosa, de lo contrario indica la posición dónde se encontró el
string. Esta varible es de tipo Numérico positivo.

StrSearchRev
Sintaxis: &Ret = StrSearchRev( &Str1, &Str2 [, &StartChar] )

&Str1 String sobre el cual se va a realizar la búsqueda. Puede ser de tipo


Char, Varchar o Long varchar.

&Str2 String de búsqueda. Puede ser de tipo Char, Varchar o Long varchar.

&StartChar Opcional. Indica la posición de comienzo de la búsqueda. Esta


variable es de tipo Numérico positivo.

&Ret Es el valor devuelto por la función. Si es cero indica que la búsqueda


no fue exitosa, de lo contrario indica la posición dónde se encontró el
string. Esta varible es de tipo Numérico positivo.

Consideraciones Generales

El parámetro StartChar es de tipo Numérico positivo e indica la posición inicial de


búsqueda dentro de Str1. Si es 0 ambas funciones retornan 0.

La comparación entre caracteres es case-sensitive, o sea que ‘a’ es distinto de ‘A’.

Si Str1 esta vacío o el largo es menor que Str2 ambas funciones retornan 0 ya que
no se puede realizar la búsqueda.

Si Str2 esta vacío retorna StartChar si fue inicializado o 1 en otro caso. Para el caso
de StrSearchRev se retorna StartChar o StrLen.

Ejemplo

&str1 ="Prueba de la función StrSearch"

StrSearch(&str1,"s") retorna 0 (no se encontró)

StrSearch(&str1,"a" ) retorna 6

StrSearch(&str1, "a" , 7) retorna 12

202
StrSearchrev(&str1, "a") retorna 27

StrSearch(&str1, "la" ,20) retorna 11

Función StrReplace

Introducción
La función StrReplace permite reemplazar las ocurrencias de un string por
otro.

Alcance
Objetos: Procedimientos, Reportes, Transacciones, Web panels, Work panels
Generadores: C/SQL – Visual Basic - Java – Visual FoxPro – C#
Interfaces: Web y Win

Descripción
La función StrReplace retorna un string resultado de reemplazar todas las
ocurrencias del string &Str2 que se encuentren en &Str1, por el string &Str3.

Sintaxis: &Ret = StrReplace( &Str1, &Str2, &Str3 )

&Str1 Es el string sobre el cual se quieren hacer los reemplazos, el string


fuente. Esta variable puede ser de tipo Char, Varchar o Long varchar.

&Str2 Es el string que se va a buscar y reemplazar. Esta variable puede ser de


tipo Char, Varchar o Long varchar.

&Str3 Es el string que reemplaza al buscado. Esta variable es de tipo Char,


Varchar o Long varchar.

&Ret Es es string retornado por la función con los reemplazos realizados. Esta
variable puede ser de tipo Char, Varchar o Long varchar.

Consideraciones Generales

El reemplazo se realiza en forma simultánea. Es decir, cuando se inserta un texto


de reemplazo, el texto insertado no participa en las siguientes búsquedas del
patrón.

La función diferencia entre mayúsculas y minúsculas, “a” es distinto de “A”.

203
Ejemplo

&Source = “Prueba#de#la#función#StrReplace”

&Ret = StrReplace(&Source, “#”, “ “)

En este caso la variable &Ret tendría el siguiente texto sería el resultado de


reemplazar todas las ocurrencias del carácter ‘#’ en &Source por el espacio en
blanco.

&Ret = “Prueba de la función StrReplace”

Función Isnull

Introducción
La función IsNull() permite determinar si el valor de un atributo es NULL del DBMS.

Alcance
Objetos: Todos los objetos
Lenguajes: C/SQL - Java - Visual Basic – Visual FoxPro – C#
DBMS: SQL Server, Oracle, Informix, DB2
Interfaces: Win/Web

Descripción
En algunos casos es necesario determinar si el valor de un atributo se corresponde
con el NULL del DBMS. Este valor es diferente al nullvalue (obtenido por
ej.utilizando la función Nullvalue(<Atributo>), que GeneXus determina según el
tipo de dato/DBMS.

El valor NULL en un atributo pudo haberse generado por ej.por no haber


instanciado el atributo en un New (teniendo la preference “Initialize not referrenced
attributes” con el valor “No”). Tambien puede ser necesario distingirlo de otros
valores cuando se acceden a tablas externas.

Cuando la función se utiliza incluyéndola en un Where o Condition que se optimice


(esto significa que la condición se resuelve en el servidor). en la sentencia SQL se
traducirá como ...Atributo IS NULL.

Sintaxis:

IsNull(<Atributo>)

204
Retorno:

Valor booleano

Ejemplo
For each
Where IsNull(CliNom)
.
.
Endfor

Este For each navegaría los registros de Clientes que tuvieran el atributo CliNom
con el valor NULL del DBMS.

Otro ejemplo:

For each
If IsNull(CliNom)
.
endif
.
.
Endfor

Este ejemplo sería similar al For each anterior, y debería navegar los mismos
registros, la diferencia sería que en el primer caso la condición se resolvería en el
servidor, y en el segundo ejemplo se haría en el cliente.

Consideraciones Generales
• La utilización de la función solo es válida dentro de For eachs y Conditions
de subfiles con tabla base.

• Para el resto de los generadores y DBMSs, la función IsNull() se comporta


igual que la función Null().

Nombres Largos en función UserId() y Workstation()

Introducción
Se modifica el comportamiento de la funciones userid y workstation en Visual Basic y
Visual Fox.

205
Alcance
Objetos: Transacciones, Workpanels, Webpanels, Procedimientos y Reportes.
Lenguajes: Visual Basic y Visual FoxPro
Interfaces : Win y Web

Descripción
Hasta la versión 7.0 se truncaba el nombre de usuario y Workstation a un máximo
de 10 caracteres.

Por ejemplo al hacer la asignación :


&usuario = Userid()

El variable usuario tomaba el valor "Administra".


A partir de esta versión el valor es "Administrator"

Si se trunca si la variable esta definida de N caracteres y el usuario que se le asigna


es mayor al tamaño de la variable

Los generadores RPG y Cobol no cambia porque los usuarios son de 10 caracteres
max.

Los generadores Java y C nunca truncaron.

COMPATIBILIDAD HACIA ATRAS


Para mantener el comportamiento anterior (truncar a 10 caracteres) es
necesario definir un archivo config.gx con la seccion
wa0004=Y

Esto funciona con VFP y VB, con FPW y Xbase no cambiaron el comportamiento
(siempre truncan).

206
Funcionalidades Generales

Call dinámico

Introducción
El objetivo de esta funcionalidad es poder realizar llamadas a objetos GeneXus en
forma dinámica.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: Java, Visual Basic, Visual FoxPro, c#, C/SQL, Cobol, RPG
Interfaz: Web, Win

Descripción
Esta funcionalidad permite que el especificador transforme un CALL dinámico (que
hace referencia a una variable o atributo como primer parámetro) en un DO CASE
con tantos CASEs como programas existan en la KB con la misma cantidad y tipo
de parámetros referenciados en el CALL. Es una alternativa muy interesante, sobre
todo para aquellos lenguajes que no soportan el CALL variable.

El árbol de CALLs de GX se actualiza permitiendo tener información de quién llama


a quién.

Para RPG y Cobol, el chequeo de tipos de parámetros es por igual (exacta)


definición. En los demás generadores el criterio es el siguiente:

• Los numéricos tienen que ser exactamente iguales sin importar si tienen
signo o no.

• Los parámetros de tipo carácter (char, vchar y long varchar) se consideran


iguales y se controla que el largo del parámetro en el que invoca sea menor
o igual al invocado.

• Se excluyen de la expansión del call los objetos que el generador no puede


generar.

Sintaxis
CALL(&OBJECT, [PARM1, PARM2,…])

Donde &object es una variable o atributo de tipo string que contiene el nombre del
objeto GeneXus a llamar.

207
Consideraciones Generales
Preference Expand dynamic calls
Para poder utilizar esta funcionalidad se debe configurar la Preferencia Expand
dynamic calls en Yes (el valor por defecto es No para todos los generadores).

Consideraciones
 Los parámetros efectivos que aparecen en el CALL dinámico no pueden ser
del tipo array (esto es controlado por el especificador).

Protocolo SOAP

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
Lenguajes: C/SQL - Java - Visual Basic – Visual FoxPro – C#
Interfaces: Win/Web

Los objetos llamadores son los que invocan servicios mediante SOAP

Objetos llamados (Servidores)


Objetos: Procedimientos y Reportes
Lenguajes: C/SQL - Java - Visual Basic – C#
Interfaces: Web

208
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.

Los programas Clientes realizan las tareas necesarias para ensamblar el


mensaje SOAP, hacer la invocación http, y desensamblar la respuesta,
obteniendo los parametros modificados en forma automática. Todo esto
se realiza en forma automática y transparente para el usuario.

Locations
Para indicar cual va a ser la ubicación de los servicios invocados se utiliza un
esquema conocido como Locations.

Manejo de errores

209
Comportamiento frente a un error

Si al hacer un llamado SOAP desde un objeto GeneXus se produce un error,


normalmente la ejecución del llamador se cancelará mostrando el error que ocurrió.

Si el objeto llamado es un procedimiento o reporte GeneXus, es posible indicar que


se detenga la ejecución de los programas llamadores en caso de fallar la llamada.
Esto se hace mediante la propiedad ‘Cancel Caller Execution on 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().

Códigos de error en el cliente

Los posibles códigos de error que pueden ser retornados mediante la función
GetSOAPErr() son los siguientes:

• 0: Operación completada con éxito.

• 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.

210
• Menor que 0 y mayor que -10000: Sucedió un error al interpretar el XML de
respuesta. Sucederá por lo general si la respuesta no es XML o no es XML
bien formado. Si se toma el valor absoluto del código de error el resultado
corresponderá a un código de error del objeto XMLReader. De todas formas,
getSOAPErrMsg() retornará una descripción del error.

• Menor que -10000: Sucedió un error en la comunicación HTTP. Si se toma el


valor absoluto del código de error y se le resta 10000 el resultado
corresponderá a un código de error del objeto HTTPClient. De todas formas,
getSOAPErrMsg() retornará una descripción del error.

• -20001: La respuesta recibida es un XML válido pero no es un mensaje


SOAP válido.

• -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.

• -20006: Sucedió un error no identificado. En este caso getSOAPErrMsg()


retornará un mensaje conteniendo el código y el mensaje de error
retornados por el servidor.

• -20007: Nombre de location no válido. Sucede cuando se llama a la función


GetLocation(Nombre) con un nombre de location que no está definido para
ningún objeto en la KB.

Códigos de error en el servidor

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.

• -20001: El mensaje recibido es un XML válido pero no es un mensaje SOAP


válido (igual que en el cliente).

• -20002: El método llamado no es el esperado. (El método SOAP de los


objetos GeneXus siempre se llama “Execute”).

Casos

211
Veremos a continuación diferentes combinaciones entre Clientes y Servidores, y su
implementación en cada caso:

CLIENTE GENEXUS – SERVIDOR GENEXUS


El Servidor es un procedimiento o reporte con ‘Call Protocol’ = ‘SOAP’, el Cliente
es cualquier otro objeto de la KB haciendo un call(). La ubicación del Servidor se
configura utilizando el esquema de locations.

Los objetos Cliente y Servidor pueden estar generados con diferentes


generadores, teniendo en cuenta la sección ‘Alcance’:

Cliente C/SQL Java Visual Visual


Basic FoxPro
Servidor

C/SQL    
(*) (*) (*) (*)
Java    

Visual Basic    
Visual Fox
X X X X

(*) – El generador C/Sql adoptó 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 ahora.

Un caso particular de lo anterior es si el Servidor es un objeto de otra KB. En


este caso es posible invocarlo configurando el location, creando en la KB del
Cliente un objeto ‘dummy’ con el mismo nombre y parámetros que el objeto
Servidor, y haciendo un call() a dicho objeto desde el objeto Cliente.

CLIENTE NO GENEXUS – SERVIDOR GENEXUS


El Servidor es un procedimiento o reporte GeneXus con ‘Call Protocol’ = ‘SOAP’.

Por la naturaleza del protocolo SOAP los programas generados con GeneXus

212
pueden ser invocados por cualquier cliente SOAP no generado por GeneXus.

La información acerca de cómo invocarlo se encuentra en el archivo WSDL (Web


Services Description Language) que es generado automáticamente. Dicho
archivo se obtiene pasándole el parámetro wsdl a la URL del servicio, en el
ejemplo anterior sería:

http://localhost:80/c/sqlsolis/prg/nombredeprograma?wsdl

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. Por
mas información consultar la documentación del Help HTML.

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.

CLIENTE GENEXUS – SERVIDOR NO GENEXUS


Si bien el protocolo permite llamar a cualquier servicio SOAP sin necesidad de
que este sea un programa GeneXus, por el momento no es posible especificar
que un programa externo debe llamarse vía SOAP, ni tampoco describir sus
parámetros.

Igualmente es posible invocar a un servicio web externo utilizando los tipos de


datos HttpClient, XmlWriter y XmlReader. Esta disponible un ejemplo en el sitio
de GeneXus Open Source.

Consideraciones Generales

• No es posible especificar que un programa externo debe llamarse vía SOAP,


ni tampoco describir sus parámetros.

• No se esta generando correctamente en el WSDL el Help del objeto cuando


se tienen líneas con mas de 75 caracteres, pudiendo truncarse alguno de
ellos.

213
Reportes PDF

Introducción
Se implementó la generación de reportes GeneXus con formato PDF además de los
formatos ya soportados (txt, gxr, rtf).

Con los reportes PDF se cuenta con mayor potencialidad para el desarrollo de
aplicaciones web. El reporte generado como PDF puede visualizarse directamente
desde el browser.

Alcance
Objetos: Reportes
Generadores: C/SQL – VB – JAVA
Interfaces: Web y Win

Descripción
Para generar un reporte como PDF se debe utilizar la regla ‘output_file’ de la
siguiente forma:

output_file("test.pdf", "pdf");

Nota: El nombre de archivo debe contener la extensión pdf, es decir que la misma
no se asume.

PDF en el WEB
También es posible utilizar la regla Output_file en reportes y procedimientos para
poder ejecutarlos desde el web. Para ello es necesario setear la propiedad CALL
PROTOCOL = http. Recordar que el reporte o procedimiento puede ser invocado
desde el browser y por consiguiente debe ser main.

En estos casos el nombre del archivo se ignora. Los documentos se generan


directamente en memoria, redirigiendo la salida (cada vez que se completa una
página) a la respuesta http (http response). Nótese que al redirigir cada página a la
salida http se genera la respuesta al web browser a medida que el reporte se
ejecuta, otra ventaja es que no se generan archivos temporales en el servidor web.

Nota: En este caso el reporte es “ejecutado” dos veces: una vez por el browser y
otra vez por el acrobat reader.

También es posible abrir el acrobat reader e ingresar directamente la URL.

Tamaño de páginas
Se soportan todos los tamaños de página que es posible definir en Genexus, a
saber:

214
Tipo Medidas
Carta 8 1/2 x 11 pulgadas
Oficio 8 1/2 x 14 pulgadas
Ejecutivo 7 1/4 x 10 1/2 pulgadas
A4 210 x 297 mm
A5 148 x 210 mm
B5 182 x 257 mm
Sobre #9 3 7/8 x 8 7/8 pulgadas
Sobre#10 10 4 1/8 x 9 ½ pulgadas
Sobre DL 110 x 220mm
Sobre C5 162 x 229 mm
Sobre B5 176 x 250 mm
Sobre Monarch 3.875 x 7.5 pulgadas
Tamaño del usuario

Requerimientos
Para poder generar reportes PDF, se requiere tener instalado el software Acrobat
Reader en el cliente.

Consideraciones para manejo de reportes PDF en


C/SQL

Requerimientos
Para habilitar el soporte del formato PDF con el generador C/SQL, es necesario
obtener previamente la biblioteca PDFLIB. La misma se distribuye en Internet en
www.pdflib.com. En ese mismo sitio es posible (y recomendable) consultar sobre
sus diferentes opciones de licenciamiento.

Para la versión GENEXUS 7.5 se utilizó la versión 401 de PDFLIB, los links para esta
versión son:

UNIX: http://www.pdflib.com/pdflib/download/pdflib-4.0.1.tar.gz
WINDOWS: http://www.pdflib.com/pdflib/download/pdflib-4.0.1.zip

INSTALACIÓN EN WINDOWS
1. Antes de instalar las rutinas de soporte del generador C/SQL es
necesario:

• Descomprimir el archivo pdflib-x.x.x.zip. (Por ejemplo: c:\pdflib4).


• Armar la pdflib.lib. Para esto, hay que abrir el archivo pdflib.dsw con
el Visual Studio y seleccionar la opción Build/Rebuild All.

2. Habilitar el soporte PDF con la opción “Enable PDF support

215
(PDFLIB)” en la página “General Options” del setup wizard
(GXCSetup) para las rutinas de soporte del generador GX C/SQL
e indicar el path donde se instaló la biblioteca pdf (en el
ejemplo: c:\pdflib4).

Nota: Durante la ejecución, se requiere el archivo pdflib.upr que se encuentra


en el directorio ‘fonts’ bajo el directorio de instalación de la biblioteca. Se puede
copiar el mismo al directorio de ejecución o agregar el directorio mencionado
anteriormente al path del servidor.

INSTALACIÓN EN UNIX
1. Antes de instalar las rutinas de soporte del generador C/SQL es
necesario:
• Descomprimir el archivo pdflib-x.x.x.tar.gz

2. Habilitar el soporte PDF con la opción “Enable PDF support (PDFLIB)” en


la página “General Options” del setup wizard (GXCSetup) para las rutinas
de soporte del generador GX C/SQL e indicar el path donde se instaló la
biblioteca pdf.

Consideraciones C/SQL
A continuación se detallan las consideraciones a tener en cuenta al usar el
generador C/SQL para la impresión de reportes PDF.

SOPORTE DE IMÁGENES
La PDFLIB provee soporte de varios formato de imágenes, como los jpeg, gif,
tiff. En particular no se soporta el formato bitmap (bmp).

WORD WRAPPING
La función que se utiliza para dibujar texto hace “word wrapping”, por lo tanto
todo texto que no “entra” en el rectángulo de una línea de alto no aparece en el
PDF. Para evitar este problema cuando el texto está justificado a la izquierda no
se utiliza la función mencionada anteriormente, de forma que se dibuje el texto
completamente. En este caso puede suceder que el texto se solape con algo a la
derecha.

FONTS
En la documentación de la biblioteca PDFLIB, se encuentran los tipos de letra
soportados por la misma. A continuación se encuentra el detalle de los mismos
para la versión 401:

 Courier
 Courier-Bold
 Courier-Oblique

216
 Courier-BoldOblique
 Helvetica
 Helvetica-Bold
 Helvetica-Oblique
 Helvetica-BoldOblique
 Times-Roman
 Times-Bold
 Times-Italic
 Times-BoldItalic
 Symbol
 ZapfDingbats

Problemas comunes
A continuación se describen problemas específicos al usar la biblioteca pdflib con el
generador C/SQL.

 PDFLIB I/O Error: Resource configuration file ‘PDFLIB.UPR’ not found.


Este error se produce al ejecutar el reporte desde la línea de comandos
(consola del servidor o sesión telnet).

Posible Causa
No se encuentra el archivo pdflib.upr al momento de ejecutar el objeto.

Solución
Copiar el archivo mencionado al directorio de ejecución o agregar la
ubicación del mismo en el path del servidor.
Ver (‘Requerimientos/C/SQL/Instalación en Windows’)

 PDFLIB runtime error: Metrics data for font ‘MS xxx’ not found
Este error se produce al ejecutar el reporte.

Posible Causa
El tipo de letra seleccionado en el reporte no es soportado por el formato
pdf. En particular esto sucede con los tipos de letra de Microsoft.

Solución
Modificar el tipo de letra seleccionado en el reporte.

Consideraciones para manejo de reportes PDF en


Visual Basic

Introducción
En este documento se describen las consideraciones a tener en cuenta a la hora de
utilizar los reportes PDF con el generador Visual Basic.
Para obtener información general de los reportes PDF referirse al documento
Reportes PDF.

217
Reportes PDF en el Web
Para poder ejecutar reportes PDF en el Web, generados con el generador Visual
Basic se debe utilizar un procedimiento main con la propiedad “Call Protocol =
HTTP” (WebProc) con la función RespondFile llamando al reporte PDF.
El reporte PDF debe haberse generado previamente.

Requerimientos
Para poder generar reportes PDF con Visual Basic se debe tener instalada la dll que
se encuentra en: www.pdflib.com.
Hay una versión de demo que se puede utilizar para pruebas, para bajar la versión
de demo ingresar a la página seleccionar la opción ‘Download page’ y bajar el
ActiveX del link ‘PDFlib-4.0.1-activex.exe’.
Luego de bajarlo se debe ejecutar el exe para instalar la versión de demo.

Consideraciones para manejo de reportes PDF en


Java

Introducción
Generando los reportes como PDF, es posible ejecutarlos en otra plataforma que no
sea Windows, ya que los PDF no requieren de la dll del Report Viewer.

En este documento se describen las consideraciones a tener en cuenta a la hora de


utilizar los reportes PDF con el generador Java.
Para obtener información general de los reportes PDF referirse al documento
Reportes PDF

Alcance
Objetos: Reportes
Lenguajes: Java
Interfaces: Win Form, Web Form.

Descripción
Tener en cuenta los siguientes puntos:

• Las imágenes utilizadas en el reporte, deben copiarse al lado de la


aplicación. En caso de ‘web report’, al directorio donde estén las clases.
• Si no se especifica la regla output_file(“pp.pdf”, “PDF”); y se trata de un
web report, es decir la propiedad call protocol esta en http, entonces se
presenta el siguiente error al compilar el reporte:

218
*** Error: No method named "getPrinter" was found in type
“com/empresa/aplic/onnn"

Seteo de márgenes superior e izquierdo del reporte PDF

Para setear los márgenes se utiliza el archivo PDFReport.INI. Este archivo


se encuentra en el directorio donde se ejecuta el reporte, y es automáticamente
generado al ejecutar un reporte en caso de que no esté presente.

Editando este archivo es posible setear los márgenes izquiero y superior en las
propiedades ‘LeftMargin’ y ‘TopMargin’ respectivamente. Por ejemplo:

LeftMargin=3.5
TopMargin=2

Los valores default de ambos es 1.

NOTA: el separador de decimales debe ser el punto y no la coma, por ejemplo:


LeftMargin=3.5

Fonts embebidos
Puede darse que en el reporte GX se incluyan determinados fonts que el usuario
final no cuente con ellos al ejecutar este reporte. La forma de evitar esto es
embeber en los reportes generados los fonts deseados.

La forma de incluir esta lista es a través de un utilitario que viene en las clases
standard (gxclassr.zip) del generador Java llamado ‘PDF Font Config’.

Para poder llamarlo se requiere el gxclassr.zip, el client.cfg y el PDFReport.ini.


Estando en una consola, parado en el directorio donde se encuentre el
PDFReport.ini, se levanta el utilitario de la siguiente forma:

jview /cp <path al gxclassr.zip>gxclassr.zip


com.genexus.reports.PDFReportConfig

Se obtendrá entonces el siguiente diálogo:

219
En la lista de la izquierda se visualizan los fonts utilizados en el reporte y en
‘Sample text’ se puede ver el font seleccionado en ella.
Con el botón ‘>>’ se permite agregar el font seleccionado para que sea embebido
en los reportes.
En ‘Fonts Locations’ se especifica el lugar de donde el servidor tomará las fonts a
ser embebidos en los reportes. En caso de ser un servidor windows, no es
necesario especificarlo, ya pueden ser ubicados, sin embargo en un UNÍS si es
requerido.

Generación de reportes PDF en sistemas operativos sin


ambiente gráfico
INTRODUCCIÓN
El generador de reportes PDF java utiliza las biblioteca AWT de Java.

Todas las implementaciones de la máquina virtual de Java incluyen una


implementación de esta biblioteca. El problema es que en algunos ambientes
(por ejemplo Unix sin X/Windows), al no haber soporte gráfico nativo, no
permiten la utilización de la biblioteca AWT estándar.

Una solución es utilizar una biblioteca AWT que no necesite soporte gráfico
nativo. Esto es lo que hace la librería PJA (Pure Java Toolkit). Esta biblioteca se
encuentra en http://www.eteks.com/pja/en.

La version 2.3.1 puede obtenerse en ‘http://www.eteks.com/pja/pja_2.3.1.zip’.

220
EJECUCIÓN DE REPORTES CON PJA EN JDK 1.2+:
Una vez obtenido el archivo pja_2.3.1.zip, debe descomprimirse la biblioteca PJA
de él. El archivo de la librería es ‘PJA.jar’ y se encuentra bajo el directorio
‘pja_2.3.1/lib’ del zip.

Para descomprimirlo puede utilizarse el WinZip o la utilidad JAR.EXE del JDK:

jar xf pja_2.3.1.zip pja_2.3.1/lib/pja.jar

Luego se debe copiar el archivo PJA.JAR a un lugar conveniente.

Para poder generar reportes en ambientes donde el AWT estándar no puede ser
utilizado, se deben tener las siguientes consideraciones:

• El archivo ‘pja.jar’ debe estar ubicado en el BootClasspath. Si el archivo


pja.jar NO se encuentra en el BootClasspath, se debe agregar
‘-Xbootclasspath/a:pja.jar’ como argumentos a la VM al iniciar la
aplicación.
• La SystemProperty ‘java.awt.graphicsenv’ debe contener el valor
‘com.eteks.java2d.PJAGraphicsEnvironment’
• La SystemProperty ‘java.awt’ debe contener el valor
‘com.eteks.awt.PJAToolkit’

Por ejemplo si queremos ejecutar la clase uTest y la librería PJA se encuentra


bajo el directorio /home/libs:

Java -Xbootclasspath/a:/home/libs/pja.jar
-Dawt.toolkit=com.eteks.awt.PJAToolkit
-Djava.awt.graphicsenv =
com.eteks.java2d.PJAGraphicsEnvironment uTest

EJECUCIÓN DE REPORTES CON PJA EN JDK 1.1.X:


Una vez obtenido el archivo pja_2.3.1.zip, debe descomprimirse la biblioteca PJA
de él. El archivo de la librería es ‘PJA.jar’ y se encuentra bajo el directorio
‘pja_2.3.1/lib’ del zip.

Para descomprimirlo puede utilizarse el WinZip o la utilidad JAR del JDK:

jar xf pja_2.3.1.zip pja_2.3.1/lib/pja.jar

Luego se debe copiar el archivo PJA.JAR a un lugar conveniente.

Además es necesario obtener un archivo de font PJA. Para ello se necesita


ejecutar una utilidad que viene con el PJA en algúna máquina que si tenga
disponible el AWT estándar.

Para obtener un archivo .pjaf hay que descomprimir la biblioteca PJA como se
describió anteriormente y hay que descomprimir la biblioteca de utilidades del
PJA (pjatools.jar) utilizando el WinZip o la utilidad JAR del JDK:

jar xf pja_2.3.1.zip pja_2.3.1/lib/pjatools.jar

221
Una vez obtenidos estos dos archivos, y teniendo estas dos bibliotecas en el
classpath se debe ejecutar la utilidad de extracción de fonts PJA (llamada
com.eteks.tools.fontcapture.PJAFontCapture) desde una máquina que tenga
disponible el AWT nativo.

Al ejecutar esta utilidad se mostrará una pantalla como la que sigue:

Hay que guardar un font .pjaf cualquiera, ya que es necesario para poder utilizar
la biblioteca PJA con JDK1.1.x.

Luego, para poder generar reportes en ambientes donde el AWT estándar no


puede ser utilizado con JDK1.1.x, se deben tener las siguientes consideraciones:

• El archivo ‘pja.jar’ debe estar ubicado en el Classpath. Si el archivo pja.jar


NO se encuentra en el Classpath, se debe agregar
‘-classpath pja.jar:.....’ como argumentos a la VM al iniciar la aplicación,
donde .... es el classpath que existía anteriormente.
NOTA: Las implementaciones de la VM del JDK1.1.x reemplazan totalmente
el valor que existiese anteriormente del classpath al agregar este
parámetro, por lo que se sugiere o tener en la variable de ambiente del
classpath la biblioteca PJA para que no sea necesario agregar el parámetro
‘-classpath’, o agregar al argumento del ‘-classpath’ todas las bibliotecas
requeridas por la VM, incluídas las bibliotecas de runtime (classes.zip).
• Algún archivo de font PJA (con extensión ‘.pjaf’) debe estar ubicado en el
directorio de ejecución de la aplicación.
• La SystemProperty ‘java.awt’ debe contener el valor
‘com.eteks.awt.PJAToolkit’.

Por ejemplo si queremos ejecutar la clase uTest y la librería PJA se encuentra


bajo el directorio /home/libs, las classes de runtime de Java se encuentran en

222
/jdk1.1.8/lib/classes.zip y las clases estándar GeneXus se encuentran en
/home/libs:

Java -classpath /home/libs/pja.jar:/home/libs/gxclassr.zip:


/jdk1.1.8/lib/classes.zip -Dawt.toolkit=com.eteks.awt.PJAToolkit uTest

EJECUCIÓN DE REPORTES EN JDK 1.4:


En la versión 1.4 del JDK de Sun está planeado que se pueda utilizar AWT en
cualquier plataforma sin necesidad de soporte gráfico, por lo que dejará de ser
necesaria la utilización de esta biblioteca.

Reportes/Procedimientos con salida XML

Introducción
Esta nueva característica permite que los reportes y procedimientos puedan enviar
los datos del mismo a un archivo con formato XML en el caso que el
reporte/procedimiento tenga call protocol internal, o a la pantalla del browser en el
caso que tenga call protocol HTTP. Se ignora la presentación y se toma en cuenta
sólo los valores de los atributos y variables que se encuentren dentro de los Print
Blocks.
De esta forma es muy simple crear un archivo con formato XML, utilizando toda la
potencia y simplicidad que los reportes proveen, evitando tener que utilizar
funciones de bajo nivel para hacerlo.

Alcance
Objetos: Reportes, Procedimientos.
Lenguajes: Java – Visual Basic – Visual Fox – C/SQL.
Interfaces: Web Form, Win Form.

Descripción
Esta funcionalidad se implementa mediante la propiedad de objeto Report Output,
y la regla Output_file:

Propiedad Report Output: Se debe configurar el valor ‘Only to File’, para


permitir que la salida del reporte o procedimiento sea directamente a un archivo.

Regla Output_file: Se debe indicar el nombre del archivo a generar e indicar que
el formato del archivo es xml.

Estructura del xml generado


Los archivos con formato XML básicamente están compuestos por tags y
elementos.

223
Los tags es lo que está escrito entre los caracteres de menor y mayor, por ejemplo
‘<Cliente>’. Lo anterior es un ejemplo de tag abierto. Todo tag abierto debe tener
un tag cerrado de la forma ‘</Cliente’>.
Un elemento es un tag abierto y cerrado junto con el contenido del medio, por
ejemplo ‘<Cliente>Juan</Cliente>.

Lo anterior sirve para poder explicar como determina GeneXus automáticamente la


estructura del xml generado.

• Por cada for each se crea un elemento correspondiente al grupo en sí,


dentro de este se crean tantos elementos como items (‘registros’) haya en el
grupo y dentro de cada item se crea un elemento para cada atributo o
variable existente en el Print Block.

• Los tags correspondientes a los grupos for each llevan el nombre de la tabla
base seguida de la palabra Group, por ejemplo <ClienteGroup>.

• Los tags correspondientes a los items dentro de los grupos llevan el nombre
de la tabla base, por ejemlo <Cliente>.

• Los tags correspondientes a atributos o variables llevan el nombre del


atributo o variable, por ejemplo <CliCod>.

• Los for each anidados quedan anidados en el archivo xml.

• Los atributos o variables que están en Print Blocks fuera de un for each no
se generan dentro de ningún grupo, sino directamente con los tags
correspondientes a los nombres de atributo o variable.

• El XML generado queda con encoding ISO-8859-1

Objeto GXxmlwrt
Para generar el xml el reporte utiliza internamente un objeto de tipo XMLWriter
llamado GXxmlwrt.
Este objeto puede ser utilizado para lo siguiente:
• Utilizando métodos y/o propiedades sobre el objeto GXxmlwrt se puede
agregar información adicional al xml generado por el reporte.
• Se puede concatenar el contenido de reportes o procedimientos con salida
xml pasando el objeto Gxxmlwrt por parámetro al igual que se hace en los
reportes tradicionales con la variable &line.

Ejemplo
Se tiene el siguiente código en un reporte:

for each
:print PaiCod, PaiNom
for each
:print CiuCod, CiuNom

224
Endfor
Endfor

Se indica en la propiedad Report Output el valor Only to File.


Se ingresa la regla Output_file(‘Paises’, 'xml');

Al ejecutar el reporte, suponiendo que existen los siguientes datos:


Pais: 1 Uruguay
Ciudad: 1 Montevideo
Ciudad: 2 Canelones
Pais: 2 Argentina
Ciudad: 1 Santa Fe
se genera el archivo Paises.xml con la siguiente estructura:

<?xml version="1.0" ?>


-<DATA>
-<PAISES_Group>
-<PAISES>
<PaiCod>1</PaiCod>
<PaiNom>Uruguay</PaiNom>
-<CIUDADES_Group>
-<CIUDADES>
<CiuCod>1</CiuCod>
<CiuNom>Montevideo</CiuNom>
</CIUDADES>
-<CIUDADES>
<CiuCod>2</CiuCod>
<CiuNom>Canelones</CiuNom>
</CIUDADES>
</CIUDADES_Group>
</PAISES>
-<PAISES>
<PaiCod>2</PaiCod>
<PaiNom>Argentina</PaiNom>
-<CIUDADES_Group>
-<CIUDADES>
<CiuCod>1</CiuCod>
<CiuNom>Santa Fe</CiuNom>
</CIUDADES>
</CIUDADES_Group>
</PAISES>
</PAISES_Group>
</DATA>
<?xmlend ?>

225
Funcionalidades para Aplicaciones
Web

Transacciones Web

Introducción
Hasta la versión GENEXUS 7.0, los generadores Internet disponen únicamente del
objeto Web Panel para ser ejecutados desde un navegador. A partir de la versión
7.5, se generan también transacciones para disponer en las aplicaciones Internet
de toda la potencia de este tipo de objetos en el ingreso de datos.

Alcance
Objetos: Transacciones
Lenguajes: C/SQL – Java - Visual Basic – C#
Interface: 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.
La ventaja de estas transacciones es que facilitan la distribución de la aplicación, ya
que sólo se requiere un navegador instalado en el cliente.

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 genera en GeneXus?


Las transacciones Web se generar con cualquier generador que soporte interface
Web (Visual Basic, Java, C/SQL). Por más información sobre las diferentes
interfaces soportadas por GeneXus, referirse al documento “Definición de
ambientes en un modelo”

¿Cómo se define en GeneXus?


Para diseñar el form Web de una transacción, se debe abrir la transacción y

226
seleccionar la opción Object/Web Form del menú GeneXus:

Otra forma de editar el HTML form, es seleccionando el tab Web Form:

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.)

Se muestra un ejemplo a continuación:

227
Diseño del Form Web
Existen algunas consideraciones en el diseño del form de las Transacciones Web
que se detallan a continuación:

NÚMERO DE NIVELES DE LA TRANSACCIÓN


Las transacciones Web pueden tener un nivel anidado y pueden tener varios niveles
paralelos. El primer nivel debe respresentarse plano (sin subfile) y el nivel
subordinado necesariamente debe tener un subfile.
BOTONES
Los botones que están disponibles al usuario final son los siguientes:

Aplicar Cambios
Al presionar este botón es que se realizan los cambios (inserción o
modificación) en la base de datos para la instancia de la llave primaria del
primer nivel que esté, en el momento de ser presionado el botón.

Verificar
Al presionar este botón se validan los datos que se ingresaron (se calculan las
fórmulas, se obtienen atributos inferidos, etc.) permitiendo al usuario
corroborar visualmente los valores antes de confirmarlos. No actualiza la
base de datos (salvo que en las reglas se invoque un programa que sí la
actualice y además, realice un COMMIT). El código del botón de Check hace
un Rollback automático por si llamó a algún programa que actualizó la base
de datos.

228
Borrar Todo
Elimina la instancia utilizando el valor de llave primaria del primer nivel que
esté en el navegador, en el momento de ser presionado el botón.

Movimiento
Los botones de movimiento aplican únicamente al primer nivel y están
deshabilitados cuando la Transacción Web recibe instanciado el modo.
Los registros a mostrar en una Transacción Web cumplen las
restricciones de filtros que se apliquen por alguna de las
siguientes causas:

• Reglas de tipo equal sobre atributos con valores constantes


• Atributos pasados como parámetros a la transacción.

Como en las transacciones tradicionales el concepto de


Siguiente o Anterior esta relacionado con el orden por
llave primaria. El botón Primero y Ultimo, buscan el
registro que contiene el valor menor o mayor de llave
primaria respectivamente.

Nota: El botón siguiente puede, al ser presionado, tener tiempos de


respuesta altos si la tabla base tiene un número significativo de registros.

Seleccionar
El botón ‘Seleccionar’ permite al usuario ejecutar el prompt asociado a la
transacción en una nueva ventana del browser.
Este botón no se deshabilita nunca, pero al llamar al autoprompt sólo se
actualizan los atributos que son editables. Si se actualizó alguno de los
atributos al retornar del autoprompt se fuerza un get siempre y cuando el
botón ’Get’ esté en el form.

Consideraciones Generales
La principal diferencia de las Transacciones Web con las transacciones de las
aplicaciones tradicionales es el diálogo que emplean, lo que implica diferencias en
la validación de los datos y en el disparo de las reglas.

Las Transacciones Web tienen un diálogo a pantalla completa, semejante al que se


provee en el AS/400 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

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:

• No se valida campo a campo


• No se pueden disparar reglas entre un atributo y otro con reglas ‘after

229
attribute’. El ‘After(Attribute)’ se comporta como el ‘After (Level)’
• Los atributos de la tabla extendida se cargan al momento de confirmar los
datos y no antes. El usuario puede visualizarlos presionando el botón
‘Check’.

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.

Por todo esto, no aplica la propiedad ‘Commit on Exit’ en las Transacciones Web.

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.

Es importante notar que el control de cambios se realiza sobre todos los atributos
involucrados salvo aquellos de tipo Long VarChar por su tamaño.

Prompts
Para cada Transacción Web se genera un Web Panel que será el prompt por
defecto (autoprompt), y los prompts correspondientes a las claves foráneas que
se tengan.

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.
El comportamiento de la regla default es diferente que en las aplicaciones no
Web. Si se ingresa a una Transacciones Web en modo Insert, la regla se dispara
al ingresar a la Transacción, y no luego de ingresar la clave como en las
aplicaciones no Web.

230
Transacciones Web sin Modo instanciado
Las transacciones Web pueden invocarse sin recibir el modo instanciado. Se detalla
el comportamiento de las mismas dependiendo de la acción: inserción,
modificación o eliminación de registros.

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 ‘Aplicar Cambios’. Esto provoca, en primera instancia, que se
validen los datos ingresados en forma similar a cuando se presiona el botón
‘Verificar’. 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 ‘Ya existe el registro’.

Ademas, si no se trabaja con confirmación, se insertarán los datos. Si se trabaja


con confirmación, se desplegará el mensaje ‘Por favor confirme los datos’. Al
presionar nuevamente el botón ‘Aplicar Cambios’, se insertarán los datos.

Luego de actualizada la base de datos, se despliega el mensaje ‘Los datos han sido
actualizados’:

231
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 ‘Aplicar Cambios’, 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 ‘Borrar Todo’, lo que
provoca que se deshabilite dicho botón. En el caso de trabajar con confirmación, se
desplegará el mensaje ‘Confirme la eliminación de los datos’:

232
Al presionar el botón ‘Aplicar Cambios’, se eliminarán los datos y de desplegará el
mensaje ‘Los datos han sido eliminados’:

En el caso de que no se trabaje con confirmación, al presionar el botón ‘Borrar


Todo’ se eliminarán directamente los datos y se desplegará el mensaje ‘Los datos
han sido eliminados’, sin necesidad de presionar ‘Aplicar Cambios’.

El eliminarse un registro se cargan los datos correspondientes al registro, quedando


en modo ‘Actualizar’. Si se borran todos los registros, queda en modo ‘Insert’.

233
Transacciones Web con Modo instanciado
Las Transacciones Web que se invocan instanciando el modo Insert, Update o
Delete, deshabilitan los botones de movimiento entre registros y los botones ‘Get’,
‘Seleccionar’ y ‘Borrar Todo’.

Modo Delete
Cuando se invoca una Transacción Web instanciando el modo Delete siempre se
despliega el mensaje ‘Confirme la eliminación de los datos’, sin importar si se esta
trabajando con confirmación o no. Al presionar el botón ‘Aplicar Cambios’, se
elimina el registro.

Transacciones Web de más de un nivel


Cuando se trabaja con Transacciones Web de mas de un nivel, se tienen que tener
en cuenta los siguientes puntos:

• Número de niveles de una transacción


Las transacciones Web pueden tener un nivel anidado y pueden tener varios niveles
paralelos. El primer nivel debe respresentarse plano (sin subfile) y el nivel
subordinado necesariamente debe tener un subfile.

• Eliminación de líneas

En diseño se utiliza una variable &GxRemove definida y agregada automáticamente


a los subfiles de la pantalla por defecto. Esta variable es un check box que se ubica
en la primera columna del subfile, con título ‘Remove Line’.

Cuando se desea eliminar alguna línea del subfile, se debe marcar la misma con el
check box, y presionar el botón de ‘Aplicar Cambios’, no de ‘Borrar Todo’. Este
último eliminará toda la transacción, no las líneas marcadas.

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
‘Aplicar Cambios’ porque en realidad se está actualizando el “documento”. Lo
mismo para agregar líneas, se debe utilizar el botón ‘Aplicar Cambios’ porque se
está actualizando el “documento”.

Consideraciones específicas para el generador Visual


Basic
Se pueden generar sobre bases de datos locales (MDB) o C/S.

Cuando se compila una Transacción Web, para poner en producción, se debe copiar
al directorio donde estará la DLL y la página ASP correspondiente a la Transacción
Web los archivos *.js que se encuentran en el directorio del modelo y el prompt.gif,
para que aparezca el botón de prompt en las claves foráneas.

234
Ejemplos
En http://www.artech.com.uy/cgi-bin/webartech/hdcver03.exe?N,31,0,409 se
encuentran ejemplos de Transacciones Web.
Además, existe otro ejemplo que utiliza Transacciones Web en el siguiente link
http://www.artech.com.uy/cgi-bin/webartech/hdcver03.exe?S,31,0,423, donde se puede ver
lo fácil que es realizar altas, bajas y modificaciones con Transacciones Web, sin la
necesidad de tener que definir Web Panels y procedimientos auxiliares para esta
tarea.

Web Components

Introducción
Normalmente cuando se desarrolla una aplicación hay muchas partes de la misma
que pueden ser reutilizadas en varios objetos.
El objetivo de los Web Components es permitir un alto grado de reutilización de
estas partes (componentes) disminuyendo así el costo de desarrollo y
mantenimiento de las aplicaciones.

Alcance
Objetos: Web Panels
Lenguajes: C/SQL – Java – Visual Basic – C#
Interfaces: Web

Descripción
Los ‘Web Components’ son Web Panels que tienen una propiedad que indica que
son componentes. Es decir, pueden ser ejecutados en forma independiente como
cualquier otro Web Panel 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 webde una
aplicación, puede ser definida como Web Component.
Algunos ejemplos: menús, login, área que permite la personalización, etc.

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ú.

Definición de Web Components


Para definir un Web Panel como Web Component se debe configurar la propiedad
‘Web Component’ del objeto en ‘YES’. Se debe notar que un Web Panel definido

235
como Web Component no pierde ninguna de sus caracteristicas, por lo tanto, si es
un Web Panel MAIN, puede ser ejecutado en forma autónoma.

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
elegir la opción Insert / Web Component, con lo cual se creará un objeto de tipo
‘Web Component’ en el mismo, como se puede observar en la siguiente figura:

Tambien es posible insertarlo con un solo clic en el ícono de barra de controles.

Además, se pueden insertar Web Components en subfiles freestyle como se puede


observar en la siguiente figura:

236
Para determinar el objeto que se va a desplegar en lugar del control Web
Component, se utilizan las propiedades del mismo. El web panel a desplegar se
puede fijar en diseño o en tiempo de ejecución, como se describe a continuación.

Propiedades
El objeto Web Component tiene las siguientes propiedades de diseño:

237
 ControlName: Nombre del control
 Object: Permite asociar un objeto de tipo web panel al web component. Sólo
se aceptanobjetos con la propiedad Web Component en YES.
 Parameters: Permite especificar la lista de parámetros con los que se
invocará el web component.
PROPIEDADES MODIFICABLES EN EJECUCIÓN
A continuación se detallan las propiedades de los Web Components que se
pueden modificar en tiempo de ejecución:

1. Object: permite determinar en tiempo de ejecución el Web Panel que se


va a desplegar en el lugar del control. Para invocar el Web Component se
debe utilizar la siguiente sintaxis:
Control.Object = Create(Hxxx, [par1], ... [parn]

Siendo Control el nombre del control Web Component agregado al objeto,


Hxxx el Web Panel que está configurado como Web Component
(Propiedad ‘Web Component’ con valor ‘Yes’) y par1 a parn los
parámetros que recibe dicho Web Panel.

Visible: si la propiedad Visible tiene el valor 0, el Web Component desaparece del


formulario.

Web Components ‘dinámicos’


Como lo demuestra la sintaxis, es posible dinamizar los Web Components, es decir
que el contenido de un Web Component sea variable. Por ejemplo:
&variable = ‘HMenu’
Comp1.Object = Create(&variable)

Tanto si se invoca de forma dinámica como estática, en el programa generado la


invocación será estática. Es decir la invocación dinámica (create(&Var)) se genera
como:

Do Case
Case &Var=”Objeto1”
Create(Objeto1)
Case &Var=”Objeto2”
Create(Objeto2)
....
endcase

Esto implica que si se agrega un componente al modelo y el mismo será llamado de


forma dinámica, se deberán regenerar y compilar todos los “invocadores” de ese
nuevo componente. Esto, en C# y Java no es estrictamente necesario; basta con
generar y compilar el componente mismo.
GeneXus determina automáticamente un dominio de objetos llamados en un create
dinámico. El dominio esta definido por los Web Panels que tienen la propiedad
WebComponent en YES y que tienen igual cantidad y tipo de parámetros que el
create. Estos objetos se verán además en el object browser como objetos llamados.

238
Por lo tanto, al compilar el web panel ‘padre’ C/SQL y VB compilan en forma
automática los posibles Web Components llamados.

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 Panels 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
C#, 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).

EJECUCIÓN DE OBJETOS WEB CON WEB COMPONENTS


A continuación se describe la ejecución de objetos Web que contienen Web
Components.

239
Web Components en área plana del objeto Web

Orden de ejecución de los eventos


Se puede diferenciar dos instancias al ejecutar un objeto web que incluye un
Web Component: primera llamada al objeto web (GET) y disparo de un
evento en el objeto (POST).

Primer llamada (GET)

El orden de ejecución de los eventos al realizar la primer llamada al mismo


(GET) es el siguiente:
 Evento START del objeto web que contiene el Web Component (objeto
Web ‘padre’),
 Evento REFRESH del objeto Web ‘padre’,
 Evento START de todos los Web Components dentro del objeto web que
no están dentro de subfiles,
 Eventos REFRESH y LOAD de cada uno de los Web Components y de los
subfiles en el orden que aparecen en pantalla (de arriba a abajo y de
izquierda a derecha).

Ejemplo:

En la siguiente figura, se puede observar un Web Panel que contiene 2 Web


Components (A y B) y un subfile. Cada Web Component tiene a su vez un
subfile.

A B

En este caso el orden de los eventos cuando se ejecuta por primera vez es el
siguiente:

1. Evento START del Web Panel


2. Evento REFRESH del Web Panel
3. Evento START del Web Component A
4. Evento START del Web Component B
5. Evento REFRESH del Web Component A y evento LOAD del subfile en
el Web Component A
6. Evento LOAD del subfile del Web Panel
7. Evento REFRESH del Web Component B y evento LOAD del subfile en

240
el Web Component B

Disparo de un evento (POST)

Al disparar un evento, el orden de los eventos depende de si se disparó el


evento en el padre o en un Web Component. A continuación se analizan
ambos casos.

NOTA: La lectura de variables de cada objeto se realiza siempre


inmediatamente después del evento START de dicho objeto.

Disparo de un evento de un Web Component

 Evento START del objeto web padre,


 Evento START del Web Component cuyo evento se disparó,
 Evento de usuario del Web Component,
 Evento REFRESH del objeto web padre,
 Evento START de los Web Components restantes
 Eventos REFRESH y LOAD cada uno de los Web Components y subfiles
en el orden que aparecen en pantalla.

En el ejemplo, si se dispara un evento del Web Component A, el orden de los


eventos sería el siguiente:

1. Evento START del Web Panel


2. Lectura de variables del Web Panel
3. Evento START del Web Component A
4. Lectura de variables del Web Component A
5. Evento de usuario del Web Component A
6. Evento REFRESH del Web Panel
7. Evento START del Web Component B
8. Lectura de variables del Web Component B
9. Evento REFRESH del Web Component A y evento LOAD del subfile en
el Web Component A
10. Evento LOAD del subfile del Web Panel
11. Evento REFRESH del Web Component B y evento LOAD del subfile en
el Web Component B

Disparo de un evento en el objeto web padre

 Evento START del objeto web padre


 Evento de usuario del objeto web padre
 Evento REFRESH del objeto web padre
 Eventos START de todos los Web Components en el orden que se
encuentran en pantalla
 Eventos REFRESH y LOAD de los Web Components y subfiles en el orden
que aparecen en pantalla.

En el ejemplo, al dispararse un evento del Web Panel, el orden de los eventos


sería el siguiente:

241
1. Evento START del Web Panel
2. Lectura de variables del Web Panel
3. Evento de usuario del Web Panel
4. Evento REFRESH del Web Panel
5. Evento START del Web Component A
6. Lectura de variables del Web Component A
7. Evento START del Web Component B
8. Lectura de variables del Web Component B
9. Evento REFRESH del Web Component A y evento LOAD del subfile en
el Web Component A
10. Evento LOAD del subfile del Web Panel
11. Evento REFRESH del Web Component B y evento LOAD del subfile en
el Web Component B

Nota: si el objeto web tiene más de un subfile, primero se ejecuta el REFRESH


independiente de los subfiles y luego el refresh de cada uno de los subfiles en el
orden en que aparecen en pantalla.

Web Components en subfile freestyle

Orden de ejecución de los eventos

En caso de haber Web Components en subfiles, se ejecuta el evento START


del Web Component justo antes del evento REFRESH en vez de ejecutarse al
principio.

Todos los eventos del Web Component (START, REFRESH y LOAD si tiene
subfiles) se ejecutan cada vez que aparece el Web Component.

Ejemplo
El siguiente ejemplo ayuda a entender mejor la funcionalidad de los Web
Components, su utilidad y potencia:
http://www.gxtechnical.com/cgi-bin/HDCenter.exe?2,5,36,407
Para ver el ejemplo funcionando, se debe ejecutar el web panel ‘hcontent’.

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
Lenguajes: C/SQL – Java – Visual Basic – C#

242
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.

Ventajas del uso de Embedded Pages


El uso de Embedded Pages brinda a los usuarios GeneXus la siguiente ventaja:

 Incluir información externa: permite que se incluyan páginas estáticas o


dinámicas de la propia aplicación o desarrolladas por terceros. Dichas
páginas pueden estar en el mismo servidor que la aplicación o en otro
servidor. Esta característica brinda gran dinamismo a las aplicaciones web
desarrolladas con GeneXus.

Generación de Embedded Pages


Las ‘Embedded Pages’ se generan como un ‘inline frame’ en el HTML final. Al
ejecutar el objeto que contiene una ‘Embedded Page’, el browser se encarga de
realizar el requerimiento de la página asociada y de incluirla dentro del inline
frame.

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.

Uso de Embedded Pages


Para insertar una Embedded Page en un Web Panel o Web Transaction se debe
seleccionar la opción Insert / Embedded Page, con lo cual se creará un control de
tipo ‘Embedded Page’ en el mismo como se puede observar en la siguiente figura:

243
Tambien es posible insertarla con un solo clic en el ícono de barra de controles.

Propiedades
El control ‘Embedded Page’ tiene las siguientes propiedades:

244
 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

Nota: La propiedad TooltipText no funciona en Internet Explorer 6.0 o menor. Sí


funciona en Netscape 6.0 o superior.

245
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 subfiles
freestyle.

Orden de los eventos


Como se mencionó anteriormente la ‘Embedded Page’ es una página totalmente
independiente del objeto web que la contiene, por consiguiente, si se utiliza un
objeto GeneXus en una ‘Embedded Page’, los eventos de éste y del contenedor se
dispararán en forma independiente y no es posible establecer a priori cuando se
ejecutan los de uno con relación a los del otro.

Ejemplo
El siguiente ejemplo demuestra la funcionalidad básica de las ‘Embedded Pages’:
http://www.gxtechnical.com/cgi-bin/HDCenter.exe?2,5,36,604

Create SSP on request

Introducción
Se agregó el valor Create Static Panels on request para poder generar las páginas
SSP (Smart Static Panels) a demanda.

Alcance
Objetos: Web Panels
Lenguajes: C/SQL – JAVA – Visual Basic
Interface: Web

Descripción
Se agregó el valor Create Static panels on request a la preferencia Generation Mode
de la sección Web Information. Además de la preferencia Generation Mode, existe
también la propiedad –con el mismo nombre- a nivel de objeto.

246
Este valor significa que al ejecutar el web panel con acceso dinámico,
automaticamente se generará la página estática correspondiente a la instancia de
datos.

Permite tener un sitio compuesto por paginas dinámicas y páginas estáticas sin que
sea necesario ejecutar un proceso que genere todo el sitio en forma estática con
anterioridad, sino que estas páginas estáticas se generarán para las instancias de
datos que se requiera cuando se ejecute la página dinámica correspondiente en el
sitio.

El sitio funcionará siempre como si fuera dinámico, esto significa que los links
siempre son al objeto web panel dinámico.

Al ejecutarse el web panel dinámico, lo primero que se controla es que exista la


página estática (.html ) correspondiente a si mismo incluyendo tambien los
parámetros que se le pasaron.
Si este archivo existe, se redirecciona la llamada a dicho html.
Si no existe automáticamente se crea el .html y luego se redirecciona.

Existen dos preferencias en la sección Web Information:

On request SSP server directory


Esta preferencia indica el directorio del servidor en donde el web panel genera
los archivos .HTML. El directorio debe existir previamente.
Si no se especifica esta preferencia, se generarán en el directorio donde esta
el web panel.

On request SSP client URL


Esta preferencia indica la URL en donde estan los archivos html. Se
corresponde físicamente al mismo directorio que se configuró en la
preferencia anterior.

Si el webpanel dinámico esta en el mismo directorio que la página estática no es


necesario configurarlo. En caso contrario, si es necesario porque este valor
se utiliza para que funcionen los bootones y los links.

Consideraciones

El generador C/SQL no utiliza las preferencias On request SSP server directory y On request
SSP URL de la sección Web Information, sino que utiliza dos nuevas entradas en el archivo
de configuracion gxcfg.ini en la sección Web, como se muestra a continuación:

[Web]
OnRequestSSPServerDir = <directorio>
OnRequestSSPClientDir = <url>

Se debe incluir la barra final en el directorio y en la url

Ejemplo:

247
http://myserver/cgi-bin/ssphtm/

[Web]
OnRequestSSPServerDir = c:\inetpub\cgi-bin\ssphtm\
OnRequestSSPClientDir = http://myserver/cgi-bin/ssphtm/

WAP

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
Lenguajes: Visual Basic, Java, C/SQL y C#
Interfaces: Web

Algunas definiciones
WAP (Wireless Aplication Protocol)
Es el protocolo más común de Internet Móvil.
Internet móvil es el término comercial para acceder a información de Internet a
través de dispositivos móviles.
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.
Este protocolo consiste en un modelo de capas que incluyen un IP inalámbrico,
capas de seguridad (WSL) y lenguajes de descripción de contenidos entre ellos
WML.

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

248
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’.
Los valores de la propiedad son:
• HTML
• WML

El valor por defecto es HTML para cualquier objeto Internet.


Con el valor WML es posible generar objetos con contenido WML, estos podrán ser
vistos desde un browser WAP.

Esta propiedad es válida si se utiliza el generador Visual Basic para la generación


de objetos Web.

Requerimientos
Para testear esta característica directamente en la máquina de desarrollo es
necesario tener instalado el emulador de microbrowser.
Recomendamos el UP Browser (UP.SDK version 4.0) que es posible bajarlo de:
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.
El archivo ocupa aproximadamente 7 MB.

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

249
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

• Las propiedades de runtime soportados son


o Link
o Ispassword
o Visible y
o Enabled.

• El softbutton del teléfono (botón que se encuentra en la parte superior


izquierda), se asocia al Evento Enter.

Ejecución
Al igual que cualquier aplicación para Internet, los Web Panels Visual Basic pueden
ser generados como Webclasses o como CGI.
En ambos casos luego de compilado el objeto se debe ejecutar desde el emulador
celular, esto se realiza escribiendo la dirección donde se encuentra el Web Panel en
la barra de direcciones del mismo.

Ejemplo
Se desea desplegar un texto de prueba en un teléfono celular, los pasos a seguir
son los siguientes:

- Insertar el texto en un textblock en el form de un Web Panel.

250
Es aconsejable verificar el código generado, en el Tab ‘Source’, teniendo en cuenta
las consideraciones

- Especificar, generar y compilar el Web Panel desde GeneXus.


- Ejecutar el UP.Simulator.
- Escribir la dirección donde se encuentra el objeto (por ej. http://localhost/cgi-
bin/Hprueba.exe) en ‘Go’, y presionar Enter o el Softbutton.
- En el teléfono celular se visualizará el texto ingresado en el Web Panel.

251
- Si se producen errores en la pantalla del teléfono celular siempre se despliega el
siguiente mensaje:
‘Compile error: See info windows for details.’

El texto completo del error se debe visualizar en el ‘Phone information’ (ventana


DOS que se ejecuta detrás del emulador).

Hay un ejemplo disponible en :


http://www.artech.com.uy/cgi-bin/webartech/hdcver03.exe?S,31,0,408

Errores comunes
Error Síntoma
“Error : Invalid element ‘PCDATA’ in Se debe a la ausencia de <P> en
contents of card.” textblock o variable.
“Error : Invalid element ‘br’ in contents Se debe a un tag <BR> en el Source del
of card.” objeto
“Error : Uncompiled data from http La página no es WML es HTML, se debe
<head>.” configurar la preference ‘Tag
Language=WML’
“Error : Invalid element ‘textarea’” Se esta usando un longvarchar o un
char de varias líneas.

252
“Error : Missing entity “ntilde” Hay algún dato con la letra ñ y el
microbrowser no lo puede interpretar.
“Error : Invalid element ‘P’ in content of Se introdujo algun tag <P> anidado,
‘p’. excpectde PCDATA | em | b …” esto no es válido en WML

Consideraciones

• Consideraciones a tener en cuenta con el editor

o El editor no toma en cuenta algunas restricciones necesarias para


WML y puede generarse código no válido, es preciso en estos casos
modificar el source en el editor de diseño de GeneXus.

o No es posible hacer Cut & paste de controles y/o del Source.

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 Textblock y variables deben generarse entre <P> y </P>. La


generación de estos tags se da con un enter al final del edit o
modificando Código en el Tab ‘Source’.

o Subfiles o tablas no deben limitarse por tags <P>. Es posible generar


este código con algunas combinaciones de teclas.

o Igualmente no es recomendable modificar el código WML (bajo el tab


“HTML Source” ) pues pueden dar errores en ejecución .

• No se reciben correctamente variables por parámetro en los llamados


realizados mediante “call”.

Encriptación de Parámetros

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.
En la versión 7.5 de GeneXus se implementa la encriptación de los parámetros de

253
los objetos Web que van en la URL en forma automática y transparente para el
usuario.

Alcance
Objetos: Web Panels, Transacciones
Lenguajes: C/SQL, Java, Visual Basic, C#
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).

Con respecto al diseño de los objetos la encriptación de parámetros no implica


ningún cambio, se programan de la misma forma que hasta el momento.
Las ventajas del uso de la encriptación de parámetros son:
• 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

Se agrega la preferencia Encrypt URL Parameters a nivel de modelo, en el grupo


“Web Information” y también a nivel de objeto.

Para la preferencia a nivel de modelo los valores posibles son:


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.
Este valor ofrece un nivel de seguridad mayor, pero no permite
compartir URLs. Esto significa que no es posible para un usuario X
enviar una URL que tenga parámetros a otro usuario Y, ya que en
este caso la URL no va a funcionar porque se necesita la cookie
correspondiente para la desencriptación.

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.
En este caso no se utilizan cookies. Esto da un nivel de seguridad
menor pero facilita el traspaso de links.

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.

254
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.

• Si se tienen valores configurados para la preferencia a nivel de modelo y la


propiedad a nivel de objeto para encriptar parámetros, ésta última tiene
prioridad sobre la primera.

• Cuando se utiliza la propiedad a nivel de objeto para encriptar parámetros, y


se realizan varios llamados entre objetos Web, se debe tener en cuenta que
los valores utilizados por todos lo objetos involucrados debe ser el mismo.
Por ejemplo: Si se tiene un Web Panel que llama a otro pasándole
parámetros, y se quieren visualizar estos parámetros encriptados, en ambos
Web Panels se debe configurar el mismo valor para la propiedad “Encrypt
URL Parameters”.
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.

Propiedad “Encrypt URL Parameters” en Prompts


Los parámetros de los prompts asociados a las Transacciones Web no es posible
encriptarlos. Esto es porque el llamado a los prompts se realiza desde el cliente y
para realizar la encriptación se debe ir al servidor.

255
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==

Paginado de subfiles en Web Panels

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 subfiles y subfiles freestyle.

Alcance
Objetos: Web Panels
Generadores: C/SQL – JAVA – Visual Basic – C#
Plataformas: Web

Descripción
El paginado de subfiles aplica a subfiles comunes y freestyle cuya propiedad ‘Rows’
tiene un valor diferente de cero. Los subfiles pueden estar anidados.
Existen algunas diferencias relacionadas con la paginación cuando un subfile tiene
tabla base o no. A continuación se describe la paginación en cada uno de estos
casos.

Métodos
A continuación se describen los métodos disponibles cuando un subfile tiene tabla
base.

FIRSTPAGE:
El método FirstPage lleva al usuario al primer conjunto de registros devueltos.
Los valores devueltos por este método son los siguientes:

256
0: Operación exitosa
1: No está habilitado el paginado en el subfile

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 subfile
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 subfile
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 subfile 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 subfile
3: El subfile 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 subfile
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 subfile

RESUMEN
A continuación se incluye una tabla con un resumen de los métodos disponibles
cuando un subfile tiene tabla base y cuando no.

Subfile Subfile
con tabla base sin tabla base
FirstPage  
NextPage  

257
PreviousPage  
LastPage  
GoToPage  

Propiedades
Cada subfile dispone de las siguientes propiedades que son utilizadas en la
paginación:

• RecordCount
• PageCount

Consideraciones
• Si el subfile del 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.

• En el caso de paginar el subfile hijo de subfiles anidados, controles que


utilcen los métodos de paginación deben estar en el subfile padre.

• La eficiencia de los métodos FirstPage, NextPage, PreviousPage y GotoPage(


N) esta asociada a la eficiencia de la definición de la navegación del subfile
correspondiente. En otras palabras, si el subfile, sin paginado tiene buenos
tiempos de respuesta, los tiempos con paginado serán semejantes.

• 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 subfile. El hecho de
utilizar la propiedad RecordCount implica que el DBMS (no el código
generado) barre dos veces la tabla base del Subfile (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
Subfile.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

258
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 subfiles pueden ser utilizados en los eventos escritos
por el usuario. Por ejemplo:

Event Start
&Count = MySubfile.RecordCount
If &Count > MySubfile.Rows
Pagina2.Visible = 1
EndIf
If &Count > MySubfile.Rows * 2
Pagina3.Visible = 1
EndIf
Endevent

Event Siguiente.Click
MySubfile.NextPage()
Endevent

Event Anterior.Click
MySubfile.PreviousPage()
Endevent

Event Enter
MySubfile.FirstPage()
Endevent

Uso de Web Panels en reglas prompt

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.

259
Alcance
Objetos: Transacciones
Lenguajes: C/SQL – JAVA - Visual Basic – C#
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.

Programación de un Web Panel como prompt

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 subfile,
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).

260
Ejemplos
Prompt de Clientes
Un prompt de clientes se programa así:

En las Reglas del web panel:

parm( out: &CliCod);

En los Eventos:

event Subfile1.load
&CliCod = CliCod
endevent

En el form:
Un subfile que tiene CliNom y CliCod, donde CliNom (por ejemplo) tiene la
propiedad ReturnOnClick en true.

261
Propiedades

Propiedad OnClickEvent para imágenes

Introducción
El evento Click permite asociar eventos definidos por el usuario a las imágenes. A
partir de la versión GENEXUS 7.5, es posible asociar también los eventos estándar
de los objetos Web a las imágenes empleando la propiedad OnClickEvent.

Alcance
Objetos: Web Panels, Web Transactions
Lenguajes: C/SQL – JAVA – Visual Basic – C#
Interface: Web

Descripción
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.

Para asociar eventos de usuario a una imagen puede usarse la propiedad


Onclickevent o el evento Click. Si una imagen tiene evento Click y, a su vez, un
valor en la propiedad Onclickevent, prevalece este último (se ignora el evento
Click).

Las propiedades disponibles en Diseño para una imagen son las que se detallan en
el siguiente diálogo:

262
Esta propiedad es usada principalmente en las Transacciones Web para poder
asociar imágenes a los eventos estándar: Previous, Next, etc. Hasta este
momento, solamente se podían asociar a los botones. En Web Panels, sirve para
asociar el evento Enter a las imágenes.

Ejemplo
¿CÓMO DEFINIR LOS BOTONES DE DESPLAZAMIENTO EN UNA TRANSACCIÓN
WEB USANDO IMÁGENES?
Al definir una Transacción Web y crear el form HTML por defecto, se generan los
siguientes botones de desplazamiento:

Para sustituir dichos botones por imágenes, se deben borrar los botones e
insertar cinco imágenes, definiendo en cada una de ellas el evento estándar de
GeneXus correspondiente.

Un ejemplo puede ser:

ControlName Source OnClikEvent


Primero First1.gif First
Anterior Previuos1.gif Previous
Siguiente Next1.gif Next
Ultimo Last1.gif Last
Seleccionar Select1.gif Select

263
En el form HTML y en la ejecución del objeto se vería como:

Propiedades BackColorEven, BackColorOdd de


Subfiles

Introducción
Se implementó la posibilidad de modificar en tiempo de ejecución el color de fondo
de las líneas pares e impares de un subfile o subfile Freestyle cuyo ‘BackColorStyle’
sea ‘Report’. De esta forma el diseñador de objetos Web tiene mayor libertad para
resolver la configuración del mismo en tiempo de ejecución, permitiendo una mayor
parametrización del sitio.

Alcance
Objetos: Web Panels, Web Transactions
Lenguajes: C/SQL – VB – JAVA – C#
Interface: Web

Descripción

264
\\DIONISIOD\VOLR\InfoPrototipo\English\GeneXus\Internet\Docum\Manuals\7.5\B
ackColorOdd.doc
\\DIONISIOD\VOLR\InfoPrototipo\Espanol\GeneXus\Internet\Docum\Manuals\7.5\B
ackColorOdd.doc

Ejemplo
En el siguiente ejemplo se muestra como se puede modificar el color de las líneas
pares/impares de un subfile o subfile Freestyle en tiempo de ejecución,
dependiendo del valor elegido en un radio button.
La implementación consta del siguiente código:

Event Start
If null(&col) // &col es la variable definida como RadioButton
Usuarios.Visible = 0
Endif
Endevent

Event Refresh
Do Case
Case &col=1
Usuarios.Visible = 1
Usuarios.TitleBackColor = RGB(40,2,202)
Usuarios.BackColorEven= RGB(5,107,165)
Usuarios.BackcolorOdd = RGB(29,135,255)
Case &col=2
Usuarios.Visible = 1
Usuarios.TitleBackColor = RGB(253,114,53)
Usuarios.BackColorEven = RGB(238,140,0)
Usuarios.BackColorOdd = RGB(254,181,40)
EndCase
Endevent

En la siguiente pantalla se visualiza el resultado de seleccionar los tonos de azul


como colores del subfile:

265
En la siguiente pantalla se observa el resultado de seleccionar los tonos de naranja
como colores del subfile:

266
Propiedad Columns subfiles freestyle

Introducción
Se implementó la posibilidad de modificar en tiempo de ejecución, la cantidad de
columnas de un subfile Freestyle. Esta nueva funcionalidad agrega dinamismo a los
Web Panels, permitiendo modificar la forma de desplegar datos en un subfile
Freestyle.

Alcance
Objetos: Web Panels
Lenguajes: C/SQL – Visual Basic – JAVA – C#
Interfases: Web

Descripción
\\DIONISIOD\VOLR\InfoPrototipo\Espanol\GeneXus\Internet\Docum\Manuals\7.5\C
olumns.doc

Ejemplo
En el siguiente ejemplo se muestra cómo puede modificarse la forma de desplegar
los datos, dependiendo de la configuración elegida por el usuario. Para poder
hacerlo, se almacena en una tabla la configuración seleccionada por el mismo
(cantidad de columnas a desplegar). En el Web Panel simplemente se recupera
dicho valor y se lo asigna a la propiedad Columns del subfile Freestyle, como se
detalla a continuación:

Event Refresh
Listarec.Columns = WebFabCnf
Endevent

Donde Listarec es el nombre del control subfile Freestyle y WebFabCnf el atributo


que contiene la cantidad de columnas a desplegar.

En la siguiente figura se visualiza la configuración seleccionada por el Usuario1


(WebFabCnf=1).

267
En la siguiente figura se puede observar la configuración seleccionada por el
Usuario2 (WebFabCnf=2):

268
Propiedad PageCount

Introducción
Para facilitar el uso de la paginación automática en subfiles de Web Panels, se
agrega una nueva propiedad denominada PageCount, que permite obtener en
tiempo de ejecución la cantidad de páginas de la tabla base de un subfile o subfile
Freestyle.

Alcance
Objetos: Web Panels
Lenguajes: C/SQL – JAVA – Visual Basic
Interface: Web

Descripción
La propiedad PageCount devuelve la cantidad de páginas del subfile en base a las
propiedades Rows y Columns del mismo. Al igual que la propiedad RecordCount,
devuelve –1 si el subfile no tiene tabla base.

Valor Propiedad Comentario Sugerencia


-1 PageCount El subfile no tiene tabla base Colocar atributos en el
subfile que indiquen la
navegación.
>= 0 PageCount Número de páginas del subfile.

Ejecución: aplica a subfiles y subfiles freestyle.

Propiedad RecordCount

Introducción
Para facilitar el uso de la paginación automática en subfiles de Web Panels, se
agrega una nueva propiedad denominada RecordCount, que permite obtener en
tiempo de ejecución la cantidad de registros de la tabla base de un subfile o subfile
Freestyle.

Alcance:
Objetos: Web Panels
Lenguajes: C/SQL – JAVA – Visual Basic
Interface: Web

269
Descripción
La propiedad RecordCount aplica únicamente a subfiles que tienen tabla base y
retorna un número mayor o igual a cero representando la cantidad de registros de
la tabla base del subfile que cumplen las condiciones de selección. Puede retornar -
1 si no existe navegación para la tabla base del subfile.

Valor Propiedad Comentario Sugerencia


-1 RecordCount El subfile no tiene tabla base Colocar atributos en el
subfile que indiquen la
navegación.
>= 0 RecordCount Número de registros de la
tabla base del subfile.

Ejecución: aplica a subfiles y subfiles freestyle.

Propiedad Rows subfiles

Introducción
Se implementó la posibilidad de modificar en tiempo de ejecución, la cantidad de
filas de un subfile o subfile Freestyle. Esta nueva funcionalidad agrega dinamismo a
los Web Panels, permitiendo modificar la forma de desplegar datos en un subfile o
subfile Freestyle.

Alcance
Objetos: Web Panels, Transacciones
Lenguajes: C/SQL – VB – JAVA – C#
Interfases: Web

Descripción
Se puede modificar la propiedad Rows de un subfile o subfile Freestyle en tiempo
de ejecución.
Para hacerlo se debe agregar la siguiente línea en un evento del Web Panel:

Subfile.Rows=n

siendo Subfile el nombre del control subfile o subfile Freestyle y n un número, una
variable o un atributo igual o mayor que cero, correspondiente al número de filas
que se van a desplegar.
Si el valor asignado es 0, se despliegan todos los registros de la tabla.

Ejecución: aplica a subfiles y subfiles freestyle.

270
Propiedad Cache Expiration Lapse

Introducción
Cuando se accede a páginas web para consultas se utilizan recursos del servidor
web y posiblemente del servidor de base de datos de aplicaciones. Si estas
páginas se acceden repetidas veces pero el contenido no cambia tan a menudo,
es cuando se hace necesario utilizar esta propiedad que permite que la página
se almacene en el cliente durante un cierto lapso de tiempo. De esta forma es
posible reducir los recursos necesarios en el servidor.
Esta funcionalidad esta disponible a partir de la version 7.5 de GeneXus.

Alcance
Objetos: Web Panels
Generadores: C/SQL – JAVA – Visual Basic – C#
Plataformas: Web

Descripción
Esta propiedad del objeto web panel causa que se incluyan los headers
necesarios para ‘cachear’ la pagina generada.
El valor que se permite ingresar es la cantidad de segundos que dura la pagina
‘cacheada’.
Por defecto (es decir si no se tiene valor ingresado) la página no se cachea.

Propiedad Enable para botones en objetos web

Introducción
Esta propiedad permite habilitar/deshabilitar botones de objetos WEB en tiempo
de ejecución.

Alcance
Objetos: Web Panels, Transacciones
Lenguajes: Java – Visual Basic – C/SQL – C#
Interfaz: Web

Descripción
Esta propiedad se puede modificar dentro de alguno de los eventos del Web
Object.
La sintaxis es la siguiente:

<ButtName>.Enable=<valor>

donde:

<ButtName> es el nombre del boton que se desea habilitar/deshabilitar


<Valor> es un numerico de 1. Puede valer 1 para habilitarlo o 0 para

271
deshabilitarlo.

Observación: Si se configura la propiedad ‘Enabled=0’, en Netscape 6.0, se ve


como en Internet Explorer, es decir, deshabilitado. No ocurre lo mismo en
Netscape 4.7 y anteriores.

272
Eventos

Evento refresh con múltiples subfiles

Introducción
En la versión GeneXus 7.5 se implementó el evento Refresh en los Web Panels
que utilizan múltiples subfiles.
De esta forma se puede programar la lógica que no está asociada a ningún
subfile en un evento independiente.

Alcance
Objetos: Web Panels
Lenguajes: C/SQL – JAVA - VB
Interface: Web

Descripción
El nombre de este evento es simplemente Refresh. En la versión GeneXus 7.0
cuando se incluyó la posibilidad de definir múltiples subfiles en un Web Panel, el
evento Refresh quedó asociado a cada subfile. Es decir podían programarse
tantos eventos Refresh como controles de tipo subfile hubieran definidos.

Con esta nueva implementación, existe el evento REFRESH general y se


mantiene el evento REFRESH asociado a cada uno de los subfiles.

ORDEN DE DISPARO

En el orden de disparo de los eventos en los Web Panels se distingue la


primera ejecución de las siguientes del mismo web panel.

Primera Ejecución de los Web Panels


La primera vez que se ejecuta el web panel los eventos se disparan en el
siguiente orden:

1. Start
2. Refresh
3. Refresh Subfile 1
4. Load Subfile 1
5. Refresh Subfile 2
6. Load Subfile 2

Luego de esto, cuando el usuario presione un botón que no llame a ningún


otro Web Panel se ejecutará nuevamente éste y el orden de disparo de los
eventos será diferente.
Resto de las Ejecucióon de los Web Panels
1. Start (nuevamente se dispara el evento Start)

273
2. Nueva lectura de las variables de la pantalla.
3. Código correspondiente al evento asociado al botón
seleccionado
4. Refresh
7. Refresh Subfile 1
8. Load Subfile 1
9. Refresh Subfile 2
10. Load Subfile 2

Ejemplo
¿ Cuándo se debe usar el evento Refresh? Algunos ejemplos son:

• Cuando se quiere llamar a un programa que calcule algo dependiendo de


variables que estén en pantalla y no están asociadas a ningún subfile.

• Cuando se quiere acceder a la información de una tabla que no esta


asociada a ninguna de las tablas bases de los subfiles.

Evento click en Text block y Combo

Introducción
Se implementó el evento click sobre los controles de tipo text block y combo en
los web panels. De esta forma se puede programar cierta lógica al hacer clic
sobre estos controles, cosa que antes solo era posible para las imágenes.
Particularmente para el caso de los combos se puede programar acciones a
partir del valor seleccionado en el mismo.

Alcance
Objetos: Web Panels
Lenguajes: Java – Visual Basic – C/SQL – C#.
Interfaces: Web Form.

Descripción
Para el caso de los controles de tipo text block el evento se ejecuta al hacer clic
sobre el mismo.
En el caso de los controles de tipo combo el evento se ejecuta al variar el valor
que contiene el control.

Nota: En el caso de tener definido sobre un control de tipo text block además
del evento click la propiedad link, los resultados pueden ser impredecibles
(puede ejecutarse el evento o tener en cuenta la propiedad según el generador
y la versión). En cualquier caso no es recomendable tener programadas ambas
a la vez.

274
Ejemplo
Event &Pais.Click
&Ciudad.Clear()
For each
Where PaiCod = &Pais
&Ciudad.Additem(CiuCod ,CiuDsc )
Endfor
EndEvent // &Pais.Click

En este ejemplo, al elegir una opción del combo ‘pais’ (siempre y cuando el
valor elegido sea distinto del existente previamente) se ejecuta el evento clic del
mismo, cargando de esta forma las ciudades correspondientes al país
seleccionado en el combo ciudad.

275
Métodos

Método JSEvent

Introducción
El método JSEvent permite utilizar el evento “Click” y “OnChange” de los
controles para disparar código Java Script.

Alcance
- Objetos: Web Panel, Transacciones
- Lenguajes: Java - Visual Basic - C# - C/SQL
- Interfaces: Web

Descripción
El método JSEvent sirve para asignar código Javascript a los eventos JavaScript
“click” y “onchange” de los controles en el form web.
Los controles habilitados son:

- Edit (single line),


- Combo,
- Dynamic combo,
- Listbox,
- Dynamic listbox,
- Button,
- Pictures,
- Variables de tipo bitmap.
- Text Blocks

Sintaxis
Control.JSEvent( 'evento_javascript', "su_código_javascript")

“evento_javascript” es el nombre del evento javascript que se quiere atender


con el código su_código_javascript. Los valores válidos actualmente son
"onclick" (para controles de tipo Edit, Button, Pictures, Variables de tipo bitmap
y Text Blocks) y "onchange" (para controles de tipo Combo, Dynamic Combo,
Listbox y Dynamic Listbox).

El código Javascript que se escribe en el segundo parámetro debe poderse


incluir en un IF, esto quiere decir que debe retornar TRUE o FALSE.
En caso de que el resultado sea TRUE se disparará el evento asociado al control.

Por ejemplo: si se escribe, Boton.JScript( 'onclick', "confirm( 'Esta seguro?')"),


cuando el usuario presione el botón, aparecerá la confirmación y, sólo si
responde que si, se ejecutará el evento de GX asociado al botón (si lo hubiere).

276
Consideraciones Generales
• Por medio del JSEvent, se pueden llamar funciones JavaScript que se
encuentren en el código HTML del Form o en archivos externos js. En caso
de que la función se encuentre en un archivo externo, se debe incluir un
TextBlock en el form y se le debe asignar en el evento “Start” el código:
“<SCRIPT language=JavaScript src="archivo_JavaScript.js"></SCRIPT>

Ejemplos

Ejemplo 1
Se tiene un Web Panel con un TextBlock (TX1) en el form. Se define los
siguientes eventos:

Event Start

TX1.JSEvent("onclick", "confirm( 'Esta seguro de procesa esta opción?')"


)

EndEvent // Start

Event TX1.Click

Call(Hmain)

EndEvent // TX1.Click

En este caso utilizamos la función JavaScript “Confirm” que despliega un


mensaje con el texto explicitado, en dicho mensaje se puede aceptar o cancelar,
en el caso de aceptar la función retorna TRUE y se ejecuta el evento Click del
control.
En caso de cancelar la función retorna FALSE y el evento Click no se ejecuta.

Ejemplo 2
Por defecto en las transacciones con interfaz web se asigna únicamente la ayuda
del objeto al botón HELP que está en el form, no así la ayuda de los atributos.
Una forma de asignar esta es por medio del método JSEvent.
Para esto se debe remplazar la etiqueta del atributo por un TextBlock , y
asignarle a este en el evento Start la descripción del atributo y :

TextBAtt1.JSEvent('onclick',"GX_help('', 'HLP_Atributo.htm')")

Donde GX_help es una función JavaScript que se encuentra en el archivo


gx_help.js el cual se incluye automáticamente en el objeto web por la línea de
código:
<script language="JavaScript" src="gx_help.js"></script> que GeneXus
incorpora para manejar la ayuda del objeto.
El resultado es que al hacer click en la etiqueta del atributo se abre una ventana
nueva, sin barras de navegación y exploración el HTML de la ayuda del mismo.
El archivo HTML con la ayuda del atributo debe copiarse al directorio
especificado en la preferente HELP Base File URL.
Este último ejemplo está disponible en http://www.gxtechnical.com/cgi-
bin/hdcenter.exe?2,5,36,623 .

277
Funcionalidades para aplicaciones
Win

Múltiples Subfiles

Introducción
El objetivo es tener la posibilidad de diseñar Objetos de consulta (Work
Panels o Web Panels) con más de una grilla o subfile y así potenciar el
desarrollo de los mismos, entre otras cosas para resolver en el mismo
objeto accesos a diferentes tablas.

Alcance
- Objetos: work panels, web panels
- Lenguajes: Java, Visual Basic, Visual FoxPro, C/SQL, C#
- Interfaces: Web (Java, Visual Basic, C/SQL, C# )
Win (Java , Visual Basic, Visual FoxPro)

Nota : esta implementación ya se encuentra liberada en Objetos Web. En este


documento se introduce el comportamiento en plataforma GUI, describiendo las
similitudes y diferencias en ambos ambientes.

Descripción
El uso de varios subfiles, implica un cambio en la forma de especificar en
GeneXus las reglas, los eventos y las condiciones asociados a los mismos.

A continuación se detallan los cambios de comportamiento y las formas de uso


de las entidades pertenecientes a estos objetos GeneXus.

ATRIBUTOS Y VARIABLES.
Un atributo/variable puede pertenecer a más de un subfile. No es posible
referenciar un atributo/variable de un subfile, o sea no se permite:

<Subfile Control Name>.<Atributo>.


<Subfile Control Name>.<Variable>.

Esto implica que no se recomienda tener el mismo atributo/variable en mas de


un subfile ya que cuando la misma variable está presente en más de un subfile,
los cambios de las propiedades afectan a todos los subfiles en los que se
encuentra.

PROPIEDADES.
Las propiedades de los subfiles conservan la implementación y comportamiento
actual ya que siempre estuvieron asociadas al objeto.

278
PRECEDENCIAS
Por defecto las propiedades del objeto son asignadas a cada uno de los subfile.
Si se definen a nivel de subfile estas prevalecen sobre las propiedades del
objeto

EVENTOS.
Los eventos del subfile conservan su comportamiento actual.
Los eventos Load y Refresh deben referenciar al subfile usando la siguiente
nomenclatura:
Event <Subfile Control Name>.<Refresh | Load>
....
EndEvent

Si el objeto solo tiene un subfile, no es necesario usar la nomenclatura nueva.

COMANDOS.
Los comandos que actúan específicamente sobre el subfile cambian de forma de
que, en caso de haber más de un subfile, se pueda determinar a cuál subfile se
aplica, estos comandos son:

 For each line: Este comando debe incluir una referencia al subfile de la
siguiente forma: For each line IN <Subfile Control Name>
 Load: Dispara la carga del subfile. La sintaxis continua siendo Load,
pero debe incluirse dentro del evento load asociado a dicho subfile.
Ejemplo
Event Subfile1.Load

Load
Endevent

 Refresh
Al disparar el comando, se disparan en orden las reglas standalone, el
refresh general y el refresh de cada subfile (en caso de mas de un subfile).

REGLAS.
 Order: Quedan asociadas al subfile. (Se puede editar dando clic con
botón derecho sobre el subfile).
 Hidden: Queda asociado al subfile.

PRECEDENCIAS
 Order: Si el conjunto de atributos de la regla se corresponde con los de
algún subfile y este tiene un orden asignado explícitamente este último
es el que se toma en cuenta.
 Hidden Si se define a nivel de subfile este prevalece sobre la regla.

CONDITIONS.
Las condiciones se pueden indicar por cada subfile o en forma general para el
objeto.

279
Si hay condiciones generales y particulares sobre los mismos atributos, se
toman en cuenta todas.

En el diálogo es posible Insertar Atributos, Variables, Functions. Para ello hay


tres botones en el diálogo, con las teclas asociadas Ctrl+A, Ctrl+W y Ctrl+U
respectivamente.

DETERMINACIÓN DE LA TABLA BASE


Como es posible tener mas de un subfile, se tiene una tabla base por cada
subfile.

Los atributos que participan en la determinación de la tabla base de cada subfile


son los que:
• Están en el subfile
• Están referenciados en las reglas Hidden y Order aplicadas al subfile

Los atributos de la parte fija no participan en la determinación de la tabla base


de ninguno de los subfiles, pero deberán pertenecer a la tabla extendida de
alguno de ellos. Si hay alguno que no cumpla la condición da el warning:
”Attribute not instantiated”. Notar que es posible que algunos atributos de la
parte fija estén en una tabla extendida y otros en otras.

Tampoco participan los atributos que están en los Eventos (fuera de los grupos
For each). Estos, deberán pertenecer a la tabla extendida de alguno de los
subfiles.

CARGA.
La carga se realiza para cada subfile de forma independiente, es decir, aún si los
datos que se muestran en ambos subfiles 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 subfiles es:
Evento refresh del subfile 1
Evento Load subfile 1
Evento refresh del subfile 2
Evento Load subfile 2

El orden en que se cargan los subfiles es como aparecen en el form: de arriba


hacia abajo y de izquierda a derecha.

Consideraciones Work Panels


REGLAS.
 Hidden
Se implementa a nivel de subfile.
No es recomendado el uso de hidden de variables. Si es posible
definir hidden de atributos.
Si se oculta un campo con la propiedad Visible igualmente el ancho del
campo se incluye en la grilla
La regla Hidden (general a nivel de objeto) es ignorada con mas de un

280
subfile

 Order
En el caso de tener mas de un subfile la rules Order (general a nivel de
objeto) es ignorada.

 Search
Queda asociado al objeto.
La regla search se toma solamente para el primer subfile.

PROPIEDADES DE SUBFILE
Las propiedades del objeto :
- Load Record
- Load At startup
- Automatic refresh
- When to refresh
- Refresh timeout
se implementan a nivel de subfile.

MÉTODOS DE SUBFILE
 Refresh Al disparar el método de cualquier subfile, se refresca solo dicho
subfile

 Sort Se ordena el subfile por el atributo especificado.


Sintaxis Subfile.Sort(Att, [asc/desc])

 Load En el caso de tener mas de un subfile y hacer las cargas paralelas,


usando la misma variable, ocurriran errores en la paginación, por
ejemplo

Event sub1.Load
for &i = 1 to 100
Load
endfor
EndEvent // sub1.Load

Event sub2.Load
for &i = 1 to 100
Load
endfor
EndEvent // sub1.Load

Cuando se haga un 'page down' en un subfilo, al retornar al otro, los valores de &i
que quedan en un subfile no quedan en el otro.

 ToChart Dibuja una gráfica sobre los campos recibidos por parámetro,
también recibe el nombre del gráfico.
Sintaxis Subfile.ToExcel('name',att/var,att/var)
Esta función no es soportada por el generador Java

 ToExcel Envia a una planilla excel los datos del subfile.


Sintaxis &planilla = Subfile.ToExcel('name',[row],[column])

281
Los últimos 2 parámetros son opcionales. La variable &planilla, también
opcional, es de tipo ExcelDocument, y permite manipular la planilla.

Compatibilidad

El comando Graph y la función GXXlsCre se siguen soportando.


Funcionan igual que hasta ahora, con un solo subfile se aplican a ese y
con más de uno aplican al "primero". El "primero" es por lo general el
primero que se inserto. No es recomendable su uso con Múltiples subfiles

El comando Graph pasa a ser deprecated.

La función Gxxlscre se mantiene, esta tiene tres parámetros más que


ToExcel, estos son Título, Visible y Table.
En algunos casos se puede imitar su funcionamiento con ToExcel:
Se mantiene la función Gxxlscre, esta tiene tres parámetros más que
ToExcel, estos son Título, Visible y Table.
En algunos casos se puede imitar su funcionamiento con ToExcel:

Título : Para pasar el título de las columnas de la planilla se debe


programar con el método cells de la variable
El código :
&var(1) = "Titulo1"
&var(2) = "Titulo2"
call('gxxlscre','filename.xls',row,col,&var(),Visible,Table)

es análogo a:
&planilla = SfTip.ToExcel('filename.xls',row,col)
&planilla.Cells(1,1) = "Titulo1"
&planilla.Cells(1,2) = "Titulo2"

Otra opción es crear un template de la planilla, usando el método


Template de la variable.

Visible : Permite hacer visible la planilla. El valor por defecto en


ToExcell es 0, no visible, para hacer visible la planilla se debe programar
usando el metodo Unbind de la variable exceldocument

El código: call('gxxlscre',filename,row,col,Title(),0,&table)

es análogo a :
&planilla = SfTip.ToExcel(filename,row,col)
&planilla.unbind()

Otra opción es usar el método show de la planilla

Tabla : Este parámetro permite pasar los registros de una tabla a Excel.
Esto no es posible de implementar con el método toexcel, por lo tanto no
es posible hacerlo para más de un subfile.

SUBFILES ANIDADOS WORKPANELS


Para asociar las cargas de dos subfiles en work panels, se debe programar
ambos subfiles con variables y en el evento Onlineactivate del primer subfile
refrescar la carga del segundo.

282
Ejemplo :
Se tiene la tabla de países y la de ciudades, queremos desplegar un subfile con
los países y para cada uno sus respectivas ciudades. Se debería programar

En el load del subfile de paises:

Event SfPais.Load
For each
&PaisCod = PaisCod
&PaisNom = PaisNom
Load
Endfor
EndEvent

En el load del Subfile de ciudades

Event Sfciudad.Load
For each
where PaisCod = &PaisCod
&CiuCod = CiuCod
&CiuNom = CiuNom
load Endfor
EndEvent

En el Onlineactivate de Países refescar las Ciudades

Event SfPais.OnLineActivate
Sfciudad.Refresh()
EndEvent

Consideraciones Web Panels


REGLAS
Hidden
Los atributos / variables nombrados en esta regla son colocados como
“hidden” en cada uno de los subfiles.

Acceso a las Propiedades de la Menu Bar

Introducción
El acceso a las propiedades de la menu bar en tiempo de ejecución permite a los
usuarios, entre otras cosas, habilitar o no algunas opciones de la misma y
cambiar la apariencia de las opciones.

Alcance
Objetos: Work Panels, Transacciones
Lenguajes: Java – Visual Basic – Visual FoxPro
Interface: Win

283
Descripción
Las siguientes propiedades son aplicables a cada una de las opciones del objeto
Menu bar asociado a otro objeto GeneXus:

Propiedad Tipo
Caption Char
Checked Numeric (0|1)
Enabled Numeric (0|1)
Visible (*) Numeric (0|1)

Sintáxis:
MenuBar.<Opción>.<Propiedad> = <Valor>
Donde:
<Opción> es el nombre (‘Name’) de la opción (‘Item’) de la Menu bar.
<Propiedad> es una de las propiedades especificadas en la tabla.
<Valor> es el nuevo valor que tomará la propiedad.

Alcance:
Aplica a Work Panels y Transacciones

(*) La propiedad visible sólo se encuentra implementada en Java.

Ejemplos
1) Configuraciones varias dependiendo de los permisos del usuario:

Event Start
&Permisos = udp(PGetPermisos,userid())
if &Permisos = 1
MenuBar.GX_COPY.Caption = ‘Copiar’
MenuBar.Id_CliNew.Enabled=0
MenuBar.Id_CliDlt.Visible=0
Endif
EndEvent

2) XPW con ejemplo más completo:


http://www.artech.com.uy/cgi-bin/webartech/hdcver03.exe?S,31,0,478

Consideraciones
1) GeneXus no provee forma para seleccionar e insertar las distintas
propiedades.
2) Para utilizar esta funcionalidad es necesario asignar a la propiedad del
objeto ‘Functions’ el valor ‘Allow non-standard functions’.

284
Opciones Confirm y Close en Menu bar

Introducción
Hasta la versión GeneXus 7.0 no era posible ejecutar el evento Enter de un
objeto, o cerrar la ventana de un objeto desde la Menu bar asociada al mismo.

A partir de la versión 7.5 de GeneXus, se agregan dos nuevas opciones que


permiten estas acciones.

Alcance
Objetos: Menu Bar
Lenguajes: Visual Basic , Visual FoxPro, Java
Interface: Win

Descripción
Opción Confirm
Esta opción es un item más dentro del grupo ‘Actions’ de la Menu bar. Tiene el
mismo efecto que presionar el botón ‘Confirm’ de los objetos, realizando las
acciones asociadas al evento ‘Enter’ de los mismos.

Opción Close
Esta opción se encuentra dentro del grupo ‘File’ de la Menu bar. Cumple la
misma función que el botón ‘Close’ de los objetos, cierra el objeto que se tenga
abierto en ese momento.

Propiedad When To Refresh

Introducción
Es muy común que los Work Panels tengan variables que permiten de alguna
forma filtrar los registros desplegados en el o los subfiles (grillas). Esta
propidedad permite especificar en qué momento se debe refrescar el subfile, si
durante el ingreso de las variables de selección o filtros, o luego de haberlas
validado.

Alcance
Objetos: Work Panels
Lenguajes: Visual Basic – Visual FoxPro
Interface: Win

285
Descripción
La propiedad When To Refresh es de diseño, y se encuentra definida tanto a
nivel de objeto como a nivel de subfile. En el siguiente cuadro se observa como
se puede especificar a nivel de subfile:

Los valores posibles que toma son


• When a subfile receives focus (default): En este caso el evento Refresh
del subfile se ejecuta luego de validar todas las variables de selección, es
decir en el momento en el que el subfile recibe el foco.
• While variables are being modified:
o Si el tipo de datos de la variable de selección es Character,
Varchar, Long Varchar o Numeric: En este caso el evento Refresh
del subfile se ejecuta cada vez que se ingresa un dígito o un
caracter.
o Si el tipo de datos de la variable de selección es Date o DateTime:
En este caso el evento Refresh del subfile se ejecuta al validarla.

Propiedad Caption en items de controles Radio


Button

Introducción
Esta propiedad permite cambiar en tiempo de ejecución los captions de las
distintas opciones de los controles Radio Buttons.

Alcance
Objetos: Work Panels, Transacciones
Lenguajes: Java – Visual Basic – Visual FoxPro
Interfaz: Win

286
Descripción
La sintaxis es la siguiente:

&radio.item(i).Caption = ‘Descripcion’

donde:

<i> indica el número de item sobre la cual se quiere aplicar la


propiedad.

Para poder utilizar esta propiedade se debe configurar la preferencia "Functions


= Allow non standard functions" en diseño y prototipo.

Propiedades Caption y Visible en Tab Dialogs

Introducción
Se implementaron las propiedades caption y visible para las páginas de los Tabs
Dialogs. Las mismas permiten determinar en tiempo de ejecución el caption
(título) de cada página, y hacerla visible o invisible.

Alcance
Objetos: Work Panels, Transacciones
Lenguajes: Java – Visual Basic – Visual FoxPro
Interfaz: Win

Descripción

La sintaxis es la siguiente:

tab.page(i).<Propiedad> = <Valor>

donde:

<Propiedad> es una de las propiedades especificadas en la tabla.


<Valor> es el nuevo valor que tomará la propiedad, cuyo tipo de dato
depende de la propiedad:

Propiedad Tipo de dato


Caption Char
Visible Numeric (0|1)

<i> indica el número de página sobre la cual se quiere aplicar la


propiedad.

Para poder utilizar estar propiedades se debe configurar la preferencia


"Functions = Allow non standard functions" en diseño y prototipo.

287
Funcionalidades para aplicaciones
Cliente/Servidor

Múltiples conexiones por modelo

Introducción
Esta funcionalidad permite establecer desde un programa más de una conexión
en forma simultánea a diferentes bases de datos (de diferentes fabricantes). Las
bases de datos pueden ser de cualquier DBMS soportado por GeneXus (SQL
Server, Informix, Oracle, DB2) Estas conexiones se realizarán a través de Data
Views definidos en la base de conocimiento.

Alcance
Objetos: Todos los objetos
Lenguajes: C/SQL - Java - Visual Basic – Visual FoxPro – C#
Interfaces: Win/Web

Descripción
Para implementar esta característica se definió un nuevo concepto en GeneXus,
al que se le dio el nombre de Data Store.

Un Data Store es una fuente de datos a la cual un programa se conectará. Cada


Data Store tiene asociadas propiedades que definen el comportamiento de la
aplicación al conectarse y datos relacionados, como por ejemplo el nombre del
usuario y contraseña a utilizar, etc.

Se definirá un Data Store por cada base de datos diferente de la principal que se
quiera acceder desde el modelo original. En el caso de que se trabaje
solamente con la base de datos principal, no es necesario definir ningún Data
Store.

Definición en Diseño:
La creación de un nuevo Data Store se realiza en el modelo de Diseño,
utilizando la opción del menú File/Edit Model, en este dialogo se selecciona el
tab Data Store (ver figura abajo).

288
El único dato que se debe especificar en el modelo de Diseño de un Data Store
es su nombre, este nombre servirá como identificación a través de todos los
modelos de la misma Base de Conocimiento.

Definición en Prototipo o Producción:


En los diferentes modelos de Prototipo y Producción de la Base de Conocimiento
se especifican las características particulares de cada Data Store. Para hacerlo
se utiliza el mismo procedimiento que en Diseño, la opción File/Edit Model
muestra un dialogo con el tab “Data Stores”, eligiendo el mismo aparecen los
definidos en Diseño:

En ese momento se debe definir en primera instancia cual será el DBMS

289
asociado a ese Data Store en ese modelo.

Luego se deben definir las propiedades utilizando el botón “Preferences”:

En este dialogo se editan las preferencias asociadas al Data Store, las que
varían dependiendo del DBMS seleccionado (por mas información consultar la
sección DBMS Options en las Release Notes de GeneXus 7.0).

En el caso de no configurarse el Data Store en Prototipo/Producción, el mismo


no quedará asociado a ningún DBMS, pero esto no significa que se asumirá la
conexión principal para las tablas asociadas a dicho Data Store, por lo que se
producirán errores en compilación y/o ejecución.

Utilización
Al asociar el Data View a un determinado Data Store es que se indica a GeneXus
que determinada tabla debe ser accedida a través de la conexión de dicho Data
Store y no mediante la principal, que es su comportamiento por omisión. Para
esto, se agregó en la edición de los Data Views u en n combo box para elegir el
Data Store al que asociarlo:

290
Consideraciones generales
• En el diálogo de definición de Propiedades del Data Store en
Prototipo/Producción, la sección ‘Creation/Reorganization Information’
está de mas, ya que no aplica a las conexiones secundarias (el modelo
no reorganiza tablas que no sean de la base de datos principal). La única
propiedad que aplicaría es ‘Database Schema’, pero no esta
implementada. Para configurar el Schema, se debe hacer a nivel de Data
View, en ‘Platform Specific Information’.

• No funcionan los comboboxes dinámicos ni listboxes dinámicos en el caso


del generador Visual Basic.

Requerimientos Generador JAVA


• Es necesario disponer de los drivers JDBC correspondientes a los DBMS
accedidos (definidos en los Data Stores).

Requerimientos Generador C/Sql.


• Es necesario habilitar el soporte de acceso ODBC/OLEDB al instalar las
rutinas de soporte de GeneXus.
• Como el acceso a las bases de datos externas se realiza mediante
Conectividad ODBC, es necesario crear en el servidor donde ejecutan los
programas C, los Data Sources correspondientes a los DBMS accedidos
(definidos en los Data Stores).
• Si el Servidor es Windows se requiere instalar el MSDAC 2.1 o superior.
Este software puede obtenerse del Service Pack 3 del Developer Visual
Studio 6.0 o del sitio http://www.microsoft.com/data. En Windows 2000
viene incorporado al sistema operativo.
• Si el servidor es Unix pueden utilizarse los drivers ODBC de Merant

291
(http://www.merant.com.) o de Openlink (http://www.openlinksw.com).

Comando SQL

Introducción
El objetivo de este comando es permitir la ejecución de sentencias SQL desde
las aplicaciones GeneXus Client/Server.

Alcance
Objetos: Transactions, Work panels, Procedures, Reports, Web Panels
Lenguajes: Visual Basic C/S - Visual FoxPro C/S - C/SQL – Java – C#
Interface: Win y Web

Descripción
En ocasiones especiales es necesario poder incluir sentencias SQL en los
programas generados de las aplicaciones Client/Server.
El uso más común, es para modificar los permisos de las tablas de la aplicación,
aunque puede utilizarse para realizar cualquier acción..

¿Cómo funciona?

Se debe incluir la constante “SQL” delante de la sentencia que se va a ejecutar.

Por ejemplo:
SQL DELETE * FROM CLIENTES

En el código generado aparecerá un comentario indicando que se está


ejecutando una sentencia SQL del usuario.

Es posible ejecutar sentencias SQL creadas en tiempo de ejecución. Si se


incluyen atributos y/o variables dentro de la sentencia SQL con la notación
[!att/var!], su valor es considerado en tiempo de ejecución.
Por ejemplo, si en Oracle se quiere cambiar el rol de un usuario:

&Role = "MyRole"
SQL SET ROLE TO [!&Role!]

Otro ejemplo:

&Sent = 'DELETE FROM CLIENTES WHERE CLICOD = 2'


SQL [!&Sent!]

Ha sido implementado en la versión 7.5 en los upgrade 1 de cada uno de los


generadores en la versión 7.0

292
Consideraciones
• Es importante recordar que las sentencias SQL que se utilicen en el
comando SQL de GeneXus NO pueden retornar valores (retornar un
status, devolver registros RPC, etc.). Esto también implica que no se
tiene un manejo de errores, por lo cual si la sentencia produce un error
cancelará la aplicación (el usuario no tiene permisos, la tabla sobre la
que se opera no existe, etc)

• El comando NO hace diferencia en lo que al DBMS se refiere, debiendo


ser previsto por parte del desarrollador posibles diferencias de sintáxis
entre ellos.

• Es importante tener en cuenta que si la sentencia actualiza datos, puede


requerir un commit. Por lo tanto, si el objeto GeneXus en el que es
utilizado el comando SQL no actualiza los datos de la base, debe
agregarse un comando commit, o incluirse en una UTL que lo haga.

• El comando es ignorado en modelos no Client/Server.

Metodos de Conexion con Tecnologia ODBC

Introducción
La conexión a la base de datos empleando la tecnología ODBC se realiza a
través de los Drivers que implementan, para un manejador de base de datos
específico, las funciones ODBC.
En versiones anteriores la conexión se realizaba únicamente a través de la
definición de un data source (para un driver particular). A partir de GENEXUS
7.5, es posible conectarse utilizando directamente el driver o un data source de
archivo.

Alcance
Objetos: Transacciones, Work Panels, Web Panels, Procedimientos, Reportes
Lenguajes: C/SQL, Visual Basic, Visual FoxPro
Interfaces: Web y Win
Tecnología de acceso a los datos: ODBC

Objetivo
Los nuevos métodos de conexión ODBC (empleando directamente el driver ó
utilizando un data source de archivo) amplían el alcance (usuarios y
computadores) de la conexión ODBC que se venía utilizando hasta ahora.

Utilizando data sources, la instalación de una nueva aplicación que accede a los
datos mediante ODBC implica la definición del data source correspondiente en
cada cliente. Estos nuevos mecanismos simplifican la etapa de instalación ya
que el data source puede reutilizarse.

293
Definiciones Generales
Los drivers son los componentes que procesan los requerimientos ODBC y
retornan los datos a la aplicación. Para usarlos, requieren ser instalados
previamente en el computador.

Los data sources son las fuentes de datos que determinan el acceso utilizando
un driver a una fuente de datos particular. Se identifican con un nombre y se
definen usando el ODBC Data Source Adminitrator. Requieren haber instalado
previamente el driver en el computador. Existen tres tipos de data sources: de
Usuario, del Sistema y de Archivo.

User Data Sources: Los data sources de Usuario, son


locales al computador y pueden ser utilizados únicamente
por el usuario que lo define. Generan una entrada en el
Registro de Windows.

System Data Sources: Los data sources de Sistema, son


locales al computador y pueden ser utilizados por
cualquier usuario con privilegios o por el sistema.
Generan una entrada en el Registro de Windows.

File Data Sources: Los data sources de Archivo, están


basados en un archivo que puede compartirse entre todos
los usuarios que tienen instalado el mismo driver para
acceder a una base de datos. No están dedicados a un
usuario ni a un computador. No generan entradas en el
Registro de Windows, sino que se identifican por el
nombre de un archivo con la extensión .DSN.

Los data sources de Usuario y de Sistema se conocen en


conjunto como Data source de la máquina (Machine Data
Source) porque son locales a un computador. Estos eran
los únicos data sources soportados hasta esta versión.

Configuración en GeneXus
En los modelos que utilizan la tecnología de acceso ODBC, se dispone de una
nueva preferencia que se configura a nivel de Data Store (en DBMS Options),
denominada “Connect Using” para la tecnología de acceso ODBC. Esta
preferencia indica la forma que se usará para indicar la fuente de datos ODBC a
utilizar.

Los valores posibles son:

Datasource Se utiliza un data source ODBC


Driver Se utiliza el nombre del driver. Con esta opción
no se requiere definir ningún data source
ODBC.
File Se utiliza un file data source previamente
definido. *

* La información completa de cómo definir data sources y file data sources


está en: http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/odbc/htm/dasdkodbcdatasourceadmin.asp bajo el título “Microsoft ODBC
Data Source Administrator”.

294
Dependiendo del valor configurado en esta preferencia, se habilita una única
preferencia de las siguientes:

DATA SOURCE NAME


Esta opción esta disponible y su valor es requerido si se eligió el valor
“Data Source” en la opción “Connect using”.
Debe ingresarse el nombre del data source tal como aparece en el ODBC
Manager bajo la columna “Name” de cada data source.

DRIVER
Esta opción esta disponible y su valor es requerido si se eligió el valor
“Driver” en la opción “Connect using”.
Debe ingresarse el nombre del driver tal como aparece en el ODBC
Manager bajo la columna “Name” del tab “Driver”.

Por ejemplo: El driver de Microsoft para Sql Server se llama “SQL


SERVER”, el driver de Merant para Oracle8 “MERANT 3.60 32-BIT
Oracle8”.

FILE DATA SOURCE NAME


Esta opción esta disponible y su valor es requerido si se eligió el valor
“File” en la opción “Connect using”.
Debe ingresarse el nombre del data source de archivo tal como aparece
en el ODBC Manager en el tab “File Data Source”. Si el data source de
archivo no está definido en el directorio definido por defecto en el ODBC
Manager, debe incluirse el camino que permita localizarlo.

Primary key index clustering

Introducción
La propiedad (que existe a nivel de DBMS Options) permite definir si el índice
por llave primaria se crea ‘clustered’ o ‘not clustered’.

Alcance
DBMS: Informix, SQL Server
Lenguajes: C/SQL – Java – Visual Basic - Visual FoxPro – C#

Descripción
Esta DBMS Option aplica para cuando la propiedad Primary key Definition es
‘Index’.
Los valores configurables de esta propiedad son:
Clustered: (valor por defecto) En este caso se crea el índice con la
siguiente sintaxis: “CREATE UNIQUE CLUSTERED INDEX …”

Not clustered: En este caso se crea el índice con la siguiente sintaxis:

295
“CREATE UNIQUE INDEX …”

El siguiente diálogo demuestra cómo se configura la misma:

FAQ
¿Qué significa que un índice sea Clustered?
Significa que el orden del índice a nivel físico coincide con el orden lógico.
Por más información referirse a ‘SQL Server Books Online’.

Preferencia Lock Time-out(seconds)

Introducción
A partir de la versión Solís, la preferencia, a nivel de Manejador de Base de
Datos, Lock time-out aplica además del AS/400 con acceso nativo a SQL Server
en las versiones 7.0 o superiores.

Esta indica al acceder a un registro lockeado el tiempo en segundos que debe


reintentar para poder obtener el registro.

Alcance
Objetos: Transacciones.
Lenguajes: Java, Visual Basic, Visual FoxPro, RPG y Cobol
Interfaces: Win

Descripción
Es posible configurar esta propiedad solamente para el manejador AS/400,
cuando se utiliza como tecnología de acceso ‘AS/400 nativo’ (es decir,
generando RPG o Cobol, pero no en los accesos SQL) y para el manejador SQL

296
server con versión 7.0 o superior por las tecnologías de acceso empleadas por
todos los generadores Cliente/Servidor (C/SQL, Java, Visual Basic y Visual
FoxPro).

El valor se define en segundos siendo el valor por defecto 0.


En el caso que el manejador sea AS/400 el valor 0 indica que toma el valor
configurado en las propiedades del archivo físico (WAITRCD), en el caso de
SqlServer indica que reintentará indefinidamente.

La propiedad en los modelos AS/400 nativo ya existía, se movio a nivel de


DbmsOption. En Sqlserver la propiedad es nueva

Utilidad
Por defecto cuando un programa GeneXus requiere un registro y éste se
encuentra lockeado, por ejemplo con SQL Server se mantiene al programa "en
espera" (sin responder) hasta que el registro se libere o lo cancela si ocurre un
Dead lock con otra aplicación.
Los síntomas de este comportamiento se pueden ver en una aplicación donde
dos usuarios concurrentes intenten acceder (por ejemplo, en una transacción) al
mismo registro. El primero accede al registro y el segundo no. Además, el
segundo no recibe ningún "feedback" de qué esta ocurriendo. Simplemente, la
aplicación que esta ejecutando queda "congelada".
La posibilidad de establecer un Timeout permite que el segundo usuario, en el
ejemplo anterior, pueda recibir el control nuevamente con el mensaje de que
alguien esta lockeando el registro.
El especificar un Timeout mayor que cero no cambia el funcionamiento de los
programas generados. Sólo indica cuánto tiempo, como máximo, esperará el
usuario para recibir el mensaje de registro lockeado. Esta información es tratada
de formas diferentes según sean objetos con interfaz o no.
En el caso de un objeto con interfaz (transacciones), pasado ese tiempo se le
devuelve el control al programa y se le despliega un mensaje al usuario para
que este decida si reintentará o cancelará la espera. En el caso de un objeto sin
interfaz, con manejador SQL Server continúa esperando por la liberación del
registro (solo se especifica cuánto tiempo existe entre los reintentos) hasta que
este se libere, con manejador AS/400, reintenta hasta diez veces el tiempo
especificado y luego envía un mensaje al operador de sistema

CONFIGURACIÓN
Se modifico el diálogo de DBMSOption en la sección “DataBase Information”
para configurar dicha propiedad.

297
Configuración de Trace (GeneXus DB Activity
Trace)

Introducción
Esta facilidad permite generar información de diagnóstico (trace) de forma de
hacer más rápida y efectiva la labor de detección y reporte de fallas en el
funcionamiento de la aplicación.
Aplica al Data View Generator y a las aplicaciones generadas con C/SQL (usando
tecnología de acceso ODBC), Visual Basic Cliente/Servidor, Visual FoxPro
Cliente/Servidor y C#.

Modo de activación
Utilizando el ejecutable gxtrccfg.exe es posible configurar algunas opciones de
la facilidad de generación de trace. Al ejecutarlo se despliega el siguiente
diálogo:

298
Las opciones configurables son:

Cache Se utiliza memoria intermedia para el almacenamiento del


log de diagnóstico (CACHE).
Esta opción mejora sensiblemente el desempeño de la
generación de diagnóstico, solo debe ser utilizada en caso
de que la generación de log afecte de forma severa el
desempeño de la aplicación.
Debe ser deshabilitada en caso de estar diagnosticando
una aplicación que presenta finalización anormal (GPF),
esto es debido a que en estos casos el sistema pierde la
información contenida en el cache provocando que el log
de diagnóstico quede incompleto.

Avoid critical error En caso de error critico se genera el reporte


report correspondiente dentro del log.
Esto sucede aun si la opción de trace esta deshabilitada (
0, “No trace”).
Esta opción permite anular ese comportamiento.
Recomendamos permitir la generación de trace en caso de
error crítico, esta opción solo debe utilizarse si por algún
motivo específico de la estación de trabajo es necesario
evitar la generación del archivo de trace en caso de error
critico.

Generate DBMS Genera el plan interno de ejecución del DBMS para


explain plan cada sentencia. Puede degradar la performance, y
debe ser habilitado solamente en casos de extrema
necesidad.

Generate time cost Habilita la inclusión del tiempo consumido por cada rutina,
info en el log.
El tiempo se representa en tics.
(18 tics = 1 segundo)

299
Tracefile path Indica el directorio donde se generará la información de
trace. El mismo debe existir, de lo contrario no se habilita
el boton de OK. Debe especificarse solo el directorio, el
nombre del archivo de trace se genera automáticamente
con una combinación de letras y números diferente en
cada ejecución, y la extensión es ‘log’. En el caso de que se
esté ejecutando una aplicación que utiliza mas de una
conexión, se genera un archivo de trace por cada una de
ellas, cambiando el sufijo del nombre.

Trace level Indica el nivel de detalle que debe alcanzar el trace, la


escala es de 0 a 6.
Cero significa no generar trace, 6 significa generar trace
con máximo nivel de detalle.

300
Funcionalidades Específicas de los
Generadores

C#

Sección específica del generador C#

Requerimientos
Para compilar los programas generados por este generador es necesario tener
instalada la versión release del Framework SDK.

Funcionalidades
Este generador incluye todas las funcionalidades de los generadores web de la
versión GeneXus 75, con algunas excepciones desarrolladas en el siguiente
párrafo.

Consideraciones generales

Objetos WEB
No es posible la generación de objetos con Interfase GUI (Win), únicamente
objetos Web (Web Panels, Transacciones con form HTML, Procedimientos)

Reportes y procedimientos
En esta versión no se generan reportes. Los procedimientos no es posible
llamarlos desde la linea de comandos, no se soporta la propiedad Command
line.

Manejo de schema XML


Esta disponible el método Addschema del tipo de datos XmlReader, con este es
posible validar los datos Xml de un namespace dado, mas información

Por mas información del generador dirigirse al Manual del Generador C# 7.5

301
C/SQL

Sección Específica C/SQL

Compatibilidad
IMPORTANTE
En la versión GeneXus 7.5 se realizaron varios cambios en las
preferencias del modelo y DBMS Options con respecto a la versión 7.0,
algunos de estos cambios son:
- Cambio de valores por defecto
- Nuevas preferencias
- Nuevos valores de preferencias
- Eliminación de preferencias

Cabe destacar que el cambio en los valores por defecto de las


preferencias provocarán un cambio en el comportamiento de las
aplicaciones que los utilizaban. Por este motivo se recomienda revisar
detenidamente la sección del generador C/SQL en el documento
“Administración de Propiedades”.

• En esta versión se modifica el esquema utilizado para las llamadas vía


RPC. Por más información referirse a la sección Nuevas
Funcionalidades/Nuevo esquema RPC.

• A partir de esta versión el generador C/SQL permite generar reportes en


modo gráfico en ambientes Windows. Para mantener compatibilidad con
el comportamiento anterior se dispone de una serie de preferencias. Por
más información referirse a la sección Nuevas
Funcionalidades/Impresión gráfica.

• A partir de esta versión, se eliminó el valor “Not specified” de la


preferencia Target Operating System por lo que los modelos que tuvieran
este valor (situación no recomendada) tendrán ahora el valor “Windows”.

• A partir de esta versión, se incluyó la preferencia ‘Extension for Web


Programs’. En versiones anteriores, los programas Web generados para
ambientes UNIX no incluían extensión. Para tener el mismo
comportamiento deberán modificar a <none> el valor de esta nueva
preferencia. Por más información referirse a la sección Nuevas
Funcionalidades/Extension for Web Programs.

• A partir de esta versión el valor por defecto de la preferencia


correspondiente a la versión del precompilador Pro*C de ORACLE pasa a
ser 8.1 que se corresponde con la versión más usada. Si trabajaba con el
valor por defecto anterior (2.1), debería editar la preferencias del modelo
y modificar el valor correspondiente.

• A partir de esta versión se deja de soportar el comando msg('main')


como forma de ejecutar un programa C/SQL desde la consola (DOS). En
su lugar se debe modificar la propiedad ‘Call protocol’ con el valor

302
‘Command line’.
El error que se produce en cualquier objeto que tenga dicho comando es
el siguiente: “Don't know how to make xxxxxx_rpc.c, donde xxxxx es el
nombre del objeto”.

Nuevas funcionalidades
Generales
ACCESO VÍA ODBC
En la versión GENEXUS 7.5, el generador C/SQL permite trabajar únicamente
con ODBC, en lugar de SQL Embebido como tecnología de acceso a los datos.
Por más información referirse a la documentación: ODBC.

NUEVO ESQUEMA RPC


Hasta la version GENEXUS 7.5 el esquema RPC que permitia la invocación de
programas C/SQL por las aplicaciones visuales generadas con Visual Basic
C/S y Visual Foxpro C/S, estaba basado en los protocolos DCOM y ONCRPC
para los ambientes Windows y Unix respectivamente.

A partir de esta nueva versión, el esquema RPC esta basado en el protocolo


SOAP, lo que implica que no se requiere un servidor RPC, sino un servidor
Web. Por más información referirse a la documentación: ‘Remote Procedure
Call’.

IMPRESIÓN GRÁFICA
En la versión GENEXUS 7.5 se implementó la generación de reportes gráficos
en ambiente Windows para el generador C/SQL. A partir de este momento el
usuario puede crear reportes gráficos utilizando el Report Viewer. Por más
información referirse al documento ‘C/SQL - Impresión gráfica’.

SOPORTE POSTGRESQL
En la versión GENEXUS 7.5 se implementó la posibilidad de utilizar el
manejador de base de datos POSTGRESQL con el generador C/SQL. Por más
información referirse al documento PostgreSQL.

PREFERENCIA ‘EXTENSIONS FOR WEB PROGRAMS‘


Se agrega la preferencia ‘Extensions for Web Programas’ en el generador
C/SQL. De esta forma se puede indicar la extensión deseada en la generación
de objetos Web. Esta preferencia es especialmente útil en ambientes UNIX,
donde la configuración de permisos de directorios virtuales se especifica a
partir de la extensión de los programas. Por más información referirse al
documento ‘Preferencia Extensions for Web Programs’.

PASAJE DE LONGVARCHAR ENTRE OBJETOS


A partir de esta versión se pueden pasar parámetros de tipo LongVarChar a

303
objetos main C/SQL.

LLAMADA ENTRE OBJETOS MAIN C/SQL


A partir de esta versión se pueden realizar calls entre objetos main
generados con C/SQL. Esta invocacion se basa en el protocolo SOAP.

PREFERENCIA ‘REORGANIZE SERVER TABLES’


Se agrega la preferencia ‘Reorganize Server Tables’ en el generador C/SQL.
De esta forma se puede evitar ejecutar creaciones y/o reorganizaciones en
modelos en los que el generador C/SQL sea el generador principal del
modelo. El valor por defecto de la propiedad es ‘Yes’.

CONFIGURACIÓN DEL TAMAÑO DEL POOL DE SENTENCIAS


Se implementó la posibilidad de configurar el tamaño del pool de sentencias.
Se agrega una entrada al archivo de configuración gxcfg.ini denominada
Maxopenstatements que permite configurar el pool de sentencias. El valor
mínimo es 25, cualquier valor menor se ignora y se fuerza el mínimo.

MANEJO DE LA OPCIÓN SILENT


Se modifico el esquema del ".Silent" en los archivos makefiles, para poder
controlarlos desde la línea de comandos.
La opción .Silent dentro de los archivos utilizados para compilar las rutinas de
soporte permite determinar si se envían todos los mensajes a la ventana de
compilación.
Esto es útil para determinar posibles errores en la ejecución de dichos
archivos.

Para que aparezca el detalle de lo que se esta ejecutando se debe modificar


el script utilizado (ZZZexec, gxmkdata, etc) comentando la asignación de la
variable de ambiente "GXMKOPT". La línea es: set GXMKOPT=/S.

En plataformas Windows contiene el valor "/S" y en Unix "s".

304
Aplicaciones Web

ISAPI
A partir de esta versión, se incluye una nueva forma de generar objetos Web
utilizando ISAPI. Por más información al respecto referirse al documento
ISAPI.

DEVELOPER MENU PARA APLICACIONES CON INTERFAZ WEB


Se implementó el Developer Menu para aplicaciones con interface Web.
Este objeto contiene a todos los objetos con interface Web que se haya
definido en el modelo.Aparece cuando se presiona F5 desde GENEXUS, con la
descripción Developer Menu y cuando la preferencia Generate Developer
Menu Makefile tiene el valor YES. Este es el valor por defecto

OPTIMIZACION EN LA GENERACIÓN DE OBJETOS WEB


Se optimizó la generación de objetos Web (Web Panels y Transacciones
Web). Esto significa que se redujo significativamente el código de los objetos
web generados, con la consiguiente reduccción de tiempos de generación y
tamaño de los ejecutables.

C/SQL - Acceso vía ODBC

Introducción
Una nueva característica del generador C/SQL en la versión GENEXUS 7.5, es
que se puede trabajar únicamente con ODBC como tecnología de acceso a los
datos de la aplicación generada, en lugar de SQL Embebido.

Alcance
Objetos: Web Panels, Web Transactions, Procedimientos, Reportes
Lenguajes: C/SQL
Interface: Win - Web

Descripción
Para determinar el método de acceso a utilizar, se deben tener en cuenta varios
aspectos. Los requerimientos también son diferentes según el acceso.

Requerimientos
SQL EMBEBIDO
Cuando se genera C/SQL con SQL Embebido como método de acceso, es
necesario tener instalado en el servidor el pre-compilador correspondiente al
DBMS.

305
ODBC
Cuando se genera C/SQL con ODBC como método de acceso, es necesario
tener instalados los drivers ODBC correspondientes en el servidor.

SQL Embebido VS. ODBC


Normalmente el usuario puede optar por un método de acceso u otro, no
habiendo grandes diferencias de performance en el resultado de las
ejecuciones. Sin embargo, hay casos en los que se debe utilizar únicamente
ODBC como método de acceso:

1. Si se generan Web Objects con ISAPI, el método de acceso que se debe


utilizar es ODBC.
2. Si el modelo accede a otro/s DBMS/s diferente al definido por defecto,
entonces los accesos a los datos de el/los mismos se realizan a través
de ODBC.

Pasos a seguir para habilitar el acceso vía ODBC


Para poder generar C/SQL y utilizar ODBC como método de conexión, es
necesario seguir los pasos que se detallan a continuación:

UNIX
1. Configurar el ambiente ODBC en el servidor de procesos UNIX. (es decir,
instalar el manejador ODBC y el driver ODBC especifífico para el DBMS.
2. Instalar las rutinas de soporte (ejecutando el GXCSetup) con ODBC
3. Modificar la preferencia del modelo “Access Method” con el valor ODBC
4. En las opciones de ejecución (F5) ingresar en Script Name mkgxdata
5. Agregar en la preferencia “User Libraries” del modelo, las bibliotecas que
requiere el driver manager que se está utilizando. Para saber cuáles son
hay que editar el archivo makefile que viene como ejemplo con el driver
manager. Esto no se puede realizar en forma automática, ya que el
nombre de las mismas depende del ambiente.

WINDOWS
1. Instalar los drivers ODBC en el servidor de procesos Windows.
2. Dependiendo del mecanismo de conexión ODBC definido en el modelo
(preferencia Connect Using), será necesario definir en este servidor el
datasource especificado en el modelo. Este data source debe pertenecer
al sistema (“SYSTEM DSN”).
3. Instalar las rutinas de soporte (ejecutando el GXCsetup) con ODBC.
4. Modificar la preferencia del modelo ‘Access Method’ con el valor ODBC
5. En las opciones de ejecución (F5) ingresar en Script Name mkgxdata.bat

Generación de Web Objects como ISAPI

Introducción
Hasta la versión GENEXUS 7.0 los Web Panels generados por C/SQL eran

306
programas CGI (Common Gateway Interface). Estos programas CGI eran
ejecutados en el servidor y el código HTML resultante era enviado al browser del
cliente.
A partir de la versión 7.5, se incluye una nueva forma de generar Web Objects
utilizando ISAPI en ambientes Windows.

Alcance
Objetos: Web Panels, Web Transactions, Procedimientos, Reportes
Lenguajes: C/SQL
Interface: Web

Descripción
ISAPI (Internet Server Application Program Interface) provee un mecanismo
para desarrollar aplicaciones que se ejecutan en el espacio de direcciones del
servidor Web en ambientes Windows, teniendo acceso a todos los recursos
disponibles por dicho servidor.

Como consecuencia de esta implementación, ISAPI presenta una serie de


diferencias con respecto a los programas CGI. De estas diferencias, algunas son
ventajas y otras desventajas de una implementación frente a la otra.

• Carga del Servidor Web

Al ejecutar en el mismo espacio de direcciones que el Servidor Web, las


aplicaciones ISAPI tienen menor overhead que las aplicaciones CGI.
Con las aplicaciones CGI, cada requerimiento de ejecución crea un nuevo
proceso y crea también procesos adicionales costosos -como la conexión a una
o varias fuentes de datos- por cada uno de los requerimientos.














 
 
 
 



 




 
 



 


 




 

   




 

! 


   













 

• Estabilidad

Una característica fundamental de los Servidores Web es su alta disponibilidad.


Es por esta razón, que la utilización del espacio de direcciones del Servidor Web
puede ser una desventaja, ya que una falla crítica en un módulo ISAPI que
provoque un acceso no válido de memoria puede tener como resultado la
cancelación del Servidor Web.

• Recompilación de módulos

La facilidad de mantener en memoria los módulos para su ejecución, pueden


transformarse en una desventaja en las etapas de prototipación, ya que no es
posibile recompilar un módulo que está cargado en memoria.

307
Para poder hacerlo es necesario reiniciar el servicio del Servidor Web. Existe una
solución a este problema que consiste en agregar la entrada
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/W3SVC/Parameter
s/CacheExtensions=0 en el registro de Windows.
Por más información sobre esta característica se puede consultar:
http://msdn.microsoft.com/library/devprods/vs6/visualc/vccore/_core_what_are
_some_programming_tips_for_using_isapi_on_iis.3f.htm

Recomendación
Como conclusión, es recomendable el uso de Web Objects ISAPI en ambientes
donde la carga del Servidor Web es importante. Se recomienda también,
utilizar Web Objects CGI en ambientes de prototipo y utilizar ISAPI en
ambientes de producción una vez que la estabilidad de las aplicaciones ha sido
probada.

Generación GeneXus ISAPI


Para generar los Web Objects ISAPI, se agregó una nueva preferencia a nivel de
modelo denominada Web Server Module Protocol en la sección Web Information,
la cual debe setearse en ISAPI. Para generarlos como CGI debe setearse el
valor CGI.

Estos objetos deben compilarse del mismo modo que los Web Objects CGI,
usando el boton COMPILE del Diálogo Run de GENEXUS. Se generan archivos
diferentes: para CGI los programas generados son ejecutables y para ISAPI se
generan bibliotecas dinámicas.

Web Server Extensión de


Module Protocol archivos generados
CGI .exe
ISAPI .dll

Además, la conexión a la base de datos debe realizarse utilizando ODBC y no


SQL embebido, por lo que la preferencia Default Access Method del modelo
C/SQL debe setearse con el valor ODBC y las rutinas de Soporte del generador a
utilizar deben tener instalado el Soporte ISAPI y el Soporte ODBC.

Utilizando ISAPI no pueden obtenerse los valores de las variables de ambiente


con la función no estándar GETENV.

Generación de trace
Es posible activar la generación de trace en Web Objects ISAPI, lo cual puede
ser muy útil para determinar la causa de posibles problemas.
Para activarlo se debe ejecutar el archivo gxtrccfg.exe en el servidor donde
están los Web Objects e indicar el directorio de salida del trace. Luego de la
ejecución de los Web Objects, se crearán varios archivos con extensión .log
con la información de las operaciones realizadas.

308
Configuración Servidor Web.
Para la ejecución de Web Objects ISAPI, el Servidor Web debe ser Internet
Information Server 4.0 o superior en un ambiente Windows NT/2000.

En el Servidor Web, se debe habilitar la ejecución de módulos ISAPI. Esta


configuración varía dependiendo de la versión del software.

Además, es necesario que el usuario que ejecute los Web Objects (normalmente
el usuario anónimo del Servidor Web), tenga permisos para ejecutar sentencias
ODBC, por lo que debe definirse con los permisos del grupo Powered Users.

Niveles de Aislamiento ISAPI


Con la versión 5.0 de Internet Information Server existen tres niveles
configurables de aislamiento bajo los cuales ejecutar los módulos ISAPI. En
versiones anteriores solo existían dos (LOW y HIGH).

• LOW(IIS Process)
Esta opción se comporta rigurosamente bajo las
condiciones comentadas hasta el momento. El módulo ISAPI
se ejecuta dentro del proceso del servidor de Web con
las ventajas y desventajas ya mencionadas.

• MEDIUM(POOLED)
Los módulos ISAPI que se ejecuten con esta opción se
ejecutan en un proceso separado al servidor de Web. Esto
hace que sea una alternativa más segura y de menor
performance que la anterior. Bajo esta opción si un
módulo provoca un error serio como un error general de
protección, el servidor de Web no sufrirá las
consecuencias, a lo sumo cancelarán otros módulos ISAPI
que compartan el proceso. Esta opción solo está
disponible en la versión 5.0.

• HIGH(ISOLATED)
Esta última opción hace que cada módulo ISAPI sea
ejecutado en un proceso aislado. Es la opción más segura
pero por sus características, casi no se distingue en
cuanto a sus ventajas del CGI.

Se puede decir que estas tres opciones tienen ventajas y desventajas que
cambian gradualmente según cual se utilice. Manejándolas se puede elegir entre
el compromiso de desempeño y solidez que cada aplicación Web requiera. La
opción ideal dependerá de la carga que deba soportar el sito Web, las
necesidades de disponibilidad y el grado de madurez de la aplicación y los
procesos de prueba que se hayan hecho.

CONFIGURACIÓN
Para configurar la opción de aislamiento a utilizar puede utilizarse la consola de
configuración del Internet Information Server. Normalmente esta opción se
define a nivel de directorio virtual aunque también es posible hacerlo a nivel de
módulo ISAPI (dll). Mas detalles sobre este asunto pueden encontrarse en la
propia documentación del Internet Information Server.

309
NOTA:
La generación ISAPI aplica únicamente a ambientes Windows. No aplica a los
ambientes UNIX.

Preguntas Frecuentes
1. ¿PUEDEN GENERARSE ALGUNOS WEB PANELS CGI Y OTROS ISAPI?
La preferencia Web Server Module Protocol determina el modo de
generación de los Web Objects, al ser a nivel del modelo aplica a todos
los Web Objects del mismo.

2. ¿ PUEDEN CO-EXISTIR EN EL MISMO SERVER APLICACIONES CGI E


ISAPI?
Sí. El Servidor Web puede configurarse para ejecutar aplicaciones de tipo
CGI e ISAPI por lo que pueden coexistir sin inconvenientes.

3. ¿SIRVEN LAS MISMAS RUTINAS DE SOPORTE DEL GENERADOR


C/SQL?
Para generar ISAPI, se debe instalar el módulo ISAPI en la ejecución del
GXCSetup (GENEXUS C/SQL Setup Wizard). De esta forma, las rutinas
instaladas pueden utilizarse tanto para generar Web Objects ISAPi como
CGI.

4. ¿QUE PASOS DEBEN SEGUIRSE PARA GENERAR WEB OBJECTS


ISAPI?
Los pasos a seguir son:
1. Instalar las rutinas de soporte GENEXUS (utilizando el GENEXUS
C/SQL Setup Wizard) incluyendo ODBC e ISAPI.
2. Setear la preferencia Default Access Method con el valor ODBC
3. Setear la preferencia Web Server Module Protocol con el valor
ISAPI.

Preferencia "Extension for WEB programs"

Introducción
En las versiones anteriores a GENEXUS 7.5, los objetos Web generados en
C/SQL para servidores UNIX no tenían ninguna extensión. Esto causaba que en
algunos Servidores Web no se pudieran configurar permisos diferentes para
archivos que estuvieran en el mismo directorio, situación muy común con los
objetos web y las imágenes o archivos javascripts utilizados por estos.
Para evitar esto, se implementa una nueva preferencia a nivel de modelo
denominada Extension for WEB Programs.

En ambientes Windows, esta preferencia tambien permitirá evitar que


programas de download de archivos (como Gotzilla) intenten bajar los objetos

310
Web en lugar de ejecutarlos.

Alcance
Lenguajes: C/SQL

Descripción
La preferencia Extension for WEB Programs permite establecer cuál es la
extensión con la que se generan los ejecutables de Web (Web Panels, Web
Transactions y Procedimientos/Reportes con la propiedad call protocol
HTTP/SOAP) de un modelo C/SQL. No aplica a los programas de
creación/reorganización de la base de datos.

Se define a nivel de modelo y pertenece a la sección Web Information. Aplica


únicamente cuando el valor de la preferencia “Generation Mode” es Dynamic
Panels y cuando el valor de la preferencia "Web Server Module Protocol" es
CGI. Para el valor ISAPI siempre se generan ejecutables de Web con extensión
dll.

Los valores posibles de esta preferencia son:

.cgi Es el valor por defecto cuando el valor de la preferencia


Target Operating System es UNIX-alike
.exe Es el valor por defecto cuando el valor de la preferencia
Target Operating System es Windows
. dll Es el valor seleccionado automáticamente y no
modificable cuando la preferencia Target Operating
System es Windows y la preferencia Web Server Module
Protocol es ISAPI
<none> Este valor no genera extensión en los programas Web.
Aplica unicamente cuando el valor de la preferencia
Target Operating System es UNIX-alike.
Es un valor para compatibilizar con las versiones
anteriores de GeneXus.

C/SQL- impresión gráfica en windows

Introducción
Hasta la versión GENEXUS 7.5, el generador C/SQL disponía unicamente de la
impresión en modo texto de los reportes. A partir de ahora, se dispone también
de la impresión en modo gráfico para la plataforma Windows usando el Report
Viewer.

Alcance
Objetos: Procedimientos, Reportes
Lenguajes: C/SQL

311
Descripción
A continuación se describe el uso de la impresión gráfica en objetos C/SQL que
ejecutan en ambiente Windows.

Compatibilidad
Anteriormente se generaba únicamente salida de tipo texto de reportes, aún
cuando los reportes fueran gráficos.
Para mantener compatibilidad con las versiones anteriores, se agregan las
siguientes preferencias:

"GRAPHIC REPORT OUTPUT"


La preferencia ‘Graphic Report Output’ controla la forma en que van a ser
generados los reportes gráficos.
Los valores posibles son:

• Report viewer: La impresión se realiza utilizando el Report Viewer.


• Text: La impresión es de tipo texto, obteniendo como salida un
archivo con extensión prn. Este valor aplica a plataformas Windows y
Unix-Like. Si se selecciona el valor ‘Unix-Like’ en la preferencia
‘Operating System’, este es el valor fijo, ya que no hay opción de
modificarla.

El valor por defecto de esta preferencia es ‘Report Viewer’.

"TEXT REPORT OUTPUT"


Esta preferencia controla la forma en que van a ser ejecutados los reportes
de tipo texto.
Los valores posibles son:
• Report viewer: La impresión se realiza usando el Report Viewer. Este
valor aplica únicamente a plataformas Windows. Estos objetos (reportes
o procedimientos) se generan con una letra fija similar a la de una
impresora de matriz de punto (Courier new 10).
• Text: La impresión es de tipo texto (Windows / Unix). Si se selecciona el
valor ‘Unix-Like’ en la preferencia ‘Operating System’, este es el valor
fijo, ya que no hay opción de modificarla.

El valor por defecto de esta preferencia ‘Report Viewer’.

Instalación
Para poder utilizar esta característica, se agregaron los archivos estándar
rbuilder.dll y rbuilder.lib. Dichos archivos no se arman, sino que se copian al
subdirectorio "lib" del directorio de instalación de las rutinas de soporte durante
la instalación de las mismas (GXCSetup).
Antes de ejecutar cualquier reporte gráfico con el Report Viewer, es necesario
copiar la rbuilder.dll al directorio de los programas, o agregarla en el path del
servidor.

Preferencias
Si se está trabajando sobre plataforma Windows (valor “Windows” de la
preferencia ‘Target Operating System’) se agregan las preferencias:

312
"SHOW PRINTER DIALOGS ON REPORTS"
Se aplica cuando la salida del reporte es dirigida directamente a la impresora.
(&Output="PRN" o valor ‘Only to printer’ de la propiedad ‘Report Output’ del
objeto).

Nota: El valor ‘Yes’ de esta preferencia es válido únicamente cuando el reporte


se ejecuta desde la línea de comandos en la consola del servidor. En caso
contrario la aplicación no devuelve el control al objeto que lo invocó vía
httpRPC.

"REPORT VIEWER"
Bajo el grupo ‘Report Viewer’ se encuentran una serie de preferencias que
controlan la ejecución del Report Viewer. Las mismas se detallan a continuación.

Nota: Este grupo de preferencias aplican cuando el reporte es ejecutado desde


la línea de comandos en la consola del servidor. La ejecución siempre es modal.

Maximized
Esta preferencia controla si la ventana del Report Viewer aparece
maximizada o no. Los valores posibles son:

• Yes: la ventana del Report Viewer aparece maximizada.


• No: la ventana del Report Viewer no es maximizada.

El valor por defecto de esta preferencia es ‘No’.

Always on Top
La preferencia ‘Always on top’ controla si la ventana va a aparecer delante
de las demás ventanas hasta que la misma sea cerrada.

• Yes: la ventana del Report Viewer aparece delante de todas las


ventanas.
• No: la ventana del Report Viewer no aparece delante de las demás
ventanas.

El valor por defecto es ‘No’.

Formas de ejecución
Los objetos C/SQL pueden ser ejecutados en diferentes formas, dependiendo de
la configuración de la propiedad ‘Call protocol’ del objeto. A continuación se
detallan las consideraciones necesarias para poder obtener el reporte gráfico en
cada caso.

EJECUCIÓN DESDE LÍNEA DE COMANDO


Si la propiedad ‘Call protocol’ tiene asociado el valor ‘Command Line’, el
reporte puede ser ejecutado desde la consola del servidor.
En este caso todos los valores de las propiedades del reporte son válidos.

313
Si la propiedad ‘Report Output’ tiene asignado el valor ‘Ask User’, al ejecutar
el objeto se visualiza el diálogo que se presenta a continuación, cabe
destacar que el mismo diferencia mayúsculas de minúsculas:

Send report to printer(Y/N)? _

Si el usuario responde ‘N’, se abre el Report Viewer, en caso contrario la


acción dependerá de la configuración de la propiedad ‘Report Output’.

EJECUCIÓN VÍA HTTPRPC


Si la propiedad ‘Call protocol’ tiene asociado el valor ‘Internal’, el reporte es
llamado vía httpRPC desde una aplicación visual que está ejecutando en un
PC cliente. En este caso hay valores de propiedades que no aplican, ya que la
llamada al reporte se ejecuta en forma sincrónica (el cliente queda esperando
a que finalice el proceso en el servidor). En consecuencia, no todas las
preferencias del generador relacionadas con la impresión aplican cuando el
objeto es llamado vía httpRPC (Ver sección ‘Preferencias’).
Cuando un objeto con print blocks es llamado vía httpRPC, las únicas
propiedades que aplican del conjunto ‘Options’ son:
Report Output
Si el reporte es llamado vía RPC, el único valor válido de esta propiedad es
‘Only to File’.
Si el valor seleccionado es ‘Ask User’ u ‘Only to Screen’, el programa una
vez llamado no devuelve el control al PC cliente, por lo que la aplicación no
responde.

Footer on last page


Permite indicar si se va a imprimir pie de página en la última página del
reporte.

Por más información referirse al documento ‘Impresiones con GeneXus’.

314
Java

Sección específica del generador Java

Compatibilidad
Para aquellos usuarios que venían trabajando con alguna versión anterior del
generador se recomienda tener en cuenta los siguientes puntos:

• Solo es posible utilizar esta versión del generador con la versión 7.5 de
GeneXus. O sea, no es compatible con versiones anteriores (7.0, 6.1 ni
6.0).

• Cambiaron las clases estándar GeneXus (gxclassr.zip), por lo que es


incompatible con el anterior, ésto implica que todos los modelos
generados con una versión anterior a la 7.5 de Java, deben ser
regenerados, esto es correr un ‘Build all’ para regenerar todos los
objetos.

• Verificar que en el directorio ‘C:\WINDOWS\Downloaded Program Files’


NO estén las ‘GeneXus Java Standard Clases’. Si están, se debe hacer un
‘Remove’ para poder compilar satisfactoriamente con Microsoft.

• Para modelos con Web panels. Los web panels SOLO se generan en
modelos con User Interface = Web Form. Aquellos que tengan web
panels generados en un ambiente con User Interface = Win Form, deben
o bien cambiar la interafaz a Web, o bien definir en el modelo un nuevo
ambiente (File – Edit – Models - ‘Environments’ – Add) seleccionando a
Java como generador y Web Form como User Interface.

• En caso de aplicaciones en múltiples capas o aplicaciones web (servlets)


será necesario actualizar las clases standard (gxclassr.zip) en los
servidores donde estén corriendo el servidor de aplicaciones y el servidor
de servlets.

• En la versión GeneXus 7.5 se realizaron varios cambios en las


preferencias del modelo y DBMS Options con respecto a la versión 7.0,
algunos de estos cambios son:

- Cambio de valores por defecto


- Nuevas preferencias
- Nuevos valores de preferencias
- Eliminación de preferencias

Cabe destacar que el cambio en los valores por defecto de las


preferencias provocarán un cambio en el comportamiento de las
aplicaciones que los utilizaran. Por este motivo se recomienda revisar
detenidamente la sección del generador Java en el documento
Administración de preferencias

315
Nuevas funcionalidades

Generales
NO SE GENERAN MÁS LAS GXDB++
A partir de esta versión, se eliminó la generación de las GXDB++. Ahora,
para cada objeto GeneXus se genera una clase que se llama
objetogx$<nombre_de_datastore> y habrá uno para cada datastore.

Son las equivalentes a los 'fW*.class' de la versión 7.0, la diferencia es que


en vez de una clase por cada 'foreach', hay una por cada objeto.

En arquitecturas de múltiplies capas, y a consecuencia de esta nueva


implementación, se hicieron los siguientes cambios a nivel de preferencias:

 Se eliminó la preference 'Remote GXDB++ Location'.


 Se agregó la propiedad opción 'Multi-tier Location'. Es la equivalente a
'Remote GXDB++ Location'-. Si se abre un modelo de la 7.0 con esta
versión, esta propiedad heredará el valor que tenía la preferencia
eliminada. La diferencia con esta preferncia es que está a nivel de
datastore en vez de a nivel de modelo y será el location que ejecutará las
clases nombradas anteriormente: objetogx$<nombre_de_datastore>

NOTA
No será más necesario correr los 'Create Database' con Reorganize Server
Tables=no. En cambio, al hacer una reorganización, es necesario regenerar
aquellos objetos que utilizan las tablas cambiadas.

Esta nueva implementación facilita a aquellos usuarios que trabajen con RPG,
donde ambos generadores: RPG y Java debían ser el generador de la 'reorg'.

SE IMPLEMENTÓ LA GENERACIÓN DE HELP


Para cada help ingresado en GeneXus se genera un archivo html bajo el
folder Help que se encuentra bajo el folder del modelo.

Se puede optar por generar el help en formato CHM o tener el help en


archivos htmls y mostrarlos en el browser cuando son solicitados.

Para ello se creo el grupo de preferences Help dentro del grupo de


preferences User Interface.

Se agrega el grupo HELP en las preferencias del modelo, con siguientes


valores:

Help Mode - Se puede optar por los valores:


• Windows HTML Help - Si se va a generar la ayuda como CHM.
• Web HTML Help - Si se va a generar la ayuda como HTML. En el caso de
tener esta ultima seleccionada se habilita la siguiente:
- WebHelp base URL - define la URL donde se van a buscar la ayuda
en formato HTML, por ejemplo: http://servidorweb/HelpAplic.

Por mas información sobre generación de Help desde GeneXus en la versión


7.4, referirse al siguiente documento: HTML Help

316
SOPORTE SDI Y MDI EN JAVA
A partir de 7.5, además de SDI se soporta MDI para WFC.
Para especificar una u otra forma se agregó una preference:

'Generate MDI Application'

con valor YES por defecto. Esto implica un cambio en el comportamiento por
defecto de las aplicaciones, que se hizo con el fin de compatibilizar el valor
con el resto de los generadores. Para que la aplicación Java funcione como en
versiones anteriores, se debe cambiar este valor a ‘NO’.

SE IMPLEMENTÓ EL MODO DISPLAY (DSP)


A partir de la 7.5, se cuenta con el modo DISPLAY para transacciones Java

USUARIO Y PASSWORD ENCRIPTADOS EN LOS .CFG’S


Los valores de usuario y password se guardan encriptados en los archivos de
configuración (*.cfg)

El utilitario ServerConfig también graba dichos valores encriptados.

Si se desea cambiar el usuario/password de un .cfg sin utilizar el


ServerConfig, se puede utilizar un utilitario que viene con el generador
llamado PasswordChanger que permite encriptar el usuario y password en
los .cfg

La manera de utilizarlo es la siguiente:

• Poner en el classpath el gxclassr.zip


• Llamarlo de la siguiente forma:

jview com.genexus.PasswordChanger

-file:<filename> (por defecto, client.cfg)


-namespace:<namespace> (por defecto 'default')
-datastore:<datastore> (por defecto 'DEFAULT')
-user:<user> (requerido)
-password:<password> (requerido)

También es posible modificar los archivos de configuración manualmente, y


escribir los valores sin encriptar. La aplicación generada detectará que están
sin encriptar y los utilizará tal como fueron ingresados.

CLAVES DE ENCRIPTACIÓN EN ARCHIVO DIFERENTE AL CLIENT.CFG Y


SERVER.CFG

Se implementó una forma de dejar grabadas las claves de encriptación en un


archivo diferente al client.cfg y server.cfg. Este archivo es el crypto.cfg
Cuando se desea poder cambiar las claves de encriptación desde fuera de
GeneXus se puede utilizar el utilitario com.genexus.PasswordChanger. En
ocasiones además se requiere que éstas queden en un archivo diferente al
client.cfg/server.cfg.

317
Si existe un archivo que se llama crypto.cfg en el _mismo directorio_ que el
client.cfg/server.cfg, entonces se usan las claves de este archivo.

El archivo debe tener el siguiente formato:


[Encryption]
SiteKey=7E2E22D26FF2989E2444852A85E57866

donde sitekey es una clave valida.

Esta clave también la usa el com.genexus.PasswordChanger por lo que es


posible cambiar el user-password con ese utilitario respetando la clave.

TRANSACCIONES CON BACK-END HTTP


Se implementó en el generador Java las transacciones con back-end http.

La principal ventaja de este esquema es que puede tenerse una arquitectura


similar a las 3 capas pero sin necesidad de un servidor de aplicaciones, solo
alcanza con un motor de servlets. Además se utiliza http como protocolo de
comunicación entre capas en vez de RMI/CORBA/DCOM.

Por más información al respecto referirse al documento Transacciones con


back-end http

REPORTES MODO TEXTO INDEPENDIENTES DEL REPORT VIEWER.


Se implementó la forma de generar los reportes en modo texto,
independientemente del Report Viewer (rbuilder.dll). Esto habilita una
alternativa a los reportes gráficos con formato PDF para la impresión en
plataformas no windows.

Para generarlos, se debe especificar lo siguiente:


• Preference 'Text report output' = Text. (el otro valor es Report
Viewer). Esta preference se encuentra en el grupo user
interface/printing
• En los reportes:
o Si se manda a pantalla, entonces la salida va a standard output
o Si se manda a impresora, va a un archivo que se llama
<nombre del objeto>.prn
o Si se manda a archivo, va a un archivo que se llama <nombre
del objeto>.prn, salvo que se tenga la regla output_file(&File,
"txt").

SE IMPLEMENTÓ LA REGLA Y COMANDO ERROR_HANDLER EN JAVA


Se implementó la regla y comando Error_handler en Java. La misma provee
al usuario una forma dinámica de realizar acciones específicas cuando ocurre
un error relacionado a ala base de datos en tiempo de ejecución.

La descripción detallada del Error_handler se puede encontrar en el help de


Genexus.

CAMBIÓ LA FORMA DE PASAR LOS PARÁMETROS A CLASES EXTERNAS


No hay más 'GXString', 'GXDate', etc. Esto implica que queda incompatible
con código java que se haya escrito a mano usando los GXString/Date, etc.

318
Se debe cambiar en estos programas externos el tipo de datos de los
parámetros y usar los tipos java como arrays[1], o sea

String[] a
byte[] b

PROPIEDAD ISPASSWORD SOBRE CAMPOS EDIT


Se implementó la propiedad Ispassword sobre los campos edit para utilizarla
en interfaz win.

NUEVA FUNCIÓN PARA EL MANEJO DE FTP: GXFTPDELETE


Se agregó a las funciones de ftp existentes la función gxftpdelete.
La sintaxis es la siguiente:
call(gxftpdelete, &Archivo) - Borra un archivo del servidor ftp.

FUNCIONES FTP A TRAVÉS DE UN PROXY USANDO NETCOMPONENTS


Se implementó la forma de poder manejar las funciones FTP a través de un
proxy sin tener que agregar la biblioteca NetComponents.jar al classpath.

AGREGAR LÍNEAS A UN ARCHIVO DE TEXTO YA EXISTENTE


Se agrega un parámetro a la función DFWOPEN que permite indicar la forma
en que se quiere abrir el archivo.

Nueva sintaxis:

dfwopen( <filename>[, <fdel>[, <sdel>[, <app>]]]])

Este parámetro <app> es un numérico de 1 que puede valer 0 o 1. En 0 no


hace el append, sino que sobrescribe el archivo y si vale 1, hace el append ,
agregando las lineas al final del archivo. Es opcional y si no se especifica, el
valor default es 0.

AL EXPORTAR REORGANIZACIÓN SE PERMITE CONFIGURAR OPCIONES DE


DBMS
Se permite configurar las opciones del DBMS en el paquete a exportarse con
los programas de reorganización. Al llamar al utilitario Export Reorganizatin
del Developer menu se obtiene el siguiente diálogo:

319
En el mismo se puede configurar:

Filename Nombre del paquete java que


contendrá los programas de
reorganización
JDBC URL La especificación varía según el
driver jdbc utilizado. Aquí se debe
especificar el nombre del servidor,
puerto y nombre de base de datos
que desea reorganizar
User Usuario de base de datos con
permisos para correr programas de
reorganización
Password Password de usuario especificado en
User
Include configuration file in JAR Permite dejar el archivo REORG.CFG
fuera o no del .jar a crear. Cuando
no se conocen los datos anteriores al
momento de generar este paquete,
se puede desmarcar esta opcion y
asi cambiar estos valores en otro
momento.

FORMATO 'ANSI (Y/M/D)' PARA LAS FECHAS.


Se implementó un nuevo valor para la preference "Date Format". El mismo es
"ANSI (Y/M/D)"

SOPORTE PARA 'MERANT JDBC CONNECT (TYPE 4)' PARA SQLSERVER


Se soportan los drivers 'Merant JDBC Connect (Type 4)' para Sql Server a

320
partir de la 7.5 de GeneXus. Los mismos se obtienen de:
http://www.merant.com/products/datadirect/

CAMBIOS DE NOMBRES EN PREFERENCE ‘CONFIRM TRANSACTION’


Cambió el nombre a ‘Confirmation’
Cambiaron los nombres de sus valores de
 ‘Confirm each action’ a ‘Always prompt’
 ‘Do not confirm each action’ a ‘Never promt’

SE ELIMINÓ LA PREFERENCE 'GENERATE MAKEFILES'


Desde la versión 7.0 sólo se generan los makefiles cuando es absolutamente
necesario, es decir cada vez que se genere un objeto no se van a generar
todos los makefiles que lo incluyen, sino que sólo se va a generar los
makefiles cuando cambia el árbol de llamadas.
Con este cambio, deja de tener sentido esta preference, y por esta razón fue
eliminada.

CONOCER VERSIÓN DE LAS CLASES ESTÁNDAR


Se implementó el poder conocer que versión de las clases estándar del
generador están siendo utilizadas.

Para el caso de los servlets se puede ejecutar la siguiente URL:


http://ServerName:8080/servlet/com.genexus.webpanels.gxver

Para el resto de los casos se puede ejecutar la clase com.genexus.Version


teniendo en el classpath el gxclassr.zip. La versión será mostrada en la salida
estándar.
Por ejemplo:
Set classpath=gxclassr.zip
jview com.genexus.Version

Aplicaciones múltiples capas


SOPORTE PROTOCOLO HTTP PARA APLICACIONES 3 CAPAS
Se implementó el soporte para el protocolo HTTP para aplicaciones 3 capas.
Se cuenta con 2 nuevos valores para la preference PROTOCOL bajo el grupo
Distribution Execution:
• 'Using Stateless HTTP'
• 'Using Stateful HTTP'

Utilizando este protocolo se puede utilizar la seguridad del servidor web,


entonces la aplicación puede pedir usuario y password en el cliente. El
usuario ingresado puede luego ser obtenido por la función userid("server").
Aprovechando esta funcionalidad no es necesario utilizar LDAP para
aplicaciones 3 capas con HTTP.

Por más información referirse al documento Aplicaciones Multi-tier con http


como protocolo de comunicación.

321
MAYOR FACILIDAD PARA PROTOTIPAR EN MODELOS 3 CAPAS (RMI,
CORBA, DCOM)
Se implementó una forma de levantar al servidor de aplicaciones desde
GeneXus. Existe una nueva opción en el F5 que tiene las siguientes
características:

NAME = ApplicationServer
DESCRIPTION = GX Application Server
TYPE = Precompiled Utility
ENVIRONMENT = Java

Para poder ejecutar esta opción es necesario poner el camino completo el


gxclassr.zip en el classpath.

Adicionalmente a partir esta versión se puede indicar que las clases a


ejecutar por el servidor de aplicaciones sean “leídas” de un directorio en lugar
de tener que empaquetarlas en un .jar. Utilizando esta nueva funcionalidad e
indicando que el reloading de las clases sea automático se puede hacer que
el servidor de aplicaciones “lea” las clases del directorio del modelo sin
necesidad de tener que volver a levantar el servidor de aplicaciones cada vez
que se produce un cambio en el modelo. Esta es la opción de ejecución por
defecto.

REPORTES EN EL SERVIDOR
Se soporta la ejecucion de reportes en el servidor y visualizarlos en el cliente.
Para ésto se implementaron las siguientes funciones:

- getremotefile(&ServerFile, &LocalFile)
Copia un archivo del servidor al cliente

- opengxreport(&FileName)
Abre un .GXR

El usuario GX debe programarlo de la siguiente forma;

Sea RReport el reporte que se desea correr en el server, entonces debe


tener:
- la property 'Report output' seteada con el valor 'to file'
- la regla output_file(&FileName)
- debe ser remoto, o sea main y un location especificado

En el objeto llamador, en el cliente, se debe programar lo siguiente:

call(RReport, &FileName )

// Traer el archivo del server al cliente


&a = getremotefile(&FileName, "report.gxr")

// Abrir el reporte
&a = opengxreport("report.gxr")

// Borrar el archivo
&a = deletefile("report.gxr")

322
CAMBIOS EN ESQUEMAS DE 3 CAPAS
Se realizaron los siguientes cambios en el esquema de 3 capas:

• Se quitaron las siguientes preferences:


o ORB Connection timeout (seconds); el valor es siempre 300.
o Automatic Remote Procedure Host

• El servidor de aplicaciones "escucha" solo un protocolo: o rmi, o


dcom, o corba, o http stateful o http stateless, pero no combinaciones
de ellos simultáneamente. En consecuencia, se quitó el valor
"Installed ORB" en la preference "Protocol".

• Se cambió el nombre de la preference "Name Server Host" por


"Application Server Host"

• El servidor de aplicaciones siempre ejecuta los accesos a la base de


datos local, es decir no se puede correr esta parte del código en forma
remota por otro servidor de aplicaciones.

Se realizaron cambios en el ServerConfig para reflejar estos cambios:

323
CAMBIOS EN LA IMPLEMENTACIÓN DEL POOL READ-ONLY
Se hicieron algunos cambios en relación al comportamiento del pool read-
only:

- Cuando una conexion read-only da un error, se saca la conexion del pool, y


se cierra (en realidad no se cierra enseguida, se cierra cuando algun otro
usuario pide una conexion). Esto implica que los usuarios que la estuvieran
usando van a recibir un error, pero que cuando se conecten de nuevo
obtendran otra conexion y seguiran trabajando.

- Se agrega una preference 'Maximum clients per read-only connection


(default=10)' que se graba en el .cfg con la clave 'PoolROUsers'.
Indica la cantidad de usuarios finales entran en un misma conexion read-
only. Esto permite limitar la cantidad de usuarios que van a caer cuando haya
un error en una conexion. Por ej, si se deja '10', entonces solo van a caer
10 usuarios cuando a uno le de por ejemplo, un Internal Driver Error. Se
agrega esta preference tambien en el ServerConfig.

- El default del tamaño del pool read-only paso de '1' a infinito, para que
funcione bien con el default de la preference anterior.

CAMBIOS EN SERVERCONFIG PARA MANEJO DEL POOL Y LOGGING


Se implementaron nuevas funcionalidades con respecto a las conexiones en 3
capas y al manejo de niveles de logs. La especificacion de la misma se realiza
en el ServerConfig

Recycle connections
Se soporta una nueva funcionalidad en los pools de conexiones

324
denominada 'Recycle connections' que puede ser habilitada o no.

Si se marca, se le puede especificar cada cuantos minutos puede reciclar


esa conexion. La idea es cuando pase ese tiempo de que la conexion se
creó, en el momento en que esté en un estado 'desconectable', se
desconecta del pool, y al usuario se le da otra conexion del pool. 'Estado
desconectable' es sin commits pendientes ni cursores abiertos en las R/W
y sin cursores abiertos en las R/O. El objetivo de esta feature es evitar que
una conexion este abierta 'para siempre'.

JDBC Log Configuration


Se agregó el tab 'JDBC log configuration' al form de 'namespaces' del
ServerConfig. Se pasó la parte de configuración JDBC a un tab propio.

325
En el tab se piden los siguientes datos:

* Log JDBC Activity: Checkbox que indica si se quiere habilitar el log o no.

* Enable buffering: Hoy el log es 'unbuffered', lo que implica que es muy


lento generar log. Si se pone 'buffered' es mas rapido pero como no se
graba 'enseguida', si se consulta un log mientras se esta ejecutando la
aplicacion, el log va a estar incompleto. Tambieén puede quedar truncado
si la aplicacion cancela con una excepcion no manejada por el programa.

* Log Detail : Combo con valores High y Low. Indica en nivel de detalle del
log. Con nivel 'high' de detalle el tamaño del log queda mucho mas grande
que con nivel 'low'

* Log Level : Combo con valores Namespace/Datastore/Connection.


Permite crear un archivo de log por namespace, o uno por cada datastore
o uno por cada conexion. Es util para que se mas facil entender el camino
de ejecucion de una aplicacion.

* Use unique name : Indica si se quiere que el nombre del archivo se


genere automaticamente o si se quiere usar uno 'fijo'. Si es automatico, se
pide el directorio donde se quiere guardar los logs. Si es fijo, se guarda
siempre en el mismo. Los nombres automaticos son de la forma "gx_" +
MMDD + "_" + HHMMSS + <namespace> + "_" + <datastore> + "_" +
<conexion> + ".log" (si se elige log level = conexion se ponen todos, sino
solo hasta datastore o namespace respectivamente).

CAMBIOS EN EL 'GENEXUS APPLICATION MONITOR'


Se implementó lo siguiente en el 'GeneXus Application Monitor':

• En el pool read-only se pone la cantidad de usuarios que estan

326
usando la conexion (corresponde al valor de configuracion de
cantidad de usuarios por conexion)

• En el pool read-write se pone el tiempo que hace que la conexion


esta esperando la ejecucion de una sentencia. La idea es poder
identificar que una conexion quedo en lock.

NUEVA OPCION "USING VISIBROKER" PARA "DISTRIBUTED EXECUTION"


Se agregó una nueva opcion "Using VisiBroker" para la preference "distribute
execution".
Esta opcion es solo válida si se va a utilizar VisiBroker 4.x o superior.

Utilizando esta opción ya no es necesario "levantar" el nameserv; por lo cual


solo alcanza con "levantar" el osagent y colocar en el classpath del cliente y
del servidor el archivo vbjorb.jar

A su vez ejecutando con la VM de sun ya NO es necesario indicar en la


command line por medio de properties que se va a utilizar VisiBroker

NUEVA PREFERENCE "CUSTOM NAME FOR CORBA SERVER"


Se agregó la preference "Custom name for CORBA server" en la parte
"Distributed Execution".
Seteando esta preference se pueden "levantar" N servidores CORBA de la
misma versión de GeneXus por PC.

SE SOPORTA ESPECIFICAR EL PORT ADEMAS DEL HOST PARA RMI


A partir de la versión 7.5 (también disponible upgrade 2 de la versión 7.0)
para aplicaciones en 3 capas con RMI, se soporta el poder especificar el PORT
además del HOST.

La forma de hacerlo es en la preference 'Name Server Host', para RMI, se


pone servidor:puerto. De esta forma se puede levantar mas de un servidor
de aplicaciones en el mismo equipo, incluso estos servidores de aplicaciones
pueden ser de distintas versiones.

Si no se especifica puerto, el puerto es 1099 como hasta ahora.

NUEVA PREFERENCE 'SERVER PORT FOR RMI OBJECTS'


Se implementó una nueva preference llamada "Server port for RMI Objects"
La misma permite definir el puerto en el que se crean los objetos RMI en el
servidor. De esta forma se abre solo ese puerto en el firewall además del
1099 que es donde escucha por defecto el servidor de aplicaciones GeneXus.

SE SOPORTA LEVANTAR 2 SERVIDORES DE APLICACIONES 7.0/7.5 EN EL


MISMO HOST

Hasta ahora no era posible levantar mas de un servidor de aplicaciones Java


de distintas versiones. Esto no permitía que en un mismo host convivieran
una aplicación 3 capas generada –por ejemplo- con la versión GeneXus 7.0
con una generada con la versión 7.5.

327
Se realizaron cambios en los siguientes archivos del generador:

 Se cambió el nombre de la DLL para manejo de DCOM. En vez de


llamarse gxdcomj.dll se llama gxdcomj75.dll.
 Se cambió el nombre del .exe para levantar el servidor de aplicaciones
como servicio NT. En vez de llamarse gxjsrv.exe se llama
gxjvsrv75.exe.

Por más información al respecto referirse al documento Servidores de


aplicaciones 7.0/7.5 en el mismo host

INSTALACIÓN DE APLICACIONES JAVA COMO SERVICIO NT.


Se implementó una forma de poder instalar aplicaciones Java como servicio
NT.
Por más información referirse al documento Instalación de Aplicaciones Java
como servicio NT con JSrvAny

Aplicaciones Web
WAR DEPLOYMENT
Se implementó un nuevo Output processor llamado War deployment.
El mismo permite empaquetar en un archivo con extensión war todo lo
necesario para ejecutar una aplicación web en un servidor de servlets,
cumpliendo con el estándar J2EE.

Por más información al respecto referirse al documento War Deployment

SE IMPLEMENTÓ EL 'DEVELOPER MENU' PARA 'WEB FORMS'.


Al ejecutarlo desde GeneXus (F5) se va a abrir una página en el navegador:

<path al dataXXX>\web\DeveloperMenu.xml

Esta página tiene links a todos los objetos Web, estos son web panels,
transacciones con Web form, procedimientos con call protocol = http y
reportes con call protocol = http.

Consideraciones:
En esta página están 'hard coded' los links usando la URL que está en Web
Server Root especificado en las opciones de ejecucion. Esto implica lo
siguiente:

• Si se cambia esta opción hay que regenerar un objeto para que


regenere el developer menu web.

• Si hay dos usuarios usando la misma KB, y tienen valores diferentes


en esta opcion, entonces el developer menu va a quedar apuntando al
del valor del último que generó.

SOPORTE PARA HTTPS EN JAVA.


Se implementó soporte de HTTPS en el tipo de datos HTTPClient, en el call
SOAP, y en las aplicaciones 3 capas con HTTP.

328
Para utilizarlo, depende de la Virtual Machine a utilizar, lo que es necesario
hacer:

 Ejecutando con la Virtual Machine de Microsoft:


Hay que agregar al classpath las bibliotecas de “iSaSiLk applet edition”. Este
producto es pago, pero existe una versión trial que puede obtenerse de
http://jcewww.iaik.at/products/index.php

Para utilizarlas hay que agregar al classpath los siguientes archivos:


iaik_ssl_ae.jar
iaik_jce_full_ae.jar

 Ejecutando con la Virtual Machine de Sun hay dos opciones:


1) Utilizar JSSE que se puede obtener del sitio de Sun http://java.sun.com
Se requiere JDK 1.2 o superior y agregar al classpath los siguientes archivos:
jcert.jar
jnet.jar
jsse.jar
En caso de JDK 1.4, éste ya viene con JSSE por lo cual no es necesario
agregar estos archivos al classpath.

2) Utilizar las bibliotecas de iSaSiLk


En este caso hay que agregar al classpath los siguientes archivos:
iaik_ssl.jar
iaik_jce_full.jar

OPTIMIZACIÓN EN LA GENERACIÓN DE LOS OBJETOS WEB


Se optimizó la generación de objetos Web (Web Panels y Transacciones
Web). Esto significa que se redujo significativamente el código de los objetos
web generados, con la consiguiente reduccción de tiempos de generación y
tamaño de los ejecutables.

Deployment Wizard
A partir de la 7.5 se dividió al Deployment Wizard en dos:

1) Advanced Deployment Wizard


2) Deployment Wizard

DEPLOYMENT WIZARD MAS SENCILLO


Es una versión simplificada del deployment wizard anterior. Ya no hay que
elegir los locations a generar, solo hay que elegir los mains. Además según el
tipo de aplicación para la cual se quiera armar el deployment se llama a un
output processor distinto:

 Si es una aplicación win en 2 capas, llama sólo al GeneXus Web Start


 Si es una aplicación win en 3 capas (RMI, CORBA, DCOM), se llama al
GeneXus Web Start para armar la parte del cliente, y el Jar
deployment para armar la parte del servidor.
 Si es una aplicación win en 3 capas (HTTP), se llama al GeneXus Web
Start para armar la parte del cliente, y el War deployment para armar
la parte del servidor.

329
 Si es una aplicación web, se llama al War deployment.

ADVANCED DEPLOYMENT WIZARD


Es el mismo Deployment Wizard de siempre, con la diferencia que se agregó
un output processor nuevo llamado "War deployment" que permite armar
paquetes para las aplicaciones web. Por más información al respecto referirse
al documento War Deployment

MEJORAS EN EL GENEXUS WEB START DEPLOYMENT


Se implementaron las siguientes funcionalidades en el GeneXus Web Start
Deployment:

 Se agrega versionado a las dependencias que NO sean ZIP/JARs (o


que sean zips corruptos) mediante otra técnica: Si la dependencia NO
cambio, entonces NO se actualizará cuando la aplicación se actualice.
Si se detecta que hubo cambios en la dependencia, entonces esta se
bajara completa cuando la aplicación se actualice (antes se bajaban
estos archivos siempre).

 Esto permite que uno pueda agreagar archivos de inicializacióon (x ej,


el GXPRN.INI) o DLLs directamente como dependencias. Hasta ahora
había forma 'manual' de hacerlo. Para estas dependencias, la
ubicación final en el cliente NO es el 'Shared Files', sino que es el
directorio de ejecución. Si bien en el 99% de los casos se dejan allí
(es lo recomendado), esto se puede cambiar modificando el .JNLP
generado.

330
 Se agregó al Wizard código para que chequee los Manifests de las
dependencias por inconsistencias (x ej, si pone un ContainerFiles con
un archivo que no existe o que tiene mal el case-sensitive). En estos
casos el Wizard devolverá un warning y algún hint (x ej, el case del
archivo) para ayudar al usuario.

 El botón ‘DCOM Client Configuration’ pasó del tab General al tab


Advanced.

 En el tab advanced se agregaron dos opciones:

'Use debug version of Chequeando esta opción y habiendo


GeneXus standard classes'. seteado en forma adecuada la
preference 'JDBC Log File' se permite
hacer un log JDBC en las aplicaciones
instaladas con el GeneXus Web Start.
‘Use custom GXWS Client Permite instalar el GXWS y la aplicación
Location’ en otro directorio. Al marcar esta opción
se habilita el ‘GXWS Client Location’: que
‘GXWS Client Location’ será el directorio base donde se
instalará el GXWS.

331
SETUP PARA APLICACIONES GENERADAS CON GXWS DEPLOYMENT
Hasta esta versión la instalación de las aplicaciones armadas con el GeneXus
Web Start Deployment sólo podían ser instaladas desde un web server.

Ahora es posible armar un ‘Setup’ para la aplicación y poder realizar la


instalación desde un CD por ejemplo.

Por más información al respecto referirse al documento Setup para


aplicaciones generadas con GXWS Deployment

OPCIONES PARA INTÉRPRETE JAVA EN GXWS DEPLOYMENT


En el GXWS Deployment se le agregó un tab ‘Advanced’ donde se permite
especificar ciertas opciones de ejecución que se desean pasar al intérprete al
momento de ejecutar la aplicación que está siendo armada.

El formato de esta lista de opciones debe ser el siguiente:


‘opcion=argumento’, separados por punto y coma (‘;’)

Por ejemplo: option1=data1;option2=data2

NUEVA OPCION 'SETUP-SETTING' EN MENU DEL GENEXUS WEB START


Las opciones del GXWS como ser lenguaje, habilitación para generar logs, etc
se debían setear editando el APPLICATIONS.INI

A partir de la version 7.5 (y también está disponible a partir del upgrade 2 de


la 7.0) en el GXWS se cuenta con una nueva opción en su menu: Setup –
Settings, donde se puede habilitar estas opciones.

332
Transacciones con back-end HTTP

Introducción
Hasta ahora las transacciones en Java podían ser generadas en 2 capas o en 3
capas (usando los protocolos RMI, CORBA o DCOM). En las transacciones de 2
capas tanto la interfaz como el acceso a la base de datos se resuelve en el
cliente utilizando JDBC. En cambio, en las transacciones de 3 capas la interfaz
se resuelve en el cliente, pero el acceso a la base de datos se realiza en un
servidor de aplicaciones: el cliente se comunica con el servidor de aplicaciones
con algún protocolo de los soportados y el servidor se comunica con la base de
datos a través de JDBC.
Con esta feature el generador Java soporta que una transacción pueda tener un
‘back-end’ http. Este concepto es similar al de 3 capas, o sea la interface se
resuelve en el cliente y el acceso a la base de datos se resuelve en un servidor
web, pero con la diferencia que la comunicación entre estos componentes se
hace por medio de un POST http y no se necesita un servidor de aplicaciones
para el componente que se ejecuta en el servidor, solo alcanza con un motor de
servlets que lo ejecute.

Alcance
Objetos: Transacciones
Lenguajes: Java
Interfaces: Win Form.

Descripción
Cuando se indica que una transacción utilice un http back end, se genera un
objeto para el cliente (front-end) con el mismo nombre de la transacción, y un
objeto para el servidor (back-end), que se llama igual que el objeto pero con el
sufijo ‘_server’. Este objeto back-end es invocado por el front-end haciendo un
POST.

El funcionamiento de la transacción es similar al de una transacción ejecutada


en 3 capas, pero existen algunas diferencias:
• La preference ‘Optimize for multi tier execution’ no puede configurarse
en ‘No’.
• No se soporta que la transacción no haga commit para ‘anidarla’ con otra
transacción. Siempre que se confirma se debe hacer commit.

La principal ventaja de este esquema es que se puede tener una arquitectura


similar a las 3 capas pero sin necesidad de un servidor de aplicaciones, solo
alcanza con un motor de servlets.

Para implementar esta funcionalidad se agregaron las siguiente propiedades:

A nivel de objeto:
• La property ‘Use HTTP back-end’ en el grupo ‘Java Specific’ de las
transacciones. Los valores de esta propiedad pueden ser ‘Yes’ o ‘No’,
siendo el valor por defecto ‘No’

333
A nivel de modelo:
• La preference ‘HTTP back-end base URL’ en la sección Web Information.
El valor de esta preference es la URL donde se encuentran los objetos
que se ejecutan en el servidor web, de modo que el cliente pueda
invocarlos. Este valor se guarda en el archivo ‘client.cfg’. Por ejemplo,
podría ser http://localhost:8080/servlet/.

Es necesario configurar la preference ‘Servlet Directory’, dado que allí se


copiarán las clases que deben ejecutar en el servidor.

Ejemplo
Para definir que una transacción llamada ‘PruebaHttp’ tenga back-end http se
siguen los siguientes pasos:

• Se cambia el valor de la propiedad ‘Use HTTP back-end’ a ‘Yes’

• Se ingresan valores para las preferences ‘HTTP back-end base URL’ y


‘Servlet Directory’

334
De esta forma se genera un objeto llamado ‘TpruebaHttp.class’ en el
cliente y un objeto llamado ‘TpruebaHttp_server.class’ en el directorio
‘D:\servlets’. Al ejecutar el objeto en el cliente es invocado el objeto en
el servidor haciendo un POST.

Nota: Para ejecutar la transacción, debe de estar ‘levantado’ ¿activo? el


servidor de servlets.

Consideraciones generales
• Actualmente no hay soporte en el Deployment Wizard para determinar
que parte de la aplicación debe ejecutar en el servidor web.

Servidores de aplicaciones JAVA 7.0 y 7.5 en el


mismo host

Introducción
Hasta ahora no era posible levantar mas de un servidor de aplicaciones Java de
distintas versiones. Esto no permitía que en un mismo host convivieran una
aplicación 3 capas generada –por ejemplo- con la versión GeneXus 7.0 con una
generada con la versión 7.5.

Descripción
Veamos con más detalle la forma de lograrlo y las combinaciones válidas según

335
el o los protocolos de comunicaciones que estén siendo utilizados:

PROTOCOLO CORBA

Se puede tener un servidor aplicaciones CORBA para GeneXus 7.0 y 7.5 en el


mismo servidor. Ejecutan usando el mismo servidor de nombres CORBA (solo
se levanta una vez el tnamesrv del JDK o el namesrv del Visibroker), y
GeneXus registra los servidores con nombres distintos, por lo que pueden
convivir.

PROTOCOLO DCOM

Se puede tener un servidor de aplicaciones DCOM para GeneXus 7.0 y 7.5


dentro del mismo servidor.

Se cambió el nombre de la DLL para manejo de DCOM. En vez de llamarse


gxdcomj.dll se llama gxdcomj75.dll. Pueden coexistir ambas DLLs en el
mismo equipo, por lo que los clientes pueden ejecutar aplicaciones 7.0 o 7.5.

PROTOCOLO RMI

En la preference Application Server Host, para RMI, si se pone algo del tipo
servidor:puerto, se puede levantar mas de un servidor de aplicaciones en el
mismo equipo. Estos servidores de aplicaciones pueden ser indistintamente
de la version GeneXus 7.0 o 7.5. Si no se pone nada, el puerto es 1099 (que
es el valor default)

Resumiendo, se puede tener N servidores RMI, en puertos diferentes, cada uno


para GX 7.0 o 7.5 indistintamente. Sin embargo para DCOM y CORBA solo se
puede tener, en un mismo host, un servidor GX 7.0 y un servidor GX 7.5.

SERVIDOR DE APLICACIONES COMO SERVICIO NT


Se puede levantar un servicio NT para atender aplicaciones GX 7.0 y otro
para atender aplicaciones generadas con la versión 7.5.
No se puede levantar dos servicios para la misma versión.

Se cambió el nombre del .exe para levantar el servidor de aplicaciones como


servicio NT. En vez de llamarse gxjsrv.exe se llama gxjvsrv75.exe. Se cambió
tambián el ServerConfig para que busque este nuevo .exe

Como el CLASSPATH se seteaa a nivel del sistema, no se puede agregar a él,


las clases standard de ambas versiones del generador (gxclassr.zip) de
ambas versiones. Para resolver este problema, se debe descomprimir el
gxclassr.zip de cada versión en los correspondientes directorios donde esté el
GXJVSRV75.EXE y GXJVSRV.EXE del servidor, dado que ese directorio lo pone
automáticamente en el CLASSPATH.

336
Setup para aplicaciones generadas con GXWS
Deployment

Introducción
Hasta ahora la instalación de las aplicaciones armadas con el GeneXus Web
Start Deployment sólo podían ser instaladas desde un Web server.

A partir de esta versión es posible armar un ‘Setup’ para la aplicación y poder


realizar la instalación desde cualquier lugar de la red, incluso copiarlo e instalar
desde un CD.

Descripción
Al GXWS Deployment se le agregó un tab ‘Advanced’ con las siguientes
opciones:

Create Setup CD:


Indica que se quiere generar un Setup. Si se habilita esta opción se despliegan
las siguientes opciones:

337
Target Directory:
Indica el directorio donde se copiarán los archivos del Setup. Si
se desea copiar a un CD, se debe copiar todo lo que queden en
este directorio. Si se copia este directorio en la raíz del CD, el
setup se disparará automáticamente al insertar el cd en el lector.
Install Virtual Machine:
Indica si se desea actualizar la versión de la Virtual Machine
automáticamente en el cliente al instalar la aplicación desde el
setup. Se puede instalar la VM de Microsoft o la de SUN. Si se
habilita esta opción se debe indicar si se desea instalar la versión
actual o una versión específica, además se despliega la siguiente
opción:
VM Location:
Indica la ubicación donde está la VM a instalar

Application URL:
Indica la URL del servidor HTTP donde va a residir la aplicación.
Si en el momento de crear el Setup no se conoce la ubicación final
del servidor, se debe dejar HTTP://, y debe setearse ‘Ask
Application URL’ para que la ingrese el usuario final.

Ask Application URL:


Indica si el usuario final va a poder modificar la URL del servidor
http donde va a residir la aplicación al instalarla desde el Setup.

Overwirte Existing GXWS:


Indica si al instalar la aplicación desde el Setup se instalará la
versión del Setup del GXWS.
Si el cliente tiene una versión del GXWS anterior a la instalada por
el Upgrade 2 del Generador Java de la versión 7.0 es necesario
habilitar esta opción.

Instalación de aplicaciones desde el Setup


Para instalar una aplicación desde el Setup hay que ejecutar el archivo
Setup.exe - del mismo.

Si se habilitó el check de ‘Install VM’, al generar el setup, se instalará la VM.


Entonces puede ser necesario reiniciar la PC para terminar la instalación de la
VM.

Luego se presentará una pantalla como la siguiente:

338
Dependiendo de si se haya habilitado o no la opción de ‘Ask Application URL’ al
generar el setup, se podrá ingresar la URL de actualización de la aplicación
(Application updat URL).

Una vez instalada la aplicación, se crearán los shortcuts a los objetos de tipo
Main de la aplicación en el menú de inicio. La funcionalidad en cuanto a
ejecución y actualización automática de las aplicaciones y GXWS será igual que
si hubiera sido instalada a partir del .html.

Propiedad Provider de subfile

Introducción
Esta propiedad de los subfiles permite que la carga del mismo se haga a partir
de un reporte/procedimiento con salida XML utilizando protocolo http.

Alcance
Objetos: Work Panels
Lenguajes: Java
Interfaces: Win Form.

Descripción
Los reportes/procedimientos con salida xml y call protocol HTTP se pueden
utilizar para implementar la propiedad provider de los subfiles. Esta propiedad
permite que la carga de datos de un subfile se pueda hacer a partir de un xml.
La idea consiste en crear un reporte/procedimiento xml que en un print block
contenga los mismos atributos que quiero cargar en el subfile y luego en la
propiedad provider del subfile pongo la URL del reporte/procedimiento.
Si quiero realizar carga de variables estas deben de tener el mismo nombre en
el workpanel y en el reporte/procedimiento.

Ejemplo
Supongamos que tengo un subfile con los atributos CliCod y CliNom. Creo un

339
reporte llamado Clientes que contiene dichos atributos en un print block y le
pongo salida xml y call protocol HTTP. Ingreso en la propiedad provider del
subfile la URL al reporte:
subfile.provider=http://localhost:8080/servlet/oClientes

Nota: La propiedad provider solo puede ser utilizada por el generador Java, pero
el reporte/proc con salida XML referenciado puede ser generado en cualquiera
de los generadores que lo permiten.

Instalación de aplicaciones Java como servicio NT


con JSrvAny

Introducción
Este documento explica como instalar como servicio una aplicación Java en
Windows NT, utilizando para ello un utilitario basado en una herramienta open
source llamada JsrvAny. (http://jsrvany.sourceforge.net/)

Alcance
Objetos: Transacciones, WorkPanels, Procedimientos, Reportes.
Lenguajes: Java
Interfaces: Win Form.

Descripción
Para instalar un servicio, es necesario ejecutar el jsrvany.exe con un conjunto
de parámetros que se detallan a continuación

-n ‘Nombre del Servicio’ Es el identificador del servicio. Con este nombre


aparecerá en la lista de servicios de Windows.
-d ‘Descripción’ Es el identificador descriptivo del servicio
(opcional)
-c ‘Clase a ejecutar’ Es el nombre de la clase con el servicio a
levantar.
-p ‘Classpath’ Indica el Classpath que necesita la aplicación para
ejecutar
-s ‘Nombre de Servicio’ Indica que el identificador de servicio pasado
como parámetro será una dependencia de este
Servicio. Esto quiere decir que antes de
levantarse el Servicio a instalar, se debe levantar
el servicio indicado en el parámetro. En caso de
que el servicio indicado en el parámetro NO se
pueda levantar, tampoco se podrá levantar este
servicio (opcional)
-a ‘argumento’ Pasa el argumento al Main del Servidor al ser
iniciado (opcional).
-o ‘property=value’ Indica que el ‘value’ estará asociado a la
‘property’ en las SystemProperties del Servicio.
(opcional)
-v ‘TargetVM’ Indica la VM con la que se va a ejecutar el

340
servicio. Los valores posibles son ‘MS’, ‘JRE’, o
‘ANY’
-r Indica que se desea eliminar el servicio NT.
-h Imprime una ayuda en línea

Ejemplo: Instalación como servicio del servidor de


aplicación GeneXus
Hasta la versión 7.0 de GeneXus la única forma de instalar un servidor de
aplicaciones GeneXus como servicio en Windows NT era utilizando el
‘gxjvsrv.exe’. Este mecanismo tenía algunos inconvenientes:
• El servidor de aplicaciones tenía que utilizar máquina virtual de
Microsoft.
• Solo se podía instalar un servidor de aplicaciones en cada servidor.
• No se podía especificar un classpath para la aplicación, se usaba el
classpath del servidor.
• No se le podían pasar valores de ‘System Properties’ a la máquina
virtual.

Utilizando el JsrvAny se puede hacer de la siguiente forma:


• Copiar el archivo JSrvAny.exe al directorio donde se desea instalar
el Servidor de Aplicaciones.
• Establecer un Nombre de servicio mediante el argumento –n
• Indicar mediante el argumento -c que la clase a ejecutar sea
‘com.genexus.distributed.NTService’
• Indicar la VM que se desea utilizar para ejecutar el Servidor de
Aplicaciones mediante el argumento –v
• Agregar el ClassPath necesario para ejecutar el Servidor mediante
el argumento –p. Esto incluye la clases estándar GeneXus
(GXclassR.zip), las clases necesarias para utilizar el JSrvAny
(JSrvAny.jar), las clases necesarias para utilizar el ORB (por
ejemplo, RMI.ZIP), y los drivers JDBC. El JAR generado por el JAR
Deployment NO debe ser agregado al classpath en este lugar, sino
que debe ser especificado mediante el ServerConfig.
• Indicar el nombre del archivo de configuración a utilizar mediante el
argumento –a “-cfg ....”. Por ejemplo, si el archivo se llama
‘server.cfg’ se debe pasar al JSrvAny -a “-cfg server.cfg”. NOTA:
es importante dejar las comillas.
• Si se desea que el JsrvAny guarde un Log de la última sesión
ejecutada se debe indicar mediante el argumento –a “-debug ...”.
Por ejemplo, si se desea guardar el log en el archivo
‘c:\NTService.log’, se debe pasar como parámetro al JSrvAny -a “-
debug c:\NTService.log”. NOTA: es importante dejar las
comillas.
• Opcionalmente se pueden agregar SystemProperties al servicio
mediante el argumento –o, y se pueden agregar Servicios
dependientes mediante el argumento –s.

Por ejemplo, si se desea instalar el Servidor de Aplicaciones en el directorio


‘c:\AppServer’ con:
• La VM del JRE
• Nombre de servicio NT: ‘MyAppServer’
• Archivo de configuración: ‘appServer.cfg’
• ORB: RMI
• JDBC: c:\jdbc\Una2000.jar

341
• Archivo de Log: ‘c:\NTService.log’

JsrvAny –n MyAppServer –v JRE –a “-cfg C:\AppServer\ appServer.cfg” –a “-


debug c:\NTService.log” –p c:\rmi\rmi.zip;
c:\AppServer\gxclassr.zip;c:\jdbc\Una2000.jar;c:\AppServer\JSrvAny.jar –c
com.genexus.distributed.NTService

Para eliminar el servicio habría que ejecutar:


JSrvAny –n MyAppServer –r

Aplicaciones Multi-tier con http como protocolo de


comunicación

Introducción
En el generador Java de la versión 7.5 existen dos nuevas opciones como
protocolo de ejecución en tres capas:

• Stateful HTTP
• Stateless HTTP

Alcance
Objetos: Work Panels, Transacciones, Procedimientos, Reportes.
Lenguajes: Java
Interfaces: Win Form.

Descripción
Stateful HTTP
Cuando se selecciona ‘Stateful HTTP’, la aplicación funciona del mismo modo
que con el resto de los protocolos (DCOM, RMI, CORBA), pero usando HTTP.

Utilizar HTTP en estos casos tiene algunas ventajas importantes:

• Si se ejecuta en Internet, no se tienen los problemas de configuración de


Firewalls y Proxies que existen con el resto de los protocolos.
• El ‘servidor de aplicaciones GeneXus’ deja de existir, y las aplicaciones
ejecutan dentro de un motor de servlets cualquiera. Esto permite
simplificar la instalación, configuración y administración de los servidores
de aplicaciones.
• En el resto de los protocolos, cuando el cliente se conecta al servidor,
mantiene una conexión física hasta que muere. Esto implica consumo de
recursos en el servidor. Con HTTP la conexión muere luego de cada
requerimiento.
• Es muy sencillo aumentar la cantidad de servidores de aplicaciones, dado
que hay mucha tecnología para tener balanceo de carga en servidores
HTTP.
• Se pueden utilizar los mecanismos de autenticación de los servidores
HTTP con lo que se elimina la necesidad de utilizar LDAP para

342
autenticarse con el servidor de aplicaciones.
• Es posible usar HTTPS (con algunas restricciones de ambientes), por lo
que se pueden tener canales de comunicación encriptados sobre internet.

Tiene también algunas desventajas:

• Se genera más tráfico. Los mensajes HTTP suelen ser mas grandes que
los mensajes CORBA/DCOM/RMI.
• Al tener que conectarse en cada requerimiento, es más lento. Esto es
solucionable si el servidor HTTP soporta HTTP 1.1, dado que en ese caso
el cliente HTTP mantiene la conexión viva por un tiempo dado. La
mayoría de los servidores soportan HTTP 1.1.

Stateless HTTP
Esta opción se comunica por HTTP pero trabaja de un modo diferente. Luego de
que finaliza un requerimiento del cliente al servidor, el servidor ‘desconecta’ al
cliente.

Conceptualmente, el mecanismo ‘stateless’ es posible implementarlo sobre


cualquiera de los otros protocolos. En la versión Solís solo está disponible HTTP.

En la opción Stateful se mantiene en el servidor cierta información para cada


cliente conectado. Por ejemplo, si tiene un workpanel con carga a pedido y tiene
un cursor abierto, ese cursor esta abierto en el servidor y asociado al cliente. Si
se invoca a un procedimiento actualizó la base de datos y no hizo commit, se
mantiene una conexión al DBMS asociada a ese usuario hasta que haga commit
o rollback. En la opción Stateless no existe nada de esto.

Algunas consecuencias de este comportamiento:

• Si se invoca a un procedimiento desde el cliente y el procedimiento no


tiene commit on exit, se hará automáticamente un rollback. Esto impide
tener un esquema en el que, por ej, desde un workpanel llame a un
procedimiento que actualice la base de datos y no haga commit, y que
luego se llame a otro procedimiento que haga commit.
• Como efecto lateral de lo anterior, no es posible tener transacciones
anidadas en la misma UTL.
• Si se ejecuta un For Each desde el cliente, se traen todos los datos desde
el servidor antes de empezar a recorrer los registros. Esto implica por
ejemplo que todos los subfiles de los workpanels son cargados como si
tuvieran ‘Load All’ (estamos estudiando alguna alternativa para
solucionar esto en algunos casos).
• No es posible ejecutar desde el cliente procedimientos que actualicen la
base de datos. Deben ser ejecutados todos en el servidor. Esto es porque
si se tiene un ForEach con un update dentro, el foreach se recorrerá todo
y recién luego empezará el update. Esto no funciona en algunos DBMSs
(por ej en el AS/400)
• En las transacciones, no se puede setear la propiedad ‘Optimize for
multi-tier execution’ en NO. Esto lo que hace es que las reglas se
disparen en el cliente, lo que permite que las reglas muestren interfaz de
usuario (por ej, que llamen a un workpanel). En este esquema desde las
reglas no se puede tener interacción con el usuario (salvo por la regla
msg y la regla error).

Todo esto implica que es altamente probable que una aplicación escrita en

343
GeneXus no funcione correctamente sin modificaciones en el diseño de la
misma.

La única ventaja de este mecanismo es la escalabilidad de la aplicación


resultante:

• Con el mecanismo stateful, una vez que un cliente se conectó a un


servidor, el resto del diálogo tiene que ser con dicho servidor. Esto tiene
algunas desventajas importantes:
o Esto implica que el ‘load balancing’ se tiene que hacer en tiempo
de conexión, y no puede ser ajustado dinámicamente
dependiendo de la carga del servidor durante la vida de la
aplicación.
o Si un servidor falla, el cliente no tiene forma de recuperarse, por
lo que no puedo tener un buen mecanismo de ‘failover’ en los
servidores que garantice la vida de los clientes.
El mecanismo stateless permite que cada request vaya a un servidor
diferente.
• No existe la posibilidad de que un cliente se quede con un lock mientras
tiene una pantalla de ingreso de datos. Esto reduce al mínimo los locks,
por lo que aumenta la capacidad de concurrencia de la aplicación.
• En el mecanismo stateful, si un requerimiento al servidor da error, se
debe cancelar la aplicación. Por ej, si se ejecuta un procedimiento que
actualiza la base de datos y da un error durante su ejecución, la
aplicación debe cancelar, dado que no es posible hacer un rollback y
reintentar la operación porque no se puede saber si la UTL se había
iniciado con este procedimiento o si se ya estaba iniciada previamente.
En el mecanismo stateless es posible reintentar las veces que quiera.

El mecanismo stateless es la única alternativa existente hoy si se quiere tener


aplicaciones altamente escalables, con servidores que puedan tener mecanismos
de failover, es decir que en caso de que un servidor caiga haya otro que tome
su lugar. Dependiendo de los requerimientos de la aplicación en estos aspectos,
puede valer la pena o no pagar el costo de rediseño.

Configuración del modelo GeneXus


Preferences

Protocol – especificar el protocolo a utilizar, por ejemplo ‘Using Stateful http’


Application Server Host – especificar la URL base de ejecución de la
aplicacion, bajo el motor de servlet, por ejemplo:
http://servername:8080/servlet

Multi-tier location – especificar un location para las clases remotas, por


ejemplo appserver.

Configuración del motor de servlets


En los motores de servlets existe el concepto de ‘Web Applications’. Una ‘Web
Application’ esta almacenada en un directorio, y tiene un conjunto de
subdirectorios predefinidos, cada uno con su contenido específico.

344
Adicionalmente, todos los motores de servlets tienen una ‘Web Application’ por
defecto, que es la que generalmente se mapea a la url ‘/servlet/’. El resto de las
aplicaciones web (las que no son default), tienen un prefijo antes de ‘/servlet/’,
por ejemplo ‘/examples/servlet/’.

En el directorio de las aplicaciones web, hay un subdirectorio que debe llamarse


‘WEB-INF’, bajo el cual puede existir un archivo web.xml que tiene información
de configuración de la aplicación.

Adicionalmente, bajo el directorio WEB-INF existe un subdirectorio ‘classes’


(donde se deben almacenar los servlets) y un directorio ‘lib’ (donde se debe
poner los .JARs).

Para que funcione una aplicación en 3 capas con HTTP es necesario copiar el
archivo gxclassr.zip (en algunos motores de servlets es necesario renombrarlo a
gxclassr.jar), y los .JARs con los drivers JDBC al directorio WEB-INF\LIB.

El servidor necesita encontrar el archivo server.cfg, donde se encuentra la


información de configuración de la aplicación. Para que ese archivo pueda ser
utilizado, debe o bien estar en el directorio ‘por defecto’ del motor de servlets (/
en Resin, /bin en Tomcat), o se debe modificar el archivo web.xml, de modo que
contenga el path al server.cfg:

<?xml version="1.0" encoding="ISO-8859-1" ?>


<!DOCTYPE web-app (View Source for full doctype...)>
<web-app>
<servlet>
<servlet-name>com.genexus.distributed.ServletAppServer</servlet-name>
<servlet-class>com.genexus.distributed.ServletAppServer</servlet-
class>
<init-param>
<param-name>configurationFile</param-name>
<param-value>c:\bankliteplus\data003\server.cfg</param-value>
</init-param>
</servlet>
</web-app>

En el <param-value> se debe poner el path al server.cfg. Para prototipar, se


recomienda poner el que corresponde al modelo de prototipo.

Autenticación
Es posible utilizar la autenticación del servidor web como mecanismo de
seguridad de las aplicaciones que ejecutan en 3 capas con HTTP. En caso de que
el servidor esté configurado para que se necesite autenticación, la aplicación
cliente solicitará un usuario/contraseña, y la utilizará en el tráfico HTTP.
Adicionalmente, la función userid(‘server’) devolverá este nombre de usuario.

Configuración de la seguridad en TomCat 4.0


En el directorio /conf existe un archivo tomcat-users.xml similar al siguiente:

<tomcat-users>
<user name="tomcat" password="tomcat" roles="tomcat, manager" />
<user name="role1" password="tomcat" roles="role1" />
<user name="both" password="tomcat" roles="tomcat,role1" />
</tomcat-users>

Para crear un usuario simplemente se agrega una linea a dicho archivo, y se le

345
da un nombre de rol determinado:

<tomcat-users>
<user name="tomcat" password="tomcat" roles="tomcat, manager" />
<user name="role1" password="tomcat" roles="role1" />
<user name="both" password="tomcat" roles="tomcat,role1" />
<user name="gx" password="gx" roles="appserveruser" />
</tomcat-users>

Luego, en el web.xml de la aplicación, se especifica que se quiere proteger la


aplicaciòn, y el tipo de autenticación:

<!-- Define a Security Constraint on this Application -->


<security-constraint>
<web-resource-collection>
<web-resource-name>Entire Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- NOTE: This role is not present in the default users file -->
<role-name> appserveruser </role-name>
</auth-constraint>
</security-constraint>

<!-- Define the Login Configuration for this Application -->


<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Tomcat Manager Application</realm-name>
</login-config>

En <role-name> se debe poner el nombre del rol al que se asignó el usuario


creado en el tomcat-users.xml.

Notas
El codigo generado es el mismo para http stateful, corba, dcom, y rmi. Por lo
que para cambiar entre estos, solo basta cambiar el valor deseado en
preference protocol y regenerar forzado algun objeto para que se tomen en
cuenta los cambios en el client.cfg y server.cfg (Key REMOTE_CALLS).

Cambia el codigo generado para las transacciones cuando se usa http stateless.
Por lo que si se desea cambiar de un protocolo a otro, en el peor de los casos es
cuando se pasa de stateless a otro o de otro a stateless, donde habrá que
regenerar las transacciones.

Esto nos habilitaria a tener el mismo codigo configurado para que por ejemplo
en una intranet se use corba/RMI/DCOM y en internet use http. En teoria seria
mas rápido que con HTTP, y HTTP para Internet nos da escalabilidad y facilidad
para convivir con firewalls.

TIPs
Tip 1
Para testear que el gxclassr.zip vay a ser encontrado por el cliente, en el
browser probar lo siguiente en la URL:

346
<Name Server Host>/com.genexus.distributed.ServletAppServer

Por ejemplo:

http://servername:8080/servlet/com.genexus.distributed.ServletAppServer

Si todo ok, debería aparecer lo siguiente en la pantalla del browser:

ServletAppServer esta funcionando


correctamente!

Tip 2

En caso de que no este levantado el servidor de servlets, se presentara el


siguiente error en el cliente:

class
com.genexus.distributed.stateless.transport.HTTPTransport/stateless

Connection refused

java.net.ConnectException: Connection refused


at java/net/PlainSocketImpl.socketConnect
(PlainSocketImpl.java)
at java/net/PlainSocketImpl.doConnect (PlainSocketImpl.java)
at java/net/PlainSocketImpl.connectToAddress
(PlainSocketImpl.java)
at java/net/PlainSocketImpl.connect (PlainSocketImpl.java)
at java/net/Socket.<init> (Socket.java)
at java/net/Socket.<init> (Socket.java)
at HTTPClient/HTTPConnection.getSocket (HTTPConnection.java)
at HTTPClient/HTTPConnection.sendRequest (HTTPConnection.java)
at HTTPClient/HTTPConnection.handleRequest
(HTTPConnection.java)
at HTTPClient/HTTPConnection.setupRequest
(HTTPConnection.java)
at HTTPClient/HTTPConnection.Post (HTTPConnection.java)
at
com/genexus/distributed/stateless/transport/HTTPTransport.send
(HTTPTransport.java)
at
com/genexus/distributed/stateful/client/StatefulApplicationClient.ge
tNewHandle (StatefulApplicationClient.java)
….

Tip 3
Si se tiene bien configurada la preference ‘Name Server Host’ y la gxclassr.zip
en el classpath del motor pero no se copió el server.cfg o en el web.xml se dio
mal la referencia, dara el siguiente error:

347
java.lang.InternalError: Server configuration file not found:
server.cfg

Tip 4
En caso de que encuentre un server.cfg por alguna razon, pero este no sea el
generado para ese modelo, puede presentarse un error de este tipo:

Client is using Stateful protocol whereas Server is using Stateless


protocol

com.genexus.distributed.stateful.StatefulException: Client is using


Stateful protocol whereas Server is using Stateless protocol

at
com/genexus/distributed/stateful/client/StatefulApplicationClient.getNewHan
dle (StatefulApplicationClient.java)

at com/genexus/db/UserInformation.getRemoteHandle
(UserInformation.java)

at com/genexus/db/UserInformation.getRemoteGXDBHandle
(UserInformation.java)

at com/genexus/db/DBConnectionManager.getDataStoreProvider
(DBConnectionManager.java)

at wtraamb.initialize (wtraamb.java)
….

War Deployment

Introducción
Los servlets pueden ser ejecutados por motores de servlet (Tomcat, Resin, Jrun,
etc), o por servidores J2EE (WebSphere, BEA Weblogic, etc).

En el Deployment Wizard se implementó un nuevo output processor llamado


War Deployment que permite empaquetar los servlets de forma de poder
instalarlos y ejecutarlos tanto en un motor de servlets, como en un servidor
J2EE. Este deployment genera archivos con extensión war (Web Archive
Resource). Estos archivos contienen servlets y contenido estático, como ser JSP,
HTML, imágenes, librerías adicionales (.jar), etc.

Adicionalmente los archivos war contienen un ‘descriptor’. Este descriptor es un


archivo con formato xml, que describe cierta información de la aplicación que el
.war contiene; por ejemplo el nombre de la aplicación y nombre de los servlets.

Descripción
Al ejecutar el Deployment Wizard (form win) en un modelo donde se tienen
objetos Web, se permite seleccionar los manis para los que se desea armar un
.war que contenga todo lo necesario para ejecutar al web panel main y todos los
llamados. Adicionalmente dentro del war se van a agregar todos los archivos
que se encuentren en el directorio indicado en la preference “Static content
directory seen form client”

348
Al finalizar, se presenta un wizard que permite guiar la creación del .WAR con
las siguientes opciones:

Location Aquí se debe seleccionar el Location para el cual se quiera


armar el war. Para el caso de querer armar un war para una
aplicación web se debe seleccionar el Location “<Client>”; el
resto de los locations son para el caso de querer distribuir las
clases necesarias para ejecutar el servidor de aplicaciones en
un aplicación en 3 capas son protocolo http.
Deploy this Se debe chequear si se desea armar un war para el Location
Location actualmente seleccionado
Descriptor Se especifica el motor de servlets que se va a utilizar y en
Type función de ello se arma el descriptor correspondiente (ver mas
adelante)
Web Este es el nombre que identifica a la aplicación web. Para
Application algunos motores de servlets va a ser utilizado luego en la URL
Name para invocar los servlets.
Additional Aquí se deben agregar todos las librerías adicionales para
Libraries ejecutar la aplicación; el caso más común es el de los drivers
JDBC.
Additional Esta es una estructura de directorios (que por defecto es vacía)
Files en las la cual se puede agregar todo el contenido estático que
se necesite para ejecutar la aplicación.
Add Permite agregar un directorio a la estructura de directorios de
Directory Additional Files
Remove Permite borrar un directorio a la estructura de directorios de

349
Directory Additional Files
Add Files Agrega un contenido estático a los Additional Files en el
directorio seleccionado.
Remove Borra un contenido estático antes agregado en los Additional
Files Files.

Deployment Descriptor
En el wizard, en el tab ‘Deployment Descriptor’, se edita – en formato XML - el
descriptor del .war a generarse.

Use Custom Deployment Al chequear esta opción se permite modificar el


Descriptor descriptor por defecto
Get Default Vuelve a obtener el descriptor por defecto
Validate Valida el XML del descriptor en caso de haberlo
modificado.

350
Instalación del war sobre motores de servlets
Tomcat 3
El war debe ser copiado al directorio /webapps del Tomcat. Luego al reiniciar al
motor el war es descomprimido.
Para ejecutar los servlets hay que utilizar la siguiente URL:
http://<servidor>:<puerto>/<Web_Application_Name>/servlet/<Nombre_servl
et> por ejemplo http://localhost:8080/EjemploWar/servlet/hmain
Si se quiere volver a instalar el war hay que borrar el directorio que creo el
Tomcat al momento de descomprimir el war.

Resin
El war debe ser copiado al directorio /webapps del Resin. Luego al reiniciar al
motor el war es descomprimido.
Para ejecutar los servlets hay que utilizar la siguiente URL:
http://<servidor>:<puerto>/<Web_Application_Name>/servlet/<Nombre_servl
et> por ejemplo http://localhost:8080/EjemploWar/servlet/hmain

Jun 3.0
Para instalar un war en el Jun 3.0 hay que utilizar el “Jun Management
Console”.

Dentro del Jun Management Console hay que seleccionar el “Jun Default
Server/Web Applications”. Ahí hay que seleccionar “Deploy an Applicaction” que
muestra esta pantalla.

351
Aquí hay que buscar el war generado e ingresar en “Application Name” el
identificador de la aplicación y en “Applicaction URL” algo que identifique a la
aplicación que luego va a ser utilizado en la URL para llamar a los servlets, por
ejemplo /miapp.
La URL queda de la siguiente forma:
http://<servidor>:<puerto>/miapp/servlet/<Nombre_Servlet>

Instalación del war sobre servidores J2EE


El estándar J2EE indica que una aplicación web debe ser empaquetada en un archivo con
extensión .war. Los archivos war están contenidos dentro de un archivo con extensión .ear
(Enterprise Archive Resource) que representa una aplicación enterprise contenedora de
aplicaciones web. Estos archivos contienen además de archivos war, módulos EJB y un
descriptor general de la aplicación enterprise en formato xml.
Los archivos ear hay que instalarlos sobre un servidor J2EE y los archivos war hay que
instalarlos dentro los ear antes instalados. Por lo tanto en un servidor J2EE van a existir
varias aplicaciones enterprise que a su vez tienen dentro una o varias aplicaciones web.
Entonces para el caso de los servidores J2EE los archivos war generados por el War
Deployment hay que instalarlos sobre un aplicación enterprise.

WebSphere 4.0
Para instalar un war en el websphere 4.0 hay que utilizar el “Administrator’s
Console”.

352
Dentro del Administrator’s Console hay que seleccionar
“Nodes/<server>/Enterprise Applications”. Ahí hay que presionar el botón
“Install” que muestra esta pantalla.

353
Aquí hay que buscar el war generado en “Path” e ingresar en “Application
Name” el identificador de la aplicación y en “Context Root” algo que identifique
a la aplicación que luego va a ser utilizado en la URL para llamar a los servlets,
por ejemplo /miapp.
La URL queda entonces de la siguiente forma:
http://<servidor>:<puerto>/miapp/servlet/<Nombre_Servlet>

Al dar siguiente aparece la siguiente pantalla:

Aquí hay que dar siguiente sin cambiar nada y la aplicación queda instalada.

Para poder utilizar la aplicación hay que reiniciar el websphere.

354
Visual Basic

Sección Específica del generador Visual Basic

Compatibilidad
IMPORTANTE
En la versión GeneXus 7.5 se realizaron varios cambios en las
preferencias del modelo y DBMS Options con respecto a la versión 7.0,
algunos de estos cambios son:

- Cambio de valores por defecto


- Nuevas preferencias
- Nuevos valores de preferencias
- Eliminación de preferencias

Cabe destacar que el cambio en los valores por defecto de las


preferencias provocarán un cambio en el comportamiento de las
aplicaciones que los utilizaran.
Por este motivo se recomienda revisar detenidamente la sección
del generador Visual Basic en el documento “Administración de
Propiedades”.

• Campos numéricos se implementan como Currency


A partir de esta versión se cambió la forma de definir los campos
numéricos en el generador Visual Basic.
Ahora los numéricos se definen de la siguiente manera:

- Currency: Numéricos con cantidad de decimales <= 4 y


largo <= 18 (incluyendo parte entera y decimal)
- Double: El resto

Con esta implementación se elimina el tipo de datos single que se


utilizaba hasta ahora para definir los numéricos.

Esta implementación tiene la ventaja de que cuando se realizan


operaciones con números que tienen decimales no se tiene que utilizar la
función round.

Workaround
Para volver para atras lo anterior (es decir, seguir generando single y
double, sin currency) hay que poner en el config.gx
WA0005=Y

y se vuelve a la definir como se hacía anteriormente utilizando los tipos


single y double.

• Se eliminó la preferencia “Visual Basic Version”, a partir de esta versión


no está mas la preferencia, porque unicamente se permite trabajar con
Visual Basic 6.0, y no con Visual Basic 5.0

• Se eliminó la preferencia “Generate Web Panels as WebClasses”, a partir

355
de esta versión no es posible generar Web Panels como CGI, unicamente
es posible trabajar con Web Panels generados como WebClasses.
Por esta razón también se eliminó el diálogo de preferencias de ejecución
para Web Panels CGI (CGI-BIN path y StartUrl) que se configuraban en
el F5 de GeneXus (Build / Run / Botón de Options).

• La Common Dialog Function “GXSelDir” que es la que permite seleccionar


un directorio, no estaba actualizada, esto es, le faltaban algunas
funcionalidades que permitían el resto de las funciones.
Por ejemplo, la GXSelDir no permitía crear directorios y
no soportaba nombres de directorios largos.
A partir de esta versión, la función GXSelDir está actualizada y permite
estas acciones.

• Se cambió el control que se utiliza para el calendario


En esta versión se cambió el control que se utiliza para
manejar el calendario que aparece cuando se presiona
botón derecho sobre un atributo de tipo fecha.
El control que se utiliza a partir de este momento es MSCOMCT2.OCX.

• Se cambió el default de la propiedad ‘Prompt for Confirmation’


Por más información referirse a la sección Propiedad "Prompt for
Confirmation".

• Nueva dll para aplicaciones Cliente/Servidor


A los efectos de unificar el código con los demas generadores, a partir de
esta versión se utiliza una nueva dll de Cliente/Servidor
(GXDATA70.DLL).

La generación de trace es diferente con esta nueva dll (consultar la


sección ‘Configuración de trace (GeneXus DB Activity Trace)’).

• Cualquier aplicación Cliente/Servidor sobre el DBMS DB2 Common


Servers que utilice acceso ODBC para acceder a la base de datos y
realice cualquier sentencia SELECT FOR UPDATE, da el siguiente error:

OdbcMessage:'[IBM][CLI Driver][DB2/NT] SQL0510N UPDATE or


DELETE is not allowed against the specified cursor.
SQLSTATE=42828

Para solucionarlo hay que apagar la opcion "Deferred Prepare" en las


preferencias del data source (botón "Advanced", Tab "Compatibility").

• Si se trabaja con modelos que contengan Transacciones Web y base de


datos Access, es recomendable configurar la preferencia a nivel de
modelo ‘Local Database File’, para indicar el camino (absoluto o relativo)
en que se encuentra la base de datos (GX_DATA.MDB), incluso se puede
cambiar el nombre de la misma.
Esto es porque a partir de la versión 7.5, se genera el directorio Web
para guardar los objetos generados con el Generador Web, pero la base
de datos se sigue accediendo desde el directorio DataXXX correspodiente
al modelo.
Este cambio provoca que cuando se pongan en producción los objetos
Web, la base de datos se va a buscar un directorio más arriba que el que
se encuentran los objetos compilados, y si en el servidor Web no se tiene
la misma estructura de directorios que la que se tenían en la máquina de
desarrollo, no se encontrarán los datos.

356
Nuevas funcionalidades
DEVELOPER MENU PARA APLICACIONES CON INTERFAZ WEB
Este objeto contiene a todos los objetos con interfaz Web que se haya definido
en el modelo.
Es el que aparece cuando se presiona F5 desde GX, con la descripción
“Developer Menu”.

PRINT COMMAND (PRNCMD) VARIABLE


A partir de esta versión el comando PRNCMD en reportes, soporta que el valor
sea pasado en una variable.
Solo se permite el uso de una única variable, no se soportan expresiones ni
mezcla de variables con constantes.

Ejemplo:
Los siguientes comandos son válidos:
prncmd &pepe
prncmd \018 E \015

Los siguientes comandos no son válidos:


prncmd &pepe \018
prncmd str(15)
prnmd &pepe + &pepe3

REORGANIZACIONES BATCH
A partir de la versión 7.5 es posible ejecutar las reorganizaciones Visual Basic en
forma batch.

Para hacerlo se debe ejecutar desde la linea de comando:

rmenu -nogui

Esto ejecuta la creación / reorganización sin necesidad de la intervención del


usuario, es decir no aparecen los diálogos para confirmar las acciones.

PROPIEDAD ‘SETFOCUS’ PARA TAB DIALOGS


Esta propiedad se puede cambiar en tiempo de ejecución y la sintaxis para
utilizarla es la siguiente:

NombredelTab.SetFocus()

SE IMPLEMENTÓ EL VALOR ‘PASSING LAST CHAR’ PARA SUBFILES DE


TRANSACCIONES
Esta funcionalidad ya existía para campos que no estaban en subfiles, y a paritr
de la versión 7.5 de GeneXus se implementó el valor “Passing last char” de la

357
preference User Interface\Key Configuration\Field Exit para subfiles de
Transacciones.

Esto indica que si se selecciona este valor, cuando se ejecute una Transacción
con subfile, al completarse la información de cada uno de los campos del subfile,
el cursor automáticamente pasará al siguiente campo (en versiones anteriores
este valor se correspondía con la preference Auto Skip de Visual Basic).

‘GENEXUS VISUAL BASIC RELOAD UTILITY’ EN PROYECTOS WEB


Es posible utilizar el utilitario ”GeneXus Visual Basic Reload Utility’” en
proyectos Visual Basic que contengan objetos Web (Web Panels, Transacciones
Web).
Por el momento, es posible utilizar este utilitario solamente en proyectos Web
generados en VB 6.0.

Por más información sobre este utilitario, consultar el documento en:


http://www.artech.com.uy/gxdlsp/pub/GeneXus/VB/Tips/Reload.htm

Nota:
Cuando se utiliza este utilitario en proyectos Web, al seleccionar la
opción Run/Start del menu de Visual Basic, luego de cargar los objetos que
fueron modificados, se muestra una pantalla como la siguiente:

La opción “Start Component” aparece seleccionada y su lado se muestra una


lista de todos los Objetos Web pertenecientes al proyecto. Se debe seleccionar
el Objeto Web principal y presionar el botón “OK” para ejecutar nuevamente la
aplicación.

358
PROPIEDAD ‘ENABLED’ EN RUNTIME PARA BOTONES EN OBJETOS WEB
Se pueden habilitar/deshabilitar botones en tiempo de ejecución en Web Objects
utilizando la propiedad Enabled.
Esta propiedad se puede modificar dentro de alguno de los eventos del Web
Object.

Observación: Si se configura la propiedad ‘Enabled=0’, en Netscape 6.0, se ve


como en Internet Explorer, es decir, deshabilitado. No ocurre lo mismo en
Netscape 4.7 y anteriores.

OPTIMIZACIÓN EN LA GENERACIÓN DE OBJETOS WEB


Se optimizó la generación de objetos Web (Web Panels y Transacciones Web).
Esto significa que se redujo significativamente el código de los objetos web
generados, con la consiguiente reduccción de tiempos de generación y tamaño
de los ejecutables.

Nuevas preferencias
‘FORCE GENERATION OF DEVELOPER MENU’
Esta preference se encuentra en la sección “General\VB Specific” y permite
indicar si se regenerarán el Developer Menu (MENU.VBP) y el objeto main que
incluye los Web Panels que se tienen en el modelo (GXWEBMN.VBP o como se
haya indicado en la preference “Main Web Project Name”), cada vez que se
genere cualquier objeto.

Los valores posibles de esta peference son:

No Es el comportamiento que se tenía en la versión 7.0,


esto es, no se regenerarán los proyectos mencionados
anteriormente cada vez que se invoque al generador.
Este es el valor por defecto.
Yes Indica que se regenerarán los proyectos MENU.VBP y
GXWEBMN.VBP (o el nombre que se haya indicado en
la preference ““Main Web Project Name”).

Esta preference permite, con el valor en Yes, regenerar los proyectos


mencionados, por si por alguna razón no se regeneraron y se desea que así se
haga. Se puede volver a poner en No después de una corrida y volverán a
generarse solo cuando se considere necesario.

Además algunas preferences se identifican como críticas, esto es que si se


cambia alguna de ellas se regeneran estos proyectos, independientemente del
valor de la preference.
Hay preferences críticas Interactivas, que fuerzan la regeneración del
MENU.VBP, hay preferences criticas de Web, que fuerzan al GXWEBMN.VBP y
hay preferences Generales que fuerzan ambos.

359
Las preferences criticas son:

Interactivas General\VB Specific\Default Edit Control


General\VB Specific\Grid Version
User Interface\Printing\Print Method
User Interface\Right Button\Calculator on numeric
fields
User Interface\Right Button\Calendar on date fields
User Interface\VFP/VB Specific\Generate MDI
Application
Web Web Information\Generate WebPanels as
WebClasses (en particular cuando esta en No no se
genera el GXWEBMN.VBP)
Web Information\Encrypt URL Parameters
Web Information\Encryption Key
Generales General\VB Specific\Visual Basic Version
General\VB Specific\Local Data Access
General\VB Specific\VB Project Settings\Compilation
Type
General\VB Specific\VB Project Settings\Optimization

‘PROCEDURE AND REPORT GENERATION’


Esta preference a nivel de modelo se encuentra en el grupo “General\VB
Specific”, indica si los reportes y procedimientos se generarán como módulos o
como classes de Visual Basic.

Los valores posibles son:

As Modules (.BAS) Indica que todos procedimientos y reportes se


generarán como hasta ahora, un módulo .bas
para cada uno. Este es el valor por defecto.
As Classes (.CLS) Indica que todos los procedimientos y reportes
del modelo se generarán como classes de Visual
Basic.

El valor “As Classes (.CLS)” tiene como ventaja que las variables usadas por los
procedimientos y reportes sólo se definen en el momento que se van a utilizar,
destruyéndose luego de la ejecución de los mismos.
En cambio si se generan como módulos (valor “As Modules (.BAS)” de la
preference), en el momento de ejecutar el proyecto se reserva memoria para
estas variables, y se mantiene ocupada hasta finalizada la ejecución de la
aplicación.
Al tenerla como .CLS pueden aparecer problemas de performance en el caso
que se tenga muchas variables en los procesos que se ejecutan dentro de un
loop.

Generacion de SSP con el Generador Visual Basic


Para obtener información sobre esta funcionalidad referirse al documento en:
http://www.artech.com.uy/gxdlsp/pub/GeneXus/DevEnv/Docum/ReleaseNotes/

360
7.0/SmartStaticPanels.htm

A diferencia de otros generadores, con Visual Basic no es posible ejecutar los


SSP desde la línea de comandos, solo pueden ser ejecutados al ser llamados por
otro objeto.
Los parámetros a configurar son:

Parámetro
SSP Directory genexus.staticweb.dir=<dir>
SSP Dynamic URL genexus.staticweb.dynurl=<url>
SSP Overwrite pages genexus.staticweb.overwrite=<”true”|”false”>
SSP Expand Links genexus.staticweb.links=<”true”|”false”>

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.


• Configurar la propiedad ‘Generate Web Panels as WebClasses = Yes’ en
el Web Panel ‘PruebaSSP’.
• Agregar en el Work Panel ‘Llamador’ un evento como el siguiente:

Event 'Llamada’
&aux = setenvproperty('genexus.staticweb.dir', 'd:\ssp')
&aux1 = setenvproperty('genexus.staticweb.dynurl', 'http://localhost/cgi-
bin/')
&aux2 = setenvproperty('genexus.staticweb.overwrite', false)
call(HPruebaSSP, ….)
EndEvent

Los parámetros adicionales que se configuraron fueron:

genexus.staticweb.dir para indicar donde quedarán las páginas HTML


(d:\ssp)
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/)

361
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’.

Integridad referencial en Visual Basic

Introducción
Se incorpora la posibilidad de declarar Integridad Referencial a nivel del DBMS
tanto en aplicaciones Cliente/Servidor como aplicaciones locales (Access).

Alcance
Lenguaje: Visual Basic
Interfaces: Web, Win

Descripción
Esta nueva propiedad, permite que al momento de crear la base de datos, se
registre en el DBMS (o Access) que se va a tener Integridad Referencial.
Por lo tanto, si por medio de procesos, o por el mismo DBMS (o Access) se
intenta violar la Integridad Referencial, se disparará un mensaje de error del
DBMS (o Access).

Para poder definir esta propiedad de la base de datos se debe configurar la


preference ‘Declare Referential Integrity’, en la sección ‘Creation/Reorganization
Information’ dentro de las ‘DBMS Options’ del modelo.
Los valores posibles son:

No No se genera Integridad Referencial en la base


de datos, es el valor por defecto
Yes Genera la Integridad Referencial
Remove Elimina la Integridad Referencial existente

En el caso en que la base de datos sea Access, se debe definir la preferencia,


‘Declare Local Referentia Integrity (Access)’ que se encuentra en la sección ‘VB
Specific’ de las preferencias del modelo.
Los valores posibles son:

No No se genera Integridad Referencial


Yes Se genera Integridad Referencial

362
Consideraciones Generales

• Estos valores son tomados en cuenta solo al momento de la Creación de la


base de datos.
• En el caso de querer eliminar la Integridad Referencial existente, se debe
utilizar el valor Remove y ejecutando una reorganización, luego se debe
cambiar este valor por No.
• En el caso de Access no existe el valor Remove, basta con poner la
preferencia en No y crear la base de datos para eliminar la Integridad.
• En caso de tener un modelo cliente-servidor con tablas locales, no se define
integridad cruzada, esto quiere decir que se permite realizar acciones sobre
una tabla local que viola la integridad de la tabla del servidor y viceversa.
• Si se está trabajando con la preferencia “Generate Null for Nullvalue” en NO
(el valor generado es el nulo de GeneXus, no el Nulo del DBMS) la regla
Allownulls sobre una clave foránea produce un error pues el valor nulo de
GeneXus viola la integridad referencial del DBMS, pues se va a buscar dicho
valor como clave en alguna tabla. En caso de tener la preferencia “Generate
Null for Nullvalue” en YES no se produce problemas.
• En el caso de estar en un modelo Cliente/Servidor, se puede utilizar la regla
Error_handler para manejar el error evitando la finalización del programa.
Si no se maneja el error el programa se cancelará al
violar la integridad Referencial.
• En los modelos local (los que utilizan base de datos Access), la regla
Error_handler() no está disponible.

Ejemplo
Supongamos tenemos una aplicación con las siguientes estructuras (Con
Integridad Referencial):

Tabla Categorías
CatId*
CatNom

Tabla Clientes
CliId*
CliNom
CliTel
CatId
CatNom

Consideremos ambas tablas con datos.


Además existe un proceso llamado Borrar, que elimina todos los registros de la
tabla Categorías:

For each
Defined by CatNom
Delete
Endfor

Este proceso intenta borrar registros de una tabla que están como clave foránea
en otra, por lo tanto se viola la integridad referencial.

363
Dependiendo del DBMS o si está en Access se presenta un error.
Por ejemplo en SQL Server se presenta el siguiente dialogo:

Esto produce que el programa se cancele.

En este caso se puede utilizar la regla Error_handler para manejar el error


evitando la finalización del programa.
Se debería hacer lo siguiente:

Definir una subrutina al procedimiento, que maneje el error:

Sub 'Manejo_Error'
if &gxDBErr= 547 //Codigo de error de SQL Server
msg('Este Procedimiento no se puede realizar porque viola la
integridad referencial.')
Rollback
endif
EndSub // 'Manejo_Error'

Además definir la regla:

Error_handler(‘Manejo_Error’)

Para conocer los códigos de error, consultar la documentación del DBMS que se
está utilizando.

Propiedad "Prompt for Confirmation"

Introducción
Esta propiedad de los reportes indica si se mostrará o no un diálogo para
confirmar si el reporte será ejecutado o no.
El diálogo que se muestra tiene el texto 'Is data ok ?', o su correspondiente en
cada idioma.

Alcance
Objetos: Reportes
Lenguajes: Visual Basic
Interface: Win

Descripción
Los valores posibles de esta propiedad son:

364
Yes Esto indica que se mostrará el diálogo de confirmación del
reporte
No No se mostrará el diálogo

Hasta la versión 7.0 de GeneXus el valor por defecto de la propiedad 'Prompt for
Confirmation' de reportes era Yes.
Esto es que por defecto se debería mostrar el diálogo.

En esta versión, se uniformizó el comportamiento de esta propiedad para todos


los generadores, cambiándose el valor por defecto a No.

365
Visual Fox Pro

Sección Específica Generador Visual FoxPro

Requerimientos
Las versiones de Visual FoxPro soportadas son:
• Visual FoxPro 6.0 SP5 o superior
• Visual Foxpro 7.0

Para obtener la última versión del generador Visual FoxPro para GeneXus 7.5,
siga este link: http://www.gxtechnical.com/cgi-
bin/HDCenter.exe?2,5,133,4:VFPCS:75:2

Compatibilidad
• IMPORTANTE

En la versión GeneXus 7.5 se realizaron varios cambios en las


preferencias del modelo y DBMS Options con respecto a la versión 7.0,
algunos de estos cambios son:

- Cambio de valores por defecto


- Nuevas preferencias
- Nuevos valores de preferencias
- Eliminación de preferencias

Cabe destacar que el cambio en los valores por defecto de las


preferencias provocarán un cambio en el comportamiento de las
aplicaciones que los utilizaran. Por este motivo se recomienda revisar
detenidamente la sección del generador XXX en el documento
“Administración de Propiedades” .

• El orden de despliegue de los controles de un form en ejecución se


realiza según el siguiente orden:

1) Rectángulos, controles bitmap, activex.


2) Atributos (incluye variables bitmap)
3) Literales

El resultado es que los controles del grupo 2, por ejemplo, se visualizan


encima de los del grupo 1.

El orden de despliegue dentro de cada grupo es según las coordenadas en


las que se encuentre el control en el form: de izquierda-derecha y de
arriba - abajo.

El movimiento de los controles en diseño (To back, To front) no es tomado


en cuenta en ejecución.

• Cualquier aplicación Cliente/Servidor sobre el DBMS DB2 Common


Servers que utilice acceso ODBC para acceder a la base de datos y

366
realice cualquier sentencia SELECT FOR UPDATE, da el siguiente error:
OdbcMessage:'[IBM][CLI Driver][DB2/NT] SQL0510N UPDATE or
DELETE is not allowed against the specified cursor.
SQLSTATE=42828

Para solucionarlo hay que apagar la opcion "Deferred Prepare" en las


preferencias del data source (botón "Advanced", Tab "Compatibility").

Restricción para modelos contra DBFs


No se soportan ‘nombres largos’ en Objetos, Tablas y Atributos. El máximo
soportado es 10 en cada uno; esto es así por una limitación en la plataforma
DBF (free tables). Este largo es configurable en las preferences del modelo de
diseño.

Nuevas Funcionalidades
Se han incluído las funcionalidades nuevas de GeneXus concernientes a la
interfase ‘Win’. Se destacan entre las mismas las tipos de datos de manejo de
XML, NSubfiles, tipos de datos de Office, tipos de datos de manejo de clientes
http,tipo de datos dbconnection, etc. Pero de todas las funcionalidades, la
mayor sin duda es la siguiente: Soporte de N DBMSes por modelo.

NUEVA DLL PARA APLICACIONES CLIENTE/SERVIDOR CON SOPORTE


NDBMOD (N-DBMSES POR MODELO)
A los efectos de unificar el código con los demás generadores, y soportar N
DBMSes por modelo a partir de esta versión se utiliza una nueva dll de
Cliente/Servidor (GXDATA70.DLL).

La generación de trace es diferente con esta nueva dll (consultar la sección


‘Configuración de trace (GeneXus DB Activity Trace)’).

367

You might also like