Cursos GeneXus - Carregando os tipos de dados estruturados Em mais de uma oportunidade, precisamos armazenar na memória uma lista de elementos que contem o mesmo tipo de informação, mas diferentes valores guardados. Por exemplo, a agência de viagens pode precisar fazer operações com um grupo de clientes que cumpram determinado requisito Ou podem solicitar-nos processar informações de alguns dados específicos de um conjunto de atrações turísticas E isso pode implicar ter que carregar estas listas temporariamente na memória
Para resolver este tipo de requisito, é necessário criar uma estrutura na memória capaz de armazenar uma coleção de elementos. Já vimos que os tipos de dados estruturados permitem-nos definir estruturas que armazenam vários dados correspondentes a um elemento Por exemplo quando armazenamos o identificador, o nome o endereço de um cliente
Para armazenar vários elementos com dados de clientes, vimos que é necessário definir um tipo de dados estruturado
E marcar que se trata de uma coleção Vamos fazê-lo em GeneXus
Selecionamos o tipo de dados estruturado SDTCustomer que havíamos criado, pressionamos o botão direito do mouse, escolhemos Save as E damos a ele o nome SDTCustomers
Agora, clicamos em checkbox Is Collection : Se comparamos a estrutura do SDTCustomer e o SDTCustomers vemos que este último
Tem os mesmos membros que o anterior, mas agrupados em uma subestrutura denominada SDTCustomersItem Essa subestrutura foi criada automaticamente quando marcamos que se trata de uma coleção
Cada item armazenará os dados de um cliente E a coleção, o conjunto de clientes
Para carregar os dados da coleção vamos utilizar um objeto Data Privider Este objeto permite-nos carregar uma estrutura de dados
(por exemplo, a partir de dados do banco de dados) E nos devolve tal estrutura já carregada
Vamos criar um objeto Data Provider em GeneXus. Pressionamos Ctrl N, escolhemos o tipo Data Provider e damos nome ao objeto: DataProviderCustomers
Vemos que GeneXus nos posiciona na seção Source do Data Provider Aqui é onde vamos declarar como queremos que sejam carregados os dados na coleção que queremos devolver. Observemos como é fácil declarar o carregamento: Vamos à janela do Knowledge Base Navigator, localizamos o tipo de dados estruturado SDTCustomers e o arrastamos até o Source do Data Provider
Vemos que GeneXus escreveu automaticamente varias linhas de texto. Se abrimos as propriedades do DataProvider, Observamos que GeneXus atribuiu o nome da coleção SDTCustomers à propriedade Output
Isso significa que o DataProvider devolverá uma coleção do tipo de dados estruturado SDTCustomers, carregada com dados. Como o SDTCustomers já é uma coleção, não é necessário configurar a propriedade Collection com valor True Isso é o que faríamos se quiséssemos que o DataProvider nos devolva uma coleção a partir de um tipo de dados estruturado simples. Estudemos agora o que foi que GeneXus escreveu no source Reconhecemos o nome do tipo de dados estruturado SDTCustomers que é uma coleção
E depois, entre chaves, está a subestrutura do item da coleção Comparemos isso à estrutura do SDT: Vemos que GeneXus representou em forma de texto a estrutura do SDTCustomers
E nos deixou prontos os membros Id, Name e Address Do item SDTCustomersItem, para carregar-lhes um valor. Como vamos carregar esta condição a partir do conteúdo da tabela CUSTOMER, atribuímos ao membro Id o valor do atributo CustomerId
Ao membro Name, o valor do atributo CustomerName E ao membro Address o valor do atributo CustomerAddress. Observemos que em nenhum lugar estamos indicando a GeneXus como queremos que se carreguem estes valores, ou seja, que se deveria navegar pela tablea CUSTOMER e que para cada cliente encontrado, deve copiar seus dados a um item da coleção. O que estamos fazendo é simplesmente declarar quais valores queremos que GeneXus carregue na coleção de clientes, a partir dos valores dos atributos definidos na transação de clientes. A partir desta declaração, ao encontrar atributos do lado direito das atribuições
GeneXus trata de encontrar a tabela base que contém estes atributos de forma simular a como foi determinada a tabela base de um For Each. Neste caso, a tabela base é claramente CUSTOMER Como estamos atribuindo valores a um item da estrutura do tipo coleção, GeneXus recorre à tabela CUSTOMER e para cada cliente encontrado, copia os dados armazenados nos atributos Customer Id, CustomerName e CustomerAddress Até os membros Id, Name e Address de um novo item da coleção
O resultado final é que teriam ficado armazenados na coleção os dados de todos os clientes do banco de dados. Criaremos agora um objeto Web Panel para visualizar o conteúdo da coleção de clientes. Uma web panel é um objeto muito versátil que nos permite, entre outras coisas, mostrar informação, registrar dados ou construir uma tela de início do nosso aplicativo. Pressionamos Ctrl N, selecionamos o tipo de objeto web panel e colocamos nele o nome WebPanelViewCustomers. Agora vamos à seção de variáveis da web panel e definimos uma variável &Customers do tipo SDTCustomers Vamos à seção Web Form e, a partir da ToolBox, arrastamos um controle de atributo ou variável
E escolhemos a variável Customers Por tratar-se de uma variável do tipo SDT coleção, GeneXus abre-nos um quadro de diálogo para selecionar quais membros do SDTCustomer queremos ver. Estão todos selecionados e como queremos ver todos, pressionamos OK.
Observamos que GeneXus criou no Web Form uma série de controles para visualizar os diferentes elementos da variável &Customers. Agora vamos à seção Events da web panel e no combo box acima, à direita, nos são oferecidos vários nomes de eventos e escolhemos Start
Ao selecioná-lo, GeneXus escreve os comandos de início ao fim do evento Start Vamos codificar o evento start. Escrevemoss & e escolhemos a variável Customers. Agora, vamos carregar esta variável do tipo coleção, usando o DataProvider que criamos antes. Para isso, escrevemos o símbolo de igual e logo vamos à janela Knowledge Base Navigator, localizamos o DataProvider Customers e arrastamos até direita do símbolo de igual.
Completamos a instrução adicionando parênteses: Com esta instrução que escrevemos, estamos invocando o DataProviderCustomers, e este retornará uma coleção de clientes, que ficará carregada na variável &Customers. Lembremos que a variável &Customers é do tipo SDTCustomers E no Data Provider É carregada e devolve uma coleção de tipo do momento que arrastamos SDTCustomer a seu Source. Agora, dado que já temos definido o evento start da web panel, que carrega a variável &customers
invocando o Data Provider que definimos e como já incluímos a variável &Customers no Form está tudo pronto para que pressionemos F5 e possamos ver os dados carregados na coleção.
Vemos que GeneXus adicionou um link correspondente ao Web Panel View Customers Clicamos no link... E vemos exibidos na tela todos os clientes que estavam armazenados no banco de dados. Estes dados foram extraídos do banco de dados pelo Data Provider, carregados na memória temporária em uma variável de tipo SDT coleção e seu conteúdo foi exibido no form do web panel.
Em vez de simplesmente exibir os dados, ao estar disponíveis na memória, poderíamos ter realizado algum processo ou operações sobre os eles, sem necessidade de ter que acessar outra vez o banco de dados para obtê-los. Vimos a flexibilidade e potência dos Data Providers para carregar dados em uma estrutura de dados, em particular uma do tipo coleção e o simples que foi declarar que queríamos carregar, resolvendo GeneXus tudo o que for necessário para fazê-lo acontecer. Mais para frente, veremos outros exemplos de uso dos Data Providers.