Sei sulla pagina 1di 16

Tipos de datos estructurados

SDT

226

SDT: Introduccin
Lenguajesdeprogramacinmanejan:
Tiposdedatossimples (Numeric,Character,etc.) Tiposdedatoscompuestos.

EjemplodeTiposdedatoscompuestos(registrosotiposde datosestructurados)
Type Client = Record Name: Character(30) Character(20) Record Home: end; end; Character(15) CellPhone: Character(15) Country: Character(20)

Luego se definen variables con este tipo de datos y se trabaja con ellas...

City: Phones:

227

SDT en GeneXus
SecreancomocualquierotroobjetoGeneXus. Editorsimilaraldeestructurasdetransacciones. SDTsecomponede:miembros,subestructurasycolecciones:
botn derecho

El editor de tipos de datos estructurados es similar al editor de transacciones. Contiene: Propiedad Name, con el nombre que identifica al miembro, subestructura o coleccin. Propiedad Type, en la cual se debe seleccionar un tipo de dato simple, un dominio, o un tipo de datos estructurado que ya se haya definido en la KB (propiedad Type solo adquiere valor si se est definiendo un miembro y no una subestructura o coleccin). Propiedad Is Collection, para indicar si el miembro representa una lista (en seguida veremos un ejemplo). Obsrvese que una subestructura es un miembro compuesto, en lugar de ser uno simple. Es decir, es, en particular, tambin l, un tipo de datos estructurado. Haciendo botn derecho sobre un miembro de la estructura, se despliega la ventana que se ve a la izquierda, donde se puede insertar otro miembro, o una subestructura. Tip: Si se desea crear un SDT con exactamente la misma estructura que la de una transaccin, entonces en lugar de definir uno a uno todos los miembros, subestructuras y colecciones, alcanza con arrastrar (hacer Drag & Drop) el nombre de la transaccin desde el Folder View hacia la estructura en edicin del SDT. De la misma forma, si se desea que un miembro de la estructura corresponda a un atributo, puede seleccionarse y arrastrarse el atributo desde el Work With Attributes (ventana editable desde opcin View del men de GeneXus) o insertarse con el dilogo Insert/Attribute del men de GeneXus.

228

SDT en GeneXus
Ejemploconteniendocoleccin:

Un country tiene muchas ciudades...

Marcando el check box Is Collection se abrir una rama de la estructura como puede verse, donde se le pedirn dos nombres: el de la coleccin en s, y el de cada tem de la misma. Como se ver a continuacin, cuando se define una coleccin, junto con el SDT se estar creando implcitamente otro, que corresponder a los items de la coleccin. Esto se debe a que de esta forma se podr luego definir una variable del tipo de datos del tem, para luego agregarla a la coleccin.

229

SDT: Utilizacin
Seutilizanatravsdevariables. Losatributosno puedenserSDT.
&country
Id Name Cities
1 Uruguay

CityName CityName CityName Montevideo Colonia Paysand

A la derecha puede verse el dilogo de propiedades de una variable &country que se est definiendo dentro de algn objeto. El SDT Country definido en la KB tal como se aprecia en la pgina anterior, da lugar a la creacin de dos tipos de datos estructurados: uno correspondiente al propio tipo de datos country y otro correspondiente a los tems de la coleccin country.City. El por qu de este ltimo caso se debe a que uno podra querer definir una variable solo de ese tipo de datos, para luego agregarla con el mtodo Add que ya mencionaremos, a la coleccin. Obsrvese que la variable &country se ha definido del tipo de datos country que aparece en la lista obtenida al hacer clic en el combo box de la propiedad Data Type del dilogo de definicin de propiedades de la variable.

230

SDT: Utilizacin
Paradatosnorepetitivos,seaccedeacadamiembromediante elnombre,comopropiedaddelavariable.
Name Country City Phones
JuliaJames Uruguay Montevideo
Home CellPhone 555155.55.44 092155.12.33

&client.Name = Julia James &client.Country = Uruguay &client.City = Montevideo &client.Phones.Home = ... &client.Phones.CellPhone = ...

231

SDT: Utilizacin
Ejemplo:Transaccinqueregistralosrecibosefectuadosalosclientesy
SDTbasadoenlatransaccin:

drag & drop

For each where BillId = 7 ...de tabla BILL &bill.BillDate= BillDate &bill.CustomerId = CustomerId &bill.CustomerName = CustomerName &bill.BillInvoicePeriodStartDate = BillInvoicePeriodStartDate ...podra devolverse: &bill.BillInvoicePeriodEndDate = BillInvoicePeriodEndDate parm(..., out: &bill) &bill.BillAmount = BillAmount endfor En un proc. se carga &bill con datos del recibo 7 de la BD...

Aqu se presenta un ejemplo con el que continuaremos trabajando en lo que sigue. Agregamos a nuestra realidad una transaccin de recibos. Supongamos que una vez al mes, se lanza un proceso de generacin de recibos, en el que, tras elegir un perodo de facturacin (usualmente todo el mes anterior) para cada cliente se sumarizan todos los montos de las facturas que se le efectuaron en dicho perodo, y se le genera un recibo (autonumber). La generacin del recibo ser automtica (la realizar nuestro sistema); ese es un tema que veremos en breve. Por ahora, supongamos que necesitamos un procedimiento que devuelva los datos de un recibo determinado de los generados automticamente como explicamos recientemente (por ejemplo, el de id. 7). Una opcin es acceder mediante un for each a la tabla BILL creada a partir de la transaccin de igual nombre, y junto con la regla parm: parm( out: BillDate, out: CustomerId, out: CustomerName, out: BillInvoicePeriodStartDate, out: BillInvoicePeriodEndDate, out: BillAmount); implementar lo pedido. La otra opcin, es devolver toda esa informacin en una sola variable estructurada! parm( out: &bill); cargada como se muestra arriba. Para ello se define un SDT basado en la transaccin Bill (los SDTs no pueden tener el mismo nombre que una transaccin, razn por la cul le llamamos BILL_SDT). Para no tener que ingresar uno a uno los miembros del SDT de igual nombre que los atributos de la transaccin, alcanza con arrastrar la transaccin Bill desde el Folder View, dentro de la estructura del SDT y automticamente se inicializar como se muestra arriba.

232

SDT: Utilizacin
Ysiqueremosdevolverunalistaderecibos?
Opcin1:nomodificarelSDTyagregarvariable&bills coleccin:

For each where... &bill.BillDate= BillDate &bill.CustomerId = CustomerId &bill.CustomerName = CustomerName &bill.BillInvoicePeriodStartDate = BillInvoicePeriodStartDate &bill.BillInvoicePeriodEndDate = BillInvoicePeriodEndDate &bill.BillAmount = BillAmount
&bills.Add( &bill ) &bill = new Bill_SDT()

endfor

Supongamos que queremos devolver una lista de recibos (por ejemplo, los que se hayan efectuado en un rango de fechas dado).

233

SDT: Utilizacin
&bills
add

&bill.BillDate= BillDate &bill.CustomerId = ... &bill.CustomerName = ... &bill.BillInvoicePeriodStartDate = ... &bill.BillInvoicePeriodEndDate = ... &bill.BillAmount = ...

&bill

new

&bills.Add( &bill ) &bill = new Bill_SDT()

Bajo nivel! No existir otra forma de ms alto nivel?

Hay que pedir nuevo espacio de memoria para la variable &bill, para la siguiente iteracin. Como veremos en breve, existe un modo mucho ms sencillo, de ms alto nivel, DECLARATIVO, de obtener la coleccin de SDTs cargada, sin tener que preocuparnos de realizar operaciones de bajo nivel, como agregar una variable a la coleccin y pedir memoria...

234

SDT: Utilizacin en Data Provider

Bills { Bill where ... { BillDate= BillDate CustomerId = CustomerId CustomerName = CustomerName BillInvoicePeriodStartDate = BillInvoicePeriodStartDate BillInvoicePeriodEndDate = BillInvoicePeriodEndDate BillAmount = BillAmount
} }

Data Provider: procedimiento especializado, devuelve info estructurada

...este modo declarativo, por tanto de alto nivel, de cargar una coleccin de SDTs se conoce con el nombre de Data Provider. Podemos pensarlo como un procedimiento especializado, que devolver siempre informacin estructurada (ya sea simple como coleccin). Aqu presentamos el ejemplo, que luego ampliaremos cuando entremos de lleno en este tema.

235

SDT: Utilizacin
Opcin2:modificarelSDTparaqueseacoleccinyluego trabajardelamismaforma,definiendolasvariables:

&bills &bill

236

SDT: Utilizacin
Paradatosrepetitivos,seaccedeacadaitemmediantecomando: For &var in expression code endfor
&var: variable de tipo de datos A expression: expresin cuyo tipo de datos es coleccin de A, o array de A

Es posible incluir comandos de corte de la recorrida, al igual que en for each o do while, como exit o return.

Ejemplo: A = SDT

For &bill in &bills msg( &bill.Id.ToString() ) msg( Name: + &bill.CustomerName ) ... endfor

La variable &var va tomando los valores de cada posicin de la lista. No es posible obtener la posicin del tem durante la recorrida, para esto es necesario definir un variable que acte como contador. Como puede fcilmente inferirse, este comando es vlido para colecciones de cualquier tipo de datos, no solo SDTs.

237

SDT: propiedades
Los nombres de los miembros de una variable SDT se muestran como propiedades: Adems, para variables collection:

&cVar.Count &cVar.CurrentItem

Retornalacantidaddeitemsdelacoleccin. CuandounavariableSDTcollectionsedespliegaenunform (comogrid)permiteseleccionareltemquesehaseleccionado conelmousecomolneadelgrid.

Las propiedades Count y CurrentItem solo estn disponibles para variables SDT Collection.

238

SDT: operadores y mtodos


&var =new SDT() &cVar.Add(&item [, Position]) &cVar.Clear() &var.Clone() &var.FromXML( &xml ) &cVar.Item( Position ) &cVar.Remove( Position) &cVar.Sort( memberName) &var.ToXml() RetornaunanuevareferenciaopunteroalSDTespecificado Agregatemacoleccinenlaposicinrelativaespecificada.Si seomiteseagregaalfinal.Positioncomienzaen1. Eliminatodoslostemsdelacoleccin Creaunanuevareadememoriaycopialosdatosdela variableenesta: &var1 = &var2.Clone() CargavariableSDTapartirdestringconteniendouna estructuraxml. RetornareferenciaalelementoconposicinrelativaPosition enlacollection. Eliminatemqueseencuentreenlaposicinespecificaday correunlugartodaslasposiciones. Ordenaloselementosdelacoleccindeacuerdoamiembro. RetornaunstringconelformatoXMLdelosdatosdela variableSDT(quepuedesercollection):ml = &var.ToXml()

Aqu se presentan la mayora de los mtodos con los que cuentan los tipos de datos estructurados. Algunos aplican a variables SDT no coleccin, se representan con &var, otros a colecciones, se representan con &cVar. Para la lista completa, as como ejemplos, acceder al wiki o al help de la versin.

239

SDT: Ejemplo
MtodoToXml:
Name Country City Phones
JuliaJames Uruguay Montevideo
Home CellPhone 555155.55.44 092155.12.33

&xml = &client.ToXml()

<Client> <Name> Julia James </Name> <Country> Uruguay </Country> <City> Montevideo </City> <Phones> <Home> 555-155.55.44 </Home> <CellPhone> 092-155.12.33 </Home> </Phones> </Client>

240

SDT collection en FORM


SiseinsertaenunformunavariableSDTcollection:

aparece ventana para seleccionar los miembros a insertar que se presentarn como grid que ser cargado automticamente :

Puede seleccionarse del SDT los miembros que quieren cargarse como columnas del grid. Obsrvese que en nuestro caso hemos omitido los miembros CustomerId, BillInvoicePeriodStartDate y BillInvoicePeriodEndDate.

241

Potrebbero piacerti anche