3. 228
O editor de tipos de dados estruturados é similar ao editor de transações.
Contem:
Propriedade Name, com o nome que identifica ao membro, subestrutura ou coleção.
Propriedade Type, na qual se deve selecionar um tipo de dados simples, um domínio, ou um tipo de dados
estruturado que já tenha sido definido na KB (propriedade Type somente adquire valor se estiver definindo um
membro e não uma subestrutura ou coleção).
Propriedade Is Collection, para indicar se o membro representa uma lista (em seguida veremos um exemplo).
Observe que uma subestrutura é um membro composto, ao invés de ser um simples. Em particular ele também
é um tipo de dados estruturado.
Fazendo botão direito sobre um membro da estrutura, se mostra a janela que se vê a esquerda, onde se pode
inserir outro membro, ou uma subestrutura.
Tip: Se desejar criar um SDT com exatamente a mesma estrutura que a de uma transação, então ao invés de
definir um a um todos os membros, subestruturas e coleções, basta arrastar (fazer Drag & Drop) o nome da
transação desde o Folder View para a estrutura em edição do SDT.
Da mesma forma, se desejar que um membro da estrutura corresponda a um atributo, pode selecionar e
arrastar o atributo desde o Work With Attributes (janela editável da opção View do menu de GeneXus) ou
inserir com o diálogo Insert/Attribute do menu de GeneXus.
4. 229
Marcando o check box Is Collection se abrirá um ramo da estrutura como se poder, onde é pedido dois nomes:
o da coleção em si, e o de cada item da mesma.
Como veremos em seguida, quando se define uma coleção, junto com o SDT se estará criando implicitamente
outro, que corresponderá aos itens da coleção.
É feito dessa maneira para depois se definir uma variável do tipo de dados do item e depois agregá-la para a
coleção.
5. 230
A direita pode se ver o diálogo de propriedades de uma variável &country que se está definindo dentro de
algum objeto.
O SDT Country definido na KB tal como se aprecia na página anterior, da lugar a criação de dois outros
correspondentes aos itens da coleção “country.City”. Este último é devido ao caso de poder querer definir uma
variável somente desse tipo de dados, para depois agregá-la com o método Add que já mencionaremos, na
coleção.
Observe que a variável &country foi definida do tipo de dados “country” que aparece na lista obtida ao fazer
clique no combo box da propriedade “Data Type” do diálogo de definição de propriedades da variável.
7. 232
Aqui se apresenta um exemplo com o qual continuaremos trabalhando. Agregamos a nossa realidade uma
transação de recibos. Vamos supor que uma vez no mês, se lança um processo de faturamento, se escolhe
período de faturamento (usualmente todo o mês anterior) se contabilizam todas as faturas efetuadas por
cliente, e se gera um recibo para o mesmo (autonumber). A geração do recibo será automática (será realizada
pelo nosso sistema); esse é um tema que veremos em breve.
Por agora, vamos supor que necessitamos um procedimento que devolva os dados de um recibo dado (por
exemplo, o de id. 7). Uma opção é acessar mediante um for each a tabela BILL criada a partir da transação
com o mesmo nome, e junto com a regra parm:
parm( out: BillDate, out: CustomerId, out: CustomerName, out: BillInvoicePeriodStartDate, out:
BillInvoicePeriodEndDate, out: BillAmount);
implementar o pedido.
A outra opção, é devolver toda essa informação em somente uma variável estruturada!
parm( out: &bill);
carregada como se mostra acima. Para isso se define um SDT baseado na transação Bill (os SDTs não podem
ter o mesmo nome que uma transação, razão pela qual a chamamos BILL_SDT). Para não ter que ingressar
um por um os membros do SDT com o mesmo nome que os atributos da transação, basta arrastar a transação
Bill desde o Folder View, dentro da estrutura do SDT e automaticamente se inicializará como se mostra acima.
8. 233
Vamos supor que queremos devolver uma lista de recibos (por exemplo, os que foram efetuados numa faixa de
datas dado).
9. 234
Tem que pedir novo espaço de memória para a variável &bill, para a seguinte iteração.
Como veremos em breve, existe um modo muito mais simples, de nível mais alto, DECLARATIVO, de obter a
coleção de SDTs carregada, sem ter que nos preocuparmos em realizar as operações de baixo nível, como
agregar uma variável na coleção e pedir memória...
10. 235
...este modo declarativo, portanto de alto nível, de carregar uma coleção de SDTs se conhece com o nome de
Data Provider. Podemos pensá-lo como um procedimento especializado, que devolverá sempre informação
estruturada (seja simples ou como coleção).
Aqui apresentamos o exemplo, que depois ampliaremos quando entrarmos de fato neste tema.
12. 237
A variável &var vai tomando os valores de cada posição da lista.
Não é possível obter a posição do item durante percorrê-la, para isto é necessário definir uma variável que atue
como contador.
Como pode ser facilmente inferido, este comando é válido para coleções de qualquer tipo de dados, não
somente SDTs.
14. 239
Aqui se apresentam a maioria dos métodos de tipos de dados estruturados.
Alguns se aplicam a variáveis SDT não coleção, se representam com &var, outros a coleções, se representam
com &cVar.
Para a lista completa, assim como exemplos, acessar ao wiki ou ao help da versão.
16. 241
Pode selecionar-se do SDT os membros que se querem carregar como colunas do grid. Observe que em
nosso caso omitimos os membros CustomerId, BillInvoicePeriodStartDate e BillInvoicePeriodEndDate.