Notícias

Primeiro capítulo: Structured Data Types

Este é o primeiro artigo de uma série que descreve diferentes funcionalidades de GeneXus, em especial da versão 9.0 e diversos temas como a configuração e implementação em diferentes ambientes de produção. Por GxOpen Task Force(*)

A filosofia destes artigos é a de ajudar aqueles que acabam de começar com a ferramenta, como aos que a usam há bastante tempo, mas não podem dedicar tempo em provar as novas funcionalidades ao mesmo tempo de eliminar os obstáculos que se apresentam em diferentes ocasiões, já seja utilizando a ferramenta ou levando a diferentes ambientes de produção nossos projetos.

Com este esforço esperamos receber comentários e sugestões de temas que interessam -> comunidade para conseguir entender esta potente ferramenta que é GeneXus.

O artigo de hoje explica de uma forma clara, concisa e simples, de que se tratam os tão mencionados Structured Data Types (SDT). Na primeira parte, é mostrado o funcionamento básico dos SDT e na segunda parte detalha-se o trabalho com coleções de SDT.


O que é um SDT?
Um SDT é a definição de uma estrutura personalizada. Quando necessitamos usar esta estrutura em algum objeto GeneXus, definiremos uma variedade com o tipo do SDT que necessitemos. Isto significa que o SDT reside na memória.

Os SDT têm um funcionamento muito parecido aos objetos em outras linguagens. Se estivéssemos, por exemplo, em C#, a definição do SDT seria a "Aula" enquanto que ao utilizá-lo estaríamos trabalhando com a instância da aula.

Cabe destacar que a diferença mais significativa dos SDT com os objetos radica em que os SDT não têm funcionalidade própria, não se pode definir métodos entre outras diferenças mais sutis.

Suponhamos que temos o processos "PCliAdd", o qual tem o seguinte código:

Regras:
parm( in:CliNom, in:CliSob, in:CliEnd, in:CliTel, in:CliCid, in:CliPaís, in:CliCP);

Source:
new
CliId = PGetNumber.Udp("CLI")
endnew

Desde algum processo de entradas de clientes se chamaria o processo anterior da seguinte maneira:

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

Com um SDT se poderia resolver desta outra maneira:

&Cliente.CliNom = "Aldo"
&Cliente.CliApe = "Rmido"
&Cliente.CliEnd = "18 de Julio 1830"
&Cliente.CliTel = "4136260"
&Cliente.CliCid = "Montevideo"
&Cliente.CliPaís = "Uruguay"
&Cliente.CliCP = 11200
PCliAdd.Call(sdtCliente)

Claro que o procedimento "PCliAdd" mudaria da seguinte maneira:

Regras:
parm( in:&Cliente);

Source:
new
CliId = PGetNumber.Udp("CLI")
CliNom = &Cliente.CliNom
CliSob = &Cliente.CliSob
Cliend = &Cliente.CliEnd
CliTel = &Cliente.CliTel
CliCid = &Cliente.CliCid
CliPaís = &Cliente.CliPaís
CliCP = &Cliente.CliCP
endnew

Como vemos com os SDT a chamada ao procedimento "PCliAdd" fica muito mais simples e podemos ter a vista a informação dos parâmetros que estamos carregando, assim a chamada não fica tão confusa como a anterior.

Por sua vez, quando temos a necessidade de novos parâmetros no nosso processo, não é necessário modificar a regra "parm", senão modificar o SDT. Isto nos dá um valor agregado pela possibilidade de manejar "parâmetros opcionais".

Com este exemplo queremos demonstrar sua utilidade em processos com uma grande quantidade de parâmetros, os quais ->s vezes confundem o código.

Criando o nosso primeiro SDT

Criar um SDT é muito simples e para seguir com os exemplos anteriores, daremos o exemplo do "sdtCliente".

1) Ir -> opção de menu "Object/New Object".

2) Selecionar "Structured Data Type" e no nome escrever "sdtCliente". Também se desejar pode escrever uma descrição.





3) Neste ponto são criados os atributos como se estivéssemos em uma transação. Pressionando enter poderemos acrescentar um novo campo e indicar seu tipo de dados.


Claro que também podemos embasar estes atributos em domínios definidos na nossa KB.

Ex.: CliNom - Character(32).



Para agilizar a inserção de atributos no SDT, no "menu contextual " do SDT (botão direito) teremos a opção de selecionar diretamente os atributos ("Insert Atributes...") ou copiar diretamente a estrutura desde uma transação (Copy structure from...").

Implementando nosso SDT
Para poder usar o SDT criado anteriormente, em um objeto funcional de GeneXus (Transação, Procedimento, Relatório, etc.) devemos criar uma variável do tipo "sdtCliente".

Para acessar os atributos do SDT se utiliza o ".". Um exemplo muito claro disto, foi apresentado na primeira parte do nosso artigo.

Por exemplo, se definimos a variável "&Cliente" do tipo "sdtCliente" e desejamos acessar o atributo nome, faremos da seguinte maneira:

&Cliente.CliNom = "Jose"

msg(&Cliente.CliNom)

Importar e Exportar para XML
Uma funcionalidade muito interessante sobre os SDT, é a possibilidade de exportá-lo e importá-lo para um formato XML.

Um exemplo do uso, pode ser visto no ambiente web. Imaginemos que temos um SDT de segurança com a seguinte estrutura:

sdtSession
+UsrLogin - Character(20)
+UsrHorIni - DateTime

Com a função toXML do SDT poderemos gravar o resultado em uma cookie e quando necessitemos realizar verificações de segurança, poderemos obter novamente o SDT da cookie com a função fromXML.

Exemplo:

Procedimiento de Login

Variáveis:
&Session del tipo "sdtSession".
&Error del tipo "Numeric(5)".

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


Source
 Error = SetCookie(SESSION, &Session.ToXml())

Procedimiento para obtener el SDT del usuario web

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

Regras:
parm( out:&UsrLogin);

// Guarda-se a XML do SDT na cookie "SESSION"

&Session.FromXml(getCookie("SESSION))

Aqui mostramos um uso muito simples das funções para o manejo de XML com SDT, mas existem diversos usos para estas, já seja para importar\exportar dados de nossos sistemas como para trabalhar com pequenas bases de dados auxiliares neste formato.

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

GxOpen Task Force (*)
Para os que não nos conhecem, a GxOpen Task Force é um grupo de pessoas dedicadas -> comunidade GeneXus. Mantemos o site
www.gxopen.com, entre outras atividades e estamos realizando alguns projetos de código aberto para exemplificar ao máximo o uso da ferramenta.

e-mail: info@gxopen.com
GxOpen TaskForce

We believe in GeneXus