Noticias

Primer capítulo: Structured Data Types

Este es el primer artículo de una serie que describe diferentes funcionalidades de GeneXus, en especial de la versión 9.0, y diversos temas como la configuración e implementación en diferentes ambientes de producción. Por GxOpen Task Force(*)

La filosofía de estos artículos es ayudar a los que recién comienzan con la herramienta como a los que la usan hace bastante tiempo pero no pueden dedicarle tiempo a probar las nuevas funcionalidades a la vez de eliminar los obstáculos que se nos presentan en diferentes ocasiones ya sea utilizando la herramienta ó llevando a diferentes ambientes de producción nuestros proyectos.

Con este esfuerzo, esperamos recibir comentarios y sugerencias de temas que le interesan a la comunidad para lograr entender está potente herramienta que es GeneXus.

El artículo de hoy explica de una forma clara, concisa y simple, de que se tratan los tan mencionados Structured Data Types (SDT). En la primer parte, se muestra el funcionamiento básico de los SDT y en la segunda parte, se detalla el trabajo con colecciones de SDT.

¿Qué es un SDT?
Un SDT es la definición de una estructura personalizada. Cuando necesitamos usar esta estructura en algún objeto GeneXus, definiremos una variable con el tipo del SDT que necesitemos. Esto significa que el SDT reside en memoria.

Los SDT tienen un funcionamiento muy parecido a los objetos en otros lenguajes.

Si estuviéramos por ejemplo en C#, la definición del SDT, sería la "Clase" mientras que al utilizarlo estaríamos trabajando con la instancia de la clase.

Cabe destacar que la diferencia más significativa de los SDT con los objetos radica en que los SDT no tienen funcionalidad propia, no se pueden definir métodos entre otras diferencias más sutiles.

Supongamos que tenemos el proceso "PCliAdd" el cual tiene el siguiente código:

Reglas:
parm( in:CliNom, in:CliApe, in:CliDir, in:CliTel, in:CliCiu, in:CliPais, in:CliCP);

Source:

new

CliId = PGetNumber.Udp("CLI")

endnew

Desde algún proceso de altas de clientes se llamaría a proceso anterior de la siguiente manera:

PCliAdd.Call( "Aldo", "Rmido", "18 de Julio 1830", "4136260", "Montevideo", "Uruguay", 11200)

Con un SDT se podría resolver de esta otra manera:

&Cliente.CliNom = "Aldo"
&Cliente.CliApe = "Rmido"
&Cliente.CliDir = "18 de Julio 1830"
&Cliente.CliTel = "4136260"
&Cliente.CliCiu = "Montevideo"
&Cliente.CliPais = "Uruguay"
&Cliente.CliCP = 11200
PCliAdd.Call(sdtCliente)

Por supuesto que el procedimiento "PCliAdd" cambiaría de la siguiente manera:

Reglas:
parm( in:&Cliente);

Source:

new
CliId = PGetNumber.Udp("CLI")
CliNom = &Cliente.CliNom
CliApe = &Cliente.CliApe
Elidir = &Cliente.CliDir
CliTel = &Cliente.CliTel
CliCiu = &Cliente.CliCiu
CliPais = &Cliente.CliPais
CliCP = &Cliente.CliCP
endnew

Como vemos con los SDT la llamada al procedimiento "PCliAdd" queda mucho más simple y podemos tener a la vista la información de los parámetros que estamos cargando, así la llamada no queda tan confusa como la anterior.

A la vez, cuando tenemos la necesidad de nuevos parámetros en nuestro proceso, no es necesario modificar la regla "parm", sino que modificamos el SDT. Esto nos da un valor agregado por la posibilidad de manejar "parámetros opcionales".

Con este ejemplo queremos demostrar su utilidad en procesos con una gran cantidad de parámetros, los cuales a veces confunden el código.

Creando nuestro primer SDT
Crear un SDT es muy sencillo, y para seguir con los ejemplos anteriores, daremos el ejemplo del "sdtCliente".

1) Ir a la opción de menú "Object/New Object".

2) Seleccionar "Structured Data Type" y en el nombre escribir "sdtCliente". También si se desea se puede escribir una descripción.

3) En este punto, se crean los atributos como si estuviéramos en una transacción. Presionando enter podremos agregar un nuevo campo e indicar su tipo de datos.

Por supuesto que también podemos basar estos atributos en dominios definidos en nuestra KB.

Ej. CliNom - Character(32).

Para agilizar la inserción de atributos en el SDT, en el "menú contextual" del SDT (botón derecho) tendremos la opción de seleccionar directamente los atributos ("Insert Atributes...") ó copiar directamente la estructura desde una transacción ("Copy structure from...").

Implementando nuestro SDT
Para poder usar el SDT creado anteriormente, en un objeto funcional de GeneXus (Transacción, Procedimiento, Reporte, etc.) debemos crear una variable del tipo "sdtCliente".

Para acceder a los atributos del SDT se utiliza el ".". Un ejemplo muy claro de esto, lo presentamos en la primer parte de nuestro artículo.

Por ejemplo, si definimos la variable "&Cliente" del tipo "sdtCliente" y deseamos acceder al atributo nombre lo haremos de la siguiente forma:

&Cliente.CliNom = "Jose"

msg(&Cliente.CliNom)

Importar y Exportar a XML
Una funcionalidad muy interesante sobre los SDT, es la posibilidad de exportarlo e importarlo a formato XML.

Un ejemplo del uso, puede verse en el ambiente web. Imaginemos que tenemos un SDT de seguridad con la siguiente estructura:

sdtSession

+UsrLogin - Character(20)

+UsrHorIni - DateTime

Con la función toXML del SDT podremos grabar el resultado en una cookie y cuando necesitemos realizar chequeos de seguridad, podremos obtener nuevamente el SDT desde la cookie con la función fromXML.

Ejemplo:

Procedimiento de Login

Variables:
&Session del tipo "sdtSession".
&Error del tipo "Numeric(5)".

Reglas:
parm( in:&UsrLogin, in:&UsrPass);

Source
& // chequeos varios de seguridad
// Se guarda el XML del SDT en la cookie "SESSION"
&Error = SetCookie(SESSION, &Session.ToXml())

Procedimiento para obtener el SDT del usuario web

Variables:
&Session del tipo "sdtSession".
&Error del tipo "Numeric(5)".

Reglas:
parm( out:&UsrLogin);

Source
// Se guarda el XML del SDT en la cookie "SESSION"
&Session.FromXml(getCookie("SESSION))

Aquí mostramos un uso muy simple de las funciones para el manejo de XML con SDT pero existen diversos usos para estas, ya sea para importar/exportar datos de nuestros sistemas como para trabajar con pequeñas bases de datos auxiliares en este formato.

Links Interesantes
SDTonForm - http://wiki.gxtechnical.com/wiki/tiki-index.php?page=SDTonForm  

GxOpen Task Force (*)
Para los que no nos conocen, la GxOpen Task Force somos un grupo de personas dedicadas a la comunidad de GeneXus. Mantenemos el sitio www.gxopen.com, entre otras actividades, y estamos realizando algunos proyectos de código abierto para ejemplificar al máximo el uso de la herramienta.
e-mail: info@gxopen.com

GxOpen TaskForce

We believe in GeneXus