You are on page 1of 20

TIPOS DE DATOS ESTRUCTURADOS

359

Tipos de datos estructurados


Introduccin
Los lenguajes de programacin manejan tipos de datos simples y tipos de datos complejos Los tipos de datos complejos se construyen sobre la base de los tipos de datos simples Los tipos de datos complejos conocidos como registros o tipos de datos estructurados, permiten representar conjuntos de datos que juntos realizan una definicin Ejemplo:
Type Customer = Record Id: Name: City: Numeric(4) Character(30) Character(20) CompanyAddress: Character(30) HomeAddress: Character(30) end; end; Luego se definen variables de este tipo, listas de elementos de este tipo, etc.

Country: Character(20) Address: Record

360

Tipos de datos estructurados


GeneXus
Cmo definir un tipo de datos estructurado? 1. Object / New Object 2. En el rbol del ambiente de desarrollo: Structured Data Types... y en la ventana de al lado: botn derecho Editor similar al de transacciones y ofrece las mismas teclas de funcin:

Generadores que soportan este tipo de definicin: JAVA, .NET, VB

El editor de tipos de datos estructurados es sumamente similar al editor de transacciones y ofrece las mismas teclas de acceso rpido. Para cada tem de un tipo de datos estructurado, se debe especificar: La propiedad Name, con el nombre que identifica al tem. La propiedad Data type, en la cual se debe seleccionar un tipo de dato simple, o un dominio, o un tipo de datos estructurado que ya se haya definido. La propiedad Collection, para indicar si el tem tiene o no mltiples instancias (en breve veremos ejemplos que permitirn comprender su uso en detalle). En particular los tems que definen un nuevo nivel, se anteceden con el cono , no se les habilita la propiedad Data Type y se produce la indentacin correspondiente para los tems correspondientes a dicho nivel. Una funcionalidad interesante a tener en cuenta, es que adems de definir tem a tem en un tipo de datos estructurado, tambin est la posibilidad de definir rpidamente en la estructura de un tipo de datos estructurado, la misma definicin de cierta transaccin. Para realizar esto, una vez creado un nuevo tipo de datos estructurado y al estar editando el mismo, se debe pulsar el botn derecho del mouse sobre su raz, y seleccionar la opcin Copy structure from :

361

Tipos de datos estructurados


Utilizacin
Se definen variables (en cualquier objeto GeneXus) cuyo tipo de datos = tipo de datos estructurado:

No es posible utilizar tipos de datos estructurados en la definicin de atributos

362

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 1
En un proc. se define una variable (&Customer) cuyo tipo de datos es del tipo de datos estructurado: Customer El proc. recibe por parmetro un cdigo de cliente, accede con comando For Each a los datos del cliente recibido y carga los datos del cliente en la variable &Customer: Rule: Parm(CustomerId); Source: For each &Customer.Id=CustomerId &Customer.Name=CustomerName &Customer.Country=CountryName &Customer.City=CityName &Customer.Address.CompanyAddress= &Customer.Address.HomeAddress= Endfor

Como se est cargando una variable escalar y no una lista o coleccin, no hay necesidad de solicitar espacio de memoria, ya que el espacio de memoria est creado para la variable como para ser utilizada una vez.

Dado que en este ejemplo se est cargando una variable escalar y no una lista o coleccin, no hay necesidad de solicitar espacio de memoria, ya que el espacio de memoria est creado para la variable como para ser utilizada una vez; as que simplemente se deben asignar los valores que corresponda a los tems de la variable. Para cargar una coleccin, en cambio, s habr que solicitar espacio de memoria para la variable para cada instancia a ser agregada en la lista; luego de solicitado el espacio de memoria, habr que asignar los valores que corresponda a los tems de la variable, y por ltimo agregarla a la lista o coleccin, como veremos.

363

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 2:
Partiendo del tipo de datos estructurado: Customer, utilizamos la opcin Object / Save Structured Data Type As para crear un nuevo tipo de datos estructurado de nombre: Customers Hacemos una modificacin al tipo de datos estructurado: Customers propiedad collection de la raz = True:

364

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 2:
Configurar la propiedad collection=True para un tem, define que se trata de una coleccin de esos tems y no de uno solo. Notar que al configurar la propiedad collection de un tem con valor True, automticamente se define un nombre por defecto para la propiedad Item name de ese tem:

Esto permite que podamos definir variables del tipo de datos estructurado Customers, y a su vez variables del tipo de datos Customers.CustomersItem

Por ejemplo, de haber configurado para el tem CompanyAddress la propiedad collection con valor True, habramos indicado que se trata de una coleccin o lista (de largo variable) de Addresses de empresa, y no de una sola. Anlogamente, dado que lo que hemos implementado es que el tem: Customers (es decir, la raz del tipo de datos estructurado) tenga valor True en la propiedad collection, lo que hemos definido es que se trata de una coleccin de Customers y no de un Customer solo. Es importante notar que al configurar la propiedad collection de un tem con valor True, automticamente se define para la propiedad Item name de ese tem un nombre por defecto (en este caso: CustomersItem). Esto permite que podamos definir variables del tipo de datos estructurado Customers, y a su vez variables del tipo de datos Customers.CustomersItem. Es sencillo de comprender que definir una variable del tipo Customers significar que estaremos definiendo una coleccin o lista de Customers, mientras que definir una variable del tipo Customers.CustomersItem, significar que estaremos definiendo un solo Customer (o un tem de la coleccin de Customers, que veremos enseguida cmo hacer para agregarlo a la coleccin).

365

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 2:
Implementamos proc. que carga una lista de clientes El proc. recibe por parmetro un rango de cdigos de clientes, con comando For Each accedemos a los clientes que se encuentren en dicho rango, y los vamos agregando a la coleccin. Rule: Parm(&CustomerIdStart, &CustomerIdEnd); Se definen 2 variables: &Customers (Data Type: Customers) &CustomersItem (Data Type: Customers.CustomersItem) Source:

366

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 2:
Source: For each where CustomerId>=&CustomerIdStart and CustomerId<=&CustomerIdEnd &CustomersItem.Id=CustomerId &CustomersItem.Name=CustomerName &CustomersItem.Country=CountryName &CustomersItem.City=CityName &CustomersItem.Address.CompanyAddress= &CustomersItem.Address.HomeAddress= &Customers.add(&CustomersItem) /*se agrega el tem a la lista*/ &CustomersItem = new Customers.CustomersItem() /*se solicita nuevo Endfor

espacio de memoria para prximo tem*/

Como ya hemos mencionado, para una variable hay creado espacio de memoria como para ser utilizada una vez. Si se necesita crear otra instancia para la variable, habr que solicitar espacio de memoria para la misma, para lo cual contamos con el operador new.

367

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 2:
Qu pasara si no solicitamos nuevo espacio de memoria en cada iteracin del for each? ... es decir, si omitimos el new en el cdigo anterior ...

En cada iteracin estaramos sobreescribiendo el mismo espacio de memoria... y agregando a la lista siempre punteros al mismo espacio de memoria.

368

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 2:
Sin embargo lo que necesitamos implementar se esquematiza de la siguiente forma:

Por lo tanto, es necesario ir solicitando un nuevo espacio de memoria para cada referencia a ser agregada en la lista

369

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 3:
Hacemos lo mismo que en el ejemplo #2 (proc. que carga una coleccin de clientes), mostrando otra solucin En este caso: utilizamos la definicin del tipo de datos estructurado: Customer y definimos otro tipo de datos estructurado: CustomerList

Se definen 2 variables

&CustomerList (Data Type: CustomerList) &Customer (Data Type: CustomerList. CustomerListItem)

370

Tipos de datos estructurados


Ejemplos de utilizacin
Ejemplo # 3:
Source: For each where CustomerId>=&CustomerIdStart and CustomerId<=&CustomerIdEnd &Customer.OneCustomer.Id=CustomerId &Customer.OneCustomer.Name=CustomerName &Customer.OneCustomer.Country=CountryName &Customer.OneCustomer.City=CityName &Customer.OneCustomer.Address.CompanyAddress= &Customer.OneCustomer.Address.HomeAddress= &CustomerList.add(&Customer) //se agrega el tem a la lista &Customer = new CustomerList. CustomerListItem() /* se solicita nuevo
espacio de memoria

Endfor

para prximo tem */

En este caso la variable &customersitem es del tipo de datos ListaCustomers.ListaCustomersItem, el cual contiene un nico tem que es: OneCustomer; y dado que el tem OneCustomer es del tipo de datos Customer, este contiene los tems Id, Name, Country, City, etc. De modo que si bien el ejemplo #3 implementa exactamente lo mismo que el ejemplo #2, como en este ltimo hemos optado por otra alternativa de definicin de tipos de datos estructurados, la sintaxis en este caso queda un poquito ms extensa.

371

Tipos de datos estructurados


Operadores, mtodos y propiedades

New Es un operador que retorna una nueva instancia inicializada, o sea una nueva referencia o puntero al tipo de datos que se especifica. Sintaxis: &VbleDeTipoDeDatosEstructurado = new TipoDeDatosEstructurado()

Add Es un mtodo para aplicar a variable de tipo coleccin. Agrega un tem a una coleccin, en la posicin relativa especificada. Sintaxis: &VbleDeTipoColeccion.Add(&VbleItem [, Position])

Nota: Si se omite Position o se especifica 0, se agrega el Item al final de la coleccin. Position comienza en 1.

Item Es un mtodo para aplicar a variable de tipo coleccin. Sintaxis: &VbleDeTipoColeccion.Item(Position) Retorna una referencia al elemento que se encuentra en la coleccin en la posicin relativa Position. En caso de especificar posicin mayor a la ltima, el programa cancela. No es vlido asignar un valor con esta propiedad, por lo tanto no es correcto el cdigo &VbleDeTipoColeccion.item(&i) = Att. Para cambiar un valor se debe remover (mtodo remove) y agregar (mtodo add).

372

Remove Es un mtodo para aplicar a variable de tipo coleccin. Elimina el elemento que se encuentre en la coleccin en la posicin relativa que se especifique, y corre un lugar todas las posiciones. Sintaxis: &VbleDeTipoColeccion.Remove(Position)

Clear Es un mtodo para aplicar a variable de tipo coleccin. Elimina todos los elementos de la coleccin. Sintaxis: &VbleDeTipoColeccion.Clear()

Sort Es un mtodo que permite ordenar los elementos de una coleccin. El campo por el cual se quiere ordenar debe ir entre comillas. Sintaxis: &VbleDeTipoColeccion.Sort(NombreCampoPorElCualOrdenar") Es posible ordenar en forma descendente, poniendo dentro de las comillas al nombre del campo entre corchetes rectos. Es posible ordenar por ms de un campo, poniendo dentro de las comillas los nombres de los campos separados por coma.

Count Es una propiedad de variable de tipo coleccin. Retorna la cantidad de elementos de la coleccin. Es read only.

373

Tipos de datos estructurados


Comando para recorrer colecciones
For &Var in &Array ... Endfor
&Var: debe ser del tipo de datos de un tem de la coleccin &Array: debe ser del tipo de datos que es coleccin La variable &Var va tomando los valores de cada posicin de la lista Consideraciones: No es posible obtener la posicin del vector durante la recorrida, para esto es necesario definir un variable que acte como contador. No es posible modificar los tems de la lista en la recorrida. Esto significa que cambios en el valor de &Var, en el alcance de la estructura, no afectan al correspondiente valor del &Array(X) o viceversa. Es posible incluir comandos de corte de la recorrida, al igual que en for each o do while, como exit o return.

374

Tipos de datos estructurados


Cmo mostrarlos en form
Ejemplo: Insercin de variable &Invoice de tipo de datos estructurado Invoice:

en form de Transaccin, Work panel o Web panel

Es posible insertar en el form de Transacciones, Web y Work Panels variables de tipo de datos estructurados. Tambin es posible hacerlo en print blocks de reportes, siempre y cuando no sean collection. Desplegar una collection en un form se puede hacer de forma muy sencilla: solamente es necesario insertar la variable en el form, y quedar asociada a un grid que ser cargado automticamente, sin necesidad de cdigo alguno.

375

Tipos de datos estructurados


Cmo mostrarlos en form
2 posibilidades:
1) Pallete Toolbar shortcut 2) Insert/Variable permite seleccin mltiple

Hay que repetir este paso para c/atributo del 1er nivel que se desee mostrar en el form Notar que es una sola variable definida (NO una variable por c/atributo)

376

Tipos de datos estructurados


Cmo mostrarlos en form
En cuanto al grid:

Carga automtica: No se requiere cdigo!

Como hemos visto, hay 2 posibilidades para insertar una variable de tipo SDT con sus respectivos atributos en un form / layout: mediante el shortcut : cada &variable.atributo uno a uno

mediante insert/variable: mltiple seleccin de atributos de variable de tipo SDT Si utilizando la opcin insert/variable se selecciona algn (o algunos) atributo(s) correspondientes a una collection, dicho(s) atributo(s) se agregarn automticamente en un grid (y en las Grid Properties del grid, se podr observar que automticamente se habr asignado en el combo Collection, el nombre del nivel al cual pertenecen los atributos). Si en cambio se utiliza el shortcut para ir agregando atributos del primer nivel del SDT en el form, y se utiliza el shortcut para agregar un grid en el form con el fin de mostrar una collection, el analista tendr que seleccionar explcitamente en el combo Collection de las Grid Properties, el nivel del SDT, para luego poder seleccionar cules atributos de dicho nivel desea incluir en el grid. En tiempo de ejecucin, la carga del grid se realizar en forma completamente automtica, con el contenido de la collection. Esto podr verse en el listado de navegacin:

Nota: Un detalle a tener en cuenta es que independientemente de la forma en que se seleccionen los atributos de una collection para ser mostrados en un grid, los mismos estarn en columnas visibles del grid, y los restantes atributos del nivel (los no seleccionados) se agregarn hidden.

377

Tipos de datos estructurados


Cmo mostrarlos en form
Propiedad CurrentItem: Para collections Permite desplegar informacin de los atributos del tem actual en el grid Ejemplo: Event DisplayProductDescription'
msg(&invoice.line.CurrentItem.ProductDescription)

EndEvent

Si por ejemplo en el work panel visto (Invoice) deseamos agregar un botn con un evento asociado y mostrar un mensaje para la lnea del grid seleccionada, con informacin de ese tem de la coleccin, contamos a partir de la versin 9.0 con la propiedad CurrentItem.

378

You might also like