Genexus. Como usar los Tipos de Datos Estructurados en Genexus (STD)

Después de leer varios tutoriales y ayudas no ha terminado de quedarme muy claro que son, para qué y como se usan los SDT que son tipos de datos estructurados para guardar varios datos a la vez en una misma entidad, así es que aqui pongo mi explicación resumen de los SDT.

Los tipos de datos estructurados podemos usarlos para pasar valores complejos entre funciones o subrutinas, o entre distintos objetos usando una única referencia
, así de esta forma no tenemos que pasar muchos objetos a la vez. También son muy útiles cuando no sabemos la cantidad de objetos que va a devolver una función porque puede variar de una llamada a otra.

  • El tipo de dato estructurado más simple es cuando solo lo usamos para guardar un objeto, y no una colección de varios objetos, es decir, que se va a comportar como una variable escalar, no dinámica, se llama así porque usamos la propia definición del tipo estructurado para guardar información sin tener que reservar memoria previamente, ya que solo vamos a guardar un objeto y no una colección de objetos, para la colección de objetos sí que tenemos que reservar memoria previamente haciendo un new y luego veremos como se hace.
    Un ejemplo de este uso sería muy sencillo, solo definir el nuevo objeto STD creando el nuevo objeto, y después asignaríamos valores normalmente:
    &Customer.Id = &valorId
    &Customer.Name = &nombre
    &Customer.Address = &direccion

  • La otra forma de uso que podemos darle a un STD es para guardar colecciones de objetos, en este caso sí que tenemos que reservar memoria para cada nuevo objeto que queramos agregar a la colección, aqui seriá como un array dinámico, al cual asignamos objetos en tiempo de ejecución reservando memoria para ese objeto previamente, ya que de antemano no lo sabemos.
    Para indicarle a genexus que nuestro STD va a ser una colección al definir el STD en la pantalla donde creamos su estructura veremos una columna que se llama COLLECTION, ésta la ponemos a TRUE para el elemento raiz del STD, no hace falta ponerla a true para todos los elementos ya que poniendolo en el nombre del STD los elementos también serán de una colección.
    Así de esta forma hemos conseguido definir una colección de objetos y no de uno solo.
    Podemos poner el nombre del STD en singular como criterio de nomenclatura cuando sea un tipo de datos sencillo, escalar, para destacar que vamos a guardar un solo elemento, y podemos poner el nombre del STD en plurar cuando vayamos a crear el tipo de datos con collection a true para saber que ahi vamos a guardar una colección de objetos y no uno solo.
    Observar que al poner la columna Collection a True para el elemento raiz se nos crea un Item Name en esa misma columna con su nombre correspondiente que lo vamos a usar después para nombrar a cada item de la colección.
    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 memoria
    Endfor

    Aqui vemos como metemos en una STD de tipo colección los clientes de una transacción que cumplen unas condiciones establecidas en el where.
    Observar las dos últimas lineas donde se hace un add para agregar el objeto o item a la colección, y después se deja hecho un new para reservar espacio de memoria para el siguiente elemento, esto se hace siempre así y es lo único que puede liar un poco, y es así, porque para la primera vez no se pide espacio de memoria ya que lo tenemos inicialmente sin necesidad de pedirlo y si lo hacemos para los próximos items, por eso se hace el new al final después del add, que es lo que podía extrañarnos, aunque solo es cuestión de como se ha programado a genexus para que maneje los arrays dinámicos.

    Ahora voy a citar los métodos que tenemos para manejar colecciones:

    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 método para aplicar a variable de tipo colección. Agrega un ítem a una colección, en la posición relativa especificada.
    Sintaxis: &VbleDeTipoColeccion.Add(&VbleItem [, Position])
    Nota: Si se omite Position o se especifica 0, se agrega el Item al final de la colección. Position comienza en 1.
    Item
    Es un método para aplicar a variable de tipo colección.
    Sintaxis: &VbleDeTipoColeccion.Item(Position)
    Retorna una referencia al elemento que se encuentra en la colección en la posición relativa Position.
    En caso de especificar posición mayor a la última, el programa cancela.
    No es válido asignar un valor con esta propiedad, por lo tanto no es correcto el código
    &VbleDeTipoColeccion.item(&i) = Att. Para cambiar un valor se debe remover (método remove) y agregar (método add).

    Remove
    Es un método para aplicar a variable de tipo colección. Elimina el elemento que se encuentre en la colección en la posición relativa que se especifique, y corre un lugar todas las posiciones.
    Sintaxis: &VbleDeTipoColeccion.Remove(Position)
    Clear
    Es un método para aplicar a variable de tipo colección. Elimina todos los elementos de la colección.
    Sintaxis: &VbleDeTipoColeccion.Clear()
    Sort
    Es un método que permite ordenar los elementos de una colección.
    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 más de un campo, poniendo dentro de las comillas los nombres de los campos
    separados por coma.
    Count
    Es una propiedad de variable de tipo colección. Retorna la cantidad de elementos de la colección. Es read only.

    Comando para recorrer colecciones
    For &Var in &Array
    ...
    Endfor

    &Var: debe ser del tipo de datos de un ítem de la colección
    &Array: debe ser del tipo de datos que es colección
    La variable &Var va tomando los valores de cada posición de la lista
    Consideraciones:
    • No es posible obtener la posición del vector durante la recorrida, para esto es necesario definir un variable que actúe 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.

David.

Diseño web e-duca.eu.