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